summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.clang-format1
-rw-r--r--COPYRIGHT.txt29
-rw-r--r--DONORS.md83
-rw-r--r--core/array.cpp72
-rw-r--r--core/array.h3
-rw-r--r--core/bind/core_bind.cpp5
-rw-r--r--core/color.h14
-rw-r--r--core/debugger/remote_debugger.cpp35
-rw-r--r--core/debugger/remote_debugger.h11
-rw-r--r--core/input/input.cpp2
-rw-r--r--core/input/input_event.cpp2
-rw-r--r--core/io/logger.cpp11
-rw-r--r--core/math/aabb.h28
-rw-r--r--core/math/audio_frame.h2
-rw-r--r--core/math/geometry.cpp43
-rw-r--r--core/math/geometry.h6
-rw-r--r--core/math/octree.h18
-rw-r--r--core/math/transform.cpp4
-rw-r--r--core/math/transform_2d.cpp18
-rw-r--r--core/math/transform_2d.h11
-rw-r--r--core/math/triangle_mesh.cpp8
-rw-r--r--core/math/triangle_mesh.h4
-rw-r--r--core/math/vector2.h15
-rw-r--r--core/math/vector3.h4
-rw-r--r--core/os/os.h2
-rw-r--r--core/project_settings.cpp35
-rw-r--r--core/variant.cpp5
-rw-r--r--core/variant.h9
-rw-r--r--core/variant_call.cpp21
-rw-r--r--core/variant_op.cpp16
-rw-r--r--doc/classes/@GlobalScope.xml7
-rw-r--r--doc/classes/AnimatedTexture.xml2
-rw-r--r--doc/classes/BaseMaterial3D.xml2
-rw-r--r--doc/classes/CPUParticles2D.xml1
-rw-r--r--doc/classes/Camera3D.xml7
-rw-r--r--doc/classes/Color.xml40
-rw-r--r--doc/classes/GPUParticles2D.xml1
-rw-r--r--doc/classes/Generic6DOFJoint3D.xml12
-rw-r--r--doc/classes/Image.xml2
-rw-r--r--doc/classes/KinematicBody3D.xml2
-rw-r--r--doc/classes/MeshInstance2D.xml1
-rw-r--r--doc/classes/MultiMeshInstance2D.xml1
-rw-r--r--doc/classes/Node2D.xml4
-rw-r--r--doc/classes/Node3D.xml2
-rw-r--r--doc/classes/OS.xml1
-rw-r--r--doc/classes/Polygon2D.xml2
-rw-r--r--doc/classes/ProjectSettings.xml7
-rw-r--r--doc/classes/RenderingServer.xml2
-rw-r--r--doc/classes/SpinBox.xml2
-rw-r--r--doc/classes/Sprite2D.xml1
-rw-r--r--doc/classes/StyleBoxTexture.xml1
-rw-r--r--doc/classes/TextEdit.xml11
-rw-r--r--doc/classes/TileSet.xml1
-rw-r--r--doc/classes/Tween.xml2
-rw-r--r--doc/classes/Vector2.xml2
-rw-r--r--doc/classes/Vector3.xml2
-rw-r--r--doc/classes/Viewport.xml22
-rw-r--r--doc/classes/VisualShaderNodeUniform.xml8
-rw-r--r--doc/translations/classes.pot7387
-rw-r--r--doc/translations/fr.po7393
-rw-r--r--drivers/gles2/rasterizer_gles2.cpp5
-rw-r--r--editor/animation_bezier_editor.cpp6
-rw-r--r--editor/animation_track_editor_plugins.cpp4
-rw-r--r--editor/debugger/editor_profiler.cpp2
-rw-r--r--editor/debugger/editor_visual_profiler.cpp2
-rw-r--r--editor/debugger/script_editor_debugger.cpp30
-rw-r--r--editor/editor_help.cpp14
-rw-r--r--editor/editor_inspector.cpp26
-rw-r--r--editor/editor_node.cpp2
-rw-r--r--editor/editor_spin_slider.cpp17
-rw-r--r--editor/editor_themes.cpp50
-rw-r--r--editor/node_3d_editor_gizmos.cpp11
-rw-r--r--editor/plugins/animation_state_machine_editor.cpp2
-rw-r--r--editor/plugins/canvas_item_editor_plugin.cpp14
-rw-r--r--editor/plugins/material_editor_plugin.cpp6
-rw-r--r--editor/plugins/mesh_editor_plugin.cpp6
-rw-r--r--editor/plugins/node_3d_editor_plugin.cpp51
-rw-r--r--editor/plugins/script_editor_plugin.cpp4
-rw-r--r--editor/plugins/script_text_editor.cpp37
-rw-r--r--editor/plugins/script_text_editor.h2
-rw-r--r--editor/plugins/sprite_frames_editor_plugin.cpp11
-rw-r--r--editor/plugins/visual_shader_editor_plugin.cpp17
-rw-r--r--editor/rename_dialog.cpp2
-rw-r--r--editor/scene_tree_dock.cpp13
-rw-r--r--editor/translations/ar.po597
-rw-r--r--editor/translations/bn.po9
-rw-r--r--editor/translations/de.po15
-rw-r--r--editor/translations/eo.po27
-rw-r--r--editor/translations/es.po92
-rw-r--r--editor/translations/es_AR.po28
-rw-r--r--editor/translations/fi.po19
-rw-r--r--editor/translations/fr.po54
-rw-r--r--editor/translations/he.po50
-rw-r--r--editor/translations/hu.po1
-rw-r--r--editor/translations/it.po17
-rw-r--r--editor/translations/ja.po111
-rw-r--r--editor/translations/ko.po16
-rw-r--r--editor/translations/mr.po20
-rw-r--r--editor/translations/nl.po55
-rw-r--r--editor/translations/pl.po11
-rw-r--r--editor/translations/pt_BR.po33
-rw-r--r--editor/translations/pt_PT.po41
-rw-r--r--editor/translations/ru.po17
-rw-r--r--editor/translations/sk.po26
-rw-r--r--editor/translations/uk.po10
-rw-r--r--editor/translations/zh_CN.po17
-rw-r--r--editor/translations/zh_HK.po587
-rw-r--r--main/main.cpp12
-rw-r--r--misc/dist/linux/org.godotengine.Godot.desktop1
-rw-r--r--modules/csg/csg.cpp2
-rw-r--r--modules/csg/csg_shape.cpp4
-rw-r--r--modules/gdnative/gdnative/color.cpp4
-rw-r--r--modules/gdnative/gdnative/vector2.cpp4
-rw-r--r--modules/gdnative/gdnative/vector3.cpp4
-rw-r--r--modules/gdnative/gdnative_api.json6
-rw-r--r--modules/gdnative/include/gdnative/color.h2
-rw-r--r--modules/gdnative/include/gdnative/vector2.h2
-rw-r--r--modules/gdnative/include/gdnative/vector3.h2
-rw-r--r--modules/gdscript/doc_classes/@GDScript.xml2
-rw-r--r--modules/gdscript/gdscript.cpp19
-rw-r--r--modules/gdscript/gdscript_editor.cpp12
-rw-r--r--modules/gdscript/gdscript_function.cpp30
-rw-r--r--modules/gdscript/gdscript_function.h6
-rw-r--r--modules/gdscript/gdscript_functions.cpp9
-rw-r--r--modules/gdscript/gdscript_parser.cpp32
-rw-r--r--modules/gridmap/grid_map.cpp14
-rw-r--r--modules/gridmap/grid_map_editor_plugin.cpp12
-rw-r--r--modules/mono/glue/GodotSharp/GodotSharp/Core/Color.cs38
-rw-r--r--modules/mono/glue/GodotSharp/GodotSharp/Core/Rect2.cs2
-rw-r--r--modules/mono/glue/GodotSharp/GodotSharp/Core/Rect2i.cs2
-rw-r--r--modules/mono/glue/GodotSharp/GodotSharp/Core/Transform.cs4
-rw-r--r--modules/mono/glue/GodotSharp/GodotSharp/Core/Transform2D.cs6
-rw-r--r--modules/mono/glue/GodotSharp/GodotSharp/Core/Vector2.cs20
-rw-r--r--modules/mono/glue/GodotSharp/GodotSharp/Core/Vector3.cs18
-rw-r--r--modules/mono/utils/string_utils.cpp10
-rw-r--r--modules/tinyexr/SCsub3
-rw-r--r--platform/android/java/lib/src/org/godotengine/godot/Godot.java15
-rw-r--r--platform/android/java/lib/src/org/godotengine/godot/GodotDownloaderAlarmReceiver.java1
-rw-r--r--platform/android/java/lib/src/org/godotengine/godot/GodotDownloaderService.java1
-rw-r--r--platform/android/java/lib/src/org/godotengine/godot/GodotGLRenderView.java16
-rw-r--r--platform/android/java/lib/src/org/godotengine/godot/GodotIO.java6
-rw-r--r--platform/android/java/lib/src/org/godotengine/godot/GodotLib.java1
-rw-r--r--platform/android/java/lib/src/org/godotengine/godot/GodotRenderer.java8
-rw-r--r--platform/android/java/lib/src/org/godotengine/godot/GodotVulkanRenderView.java9
-rw-r--r--platform/android/java/lib/src/org/godotengine/godot/input/GodotEditText.java5
-rw-r--r--platform/android/java/lib/src/org/godotengine/godot/input/GodotGestureHandler.java5
-rw-r--r--platform/android/java/lib/src/org/godotengine/godot/input/GodotInputHandler.java8
-rw-r--r--platform/android/java/lib/src/org/godotengine/godot/input/GodotTextInputWrapper.java4
-rw-r--r--platform/android/java/lib/src/org/godotengine/godot/input/InputManagerV16.java1
-rw-r--r--platform/android/java/lib/src/org/godotengine/godot/input/Joystick.java1
-rw-r--r--platform/android/java/lib/src/org/godotengine/godot/plugin/GodotPlugin.java7
-rw-r--r--platform/android/java/lib/src/org/godotengine/godot/plugin/GodotPluginRegistry.java4
-rw-r--r--platform/android/java/lib/src/org/godotengine/godot/plugin/SignalInfo.java1
-rw-r--r--platform/android/java/lib/src/org/godotengine/godot/utils/GLUtils.java1
-rw-r--r--platform/android/java/lib/src/org/godotengine/godot/utils/GodotNetUtils.java3
-rw-r--r--platform/android/java/lib/src/org/godotengine/godot/utils/PermissionsUtil.java15
-rw-r--r--platform/android/java/lib/src/org/godotengine/godot/xr/ovr/OvrConfigChooser.java1
-rw-r--r--platform/android/java/lib/src/org/godotengine/godot/xr/ovr/OvrContextFactory.java1
-rw-r--r--platform/android/java/lib/src/org/godotengine/godot/xr/ovr/OvrWindowSurfaceFactory.java1
-rw-r--r--platform/android/java/lib/src/org/godotengine/godot/xr/regular/RegularConfigChooser.java4
-rw-r--r--platform/android/java/lib/src/org/godotengine/godot/xr/regular/RegularContextFactory.java6
-rw-r--r--platform/android/java/lib/src/org/godotengine/godot/xr/regular/RegularFallbackConfigChooser.java4
-rw-r--r--platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/ConsumeTask.java2
-rw-r--r--platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/GodotPayment.java11
-rw-r--r--platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/HandlePurchaseTask.java1
-rw-r--r--platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/PaymentsManager.java3
-rw-r--r--platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/PurchaseTask.java1
-rw-r--r--platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/ReleaseAllConsumablesTask.java3
-rw-r--r--platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/ValidateTask.java7
-rw-r--r--platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/utils/CustomSSLSocketFactory.java2
-rw-r--r--platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/utils/HttpRequester.java5
-rw-r--r--platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/utils/RequestParams.java1
-rw-r--r--platform/javascript/os_javascript.cpp2
-rw-r--r--platform/linuxbsd/display_server_x11.cpp94
-rw-r--r--platform/linuxbsd/display_server_x11.h5
-rw-r--r--platform/windows/display_server_windows.cpp139
-rw-r--r--platform/windows/display_server_windows.h120
-rw-r--r--scene/2d/navigation_region_2d.cpp2
-rw-r--r--scene/2d/navigation_region_2d.h2
-rw-r--r--scene/2d/node_2d.cpp42
-rw-r--r--scene/2d/node_2d.h5
-rw-r--r--scene/2d/tile_map.cpp7
-rw-r--r--scene/3d/audio_stream_player_3d.cpp17
-rw-r--r--scene/3d/camera_3d.cpp12
-rw-r--r--scene/3d/collision_object_3d.cpp2
-rw-r--r--scene/3d/cpu_particles_3d.cpp1
-rw-r--r--scene/3d/node_3d.cpp6
-rw-r--r--scene/3d/node_3d.h2
-rw-r--r--scene/3d/physics_joint_3d.cpp6
-rw-r--r--scene/3d/ray_cast_3d.cpp2
-rw-r--r--scene/3d/skeleton_ik_3d.cpp12
-rw-r--r--scene/3d/soft_body_3d.cpp2
-rw-r--r--scene/3d/spring_arm_3d.cpp4
-rw-r--r--scene/3d/visibility_notifier_3d.cpp8
-rw-r--r--scene/3d/visual_instance_3d.cpp4
-rw-r--r--scene/3d/world_environment.cpp50
-rw-r--r--scene/animation/animation_player.cpp8
-rw-r--r--scene/animation/animation_tree.cpp4
-rw-r--r--scene/animation/tween.cpp10
-rw-r--r--scene/gui/control.cpp2
-rw-r--r--scene/gui/gradient_edit.cpp2
-rw-r--r--scene/gui/graph_edit.cpp6
-rw-r--r--scene/gui/popup_menu.cpp6
-rw-r--r--scene/gui/popup_menu.h1
-rw-r--r--scene/gui/rich_text_label.cpp59
-rw-r--r--scene/gui/text_edit.cpp10
-rw-r--r--scene/gui/text_edit.h1
-rw-r--r--scene/gui/tree.cpp3
-rw-r--r--scene/main/scene_tree.cpp10
-rw-r--r--scene/main/viewport.cpp110
-rw-r--r--scene/main/viewport.h16
-rw-r--r--scene/resources/animation.cpp4
-rw-r--r--scene/resources/curve.cpp4
-rw-r--r--scene/resources/gradient.h2
-rw-r--r--scene/resources/visual_shader.cpp45
-rw-r--r--scene/resources/visual_shader.h17
-rw-r--r--scene/resources/visual_shader_nodes.cpp66
-rw-r--r--scene/resources/visual_shader_nodes.h14
-rw-r--r--servers/register_server_types.cpp1
-rw-r--r--servers/rendering/rasterizer_rd/rasterizer_rd.cpp6
-rw-r--r--servers/rendering/rasterizer_rd/rasterizer_scene_high_end_rd.cpp22
-rw-r--r--servers/rendering/rendering_server_scene.cpp19
-rw-r--r--servers/rendering/rendering_server_scene.h2
-rw-r--r--servers/rendering_server.cpp3
-rw-r--r--thirdparty/README.md105
-rw-r--r--thirdparty/enet/LICENSE2
-rw-r--r--thirdparty/enet/enet/enet.h11
-rw-r--r--thirdparty/enet/enet/utility.h1
-rw-r--r--thirdparty/enet/patches/dtls_support.patch13
-rw-r--r--thirdparty/enet/peer.c27
-rw-r--r--thirdparty/enet/protocol.c56
-rw-r--r--thirdparty/jpeg-compressor/jpgd.cpp16
-rw-r--r--thirdparty/jpeg-compressor/patches/fix-msvc-sse2-detection.patch44
-rw-r--r--thirdparty/misc/curl_hostcheck.c217
-rw-r--r--thirdparty/misc/curl_hostcheck.h39
-rw-r--r--thirdparty/misc/fastlz.c796
-rw-r--r--thirdparty/misc/fastlz.h60
-rw-r--r--thirdparty/misc/stb_vorbis.c219
-rw-r--r--thirdparty/pcre2/src/config.h6
-rw-r--r--thirdparty/pcre2/src/pcre2.h19
-rw-r--r--thirdparty/pcre2/src/pcre2_auto_possess.c7
-rw-r--r--thirdparty/pcre2/src/pcre2_compile.c535
-rw-r--r--thirdparty/pcre2/src/pcre2_context.c2
-rw-r--r--thirdparty/pcre2/src/pcre2_dfa_match.c129
-rw-r--r--thirdparty/pcre2/src/pcre2_error.c3
-rw-r--r--thirdparty/pcre2/src/pcre2_internal.h105
-rw-r--r--thirdparty/pcre2/src/pcre2_intmodedep.h10
-rw-r--r--thirdparty/pcre2/src/pcre2_jit_compile.c1857
-rw-r--r--thirdparty/pcre2/src/pcre2_jit_match.c1
-rw-r--r--thirdparty/pcre2/src/pcre2_jit_neon_inc.h321
-rw-r--r--thirdparty/pcre2/src/pcre2_jit_simd_inc.h993
-rw-r--r--thirdparty/pcre2/src/pcre2_maketables.c11
-rw-r--r--thirdparty/pcre2/src/pcre2_match.c603
-rw-r--r--thirdparty/pcre2/src/pcre2_match_data.c15
-rw-r--r--thirdparty/pcre2/src/pcre2_study.c306
-rw-r--r--thirdparty/pcre2/src/pcre2_tables.c316
-rw-r--r--thirdparty/pcre2/src/pcre2_ucd.c5623
-rw-r--r--thirdparty/pcre2/src/pcre2_ucp.h7
-rw-r--r--thirdparty/pcre2/src/sljit/sljitConfigInternal.h4
-rw-r--r--thirdparty/pcre2/src/sljit/sljitExecAllocator.c28
-rw-r--r--thirdparty/pcre2/src/sljit/sljitLir.c69
-rw-r--r--thirdparty/pcre2/src/sljit/sljitLir.h22
-rw-r--r--thirdparty/pcre2/src/sljit/sljitNativeARM_32.c126
-rw-r--r--thirdparty/pcre2/src/sljit/sljitNativeARM_64.c111
-rw-r--r--thirdparty/pcre2/src/sljit/sljitNativeARM_T2_32.c76
-rw-r--r--thirdparty/pcre2/src/sljit/sljitNativeMIPS_32.c2
-rw-r--r--thirdparty/pcre2/src/sljit/sljitNativeMIPS_common.c155
-rw-r--r--thirdparty/pcre2/src/sljit/sljitNativePPC_32.c2
-rw-r--r--thirdparty/pcre2/src/sljit/sljitNativePPC_64.c3
-rw-r--r--thirdparty/pcre2/src/sljit/sljitNativePPC_common.c214
-rw-r--r--thirdparty/pcre2/src/sljit/sljitNativeSPARC_32.c2
-rw-r--r--thirdparty/pcre2/src/sljit/sljitNativeSPARC_common.c102
-rw-r--r--thirdparty/pcre2/src/sljit/sljitNativeX86_32.c4
-rw-r--r--thirdparty/pcre2/src/sljit/sljitNativeX86_64.c54
-rw-r--r--thirdparty/pcre2/src/sljit/sljitNativeX86_common.c125
-rw-r--r--thirdparty/pcre2/src/sljit/sljitUtils.c6
-rw-r--r--thirdparty/recastnavigation/Recast/Include/Recast.h8
-rw-r--r--thirdparty/recastnavigation/Recast/Include/RecastAlloc.h288
-rw-r--r--thirdparty/recastnavigation/Recast/Source/Recast.cpp165
-rw-r--r--thirdparty/recastnavigation/Recast/Source/RecastAlloc.cpp26
-rw-r--r--thirdparty/recastnavigation/Recast/Source/RecastContour.cpp2
-rw-r--r--thirdparty/recastnavigation/Recast/Source/RecastMeshDetail.cpp12
-rw-r--r--thirdparty/recastnavigation/Recast/Source/RecastRegion.cpp198
-rw-r--r--thirdparty/tinyexr/tinyexr.h588
-rw-r--r--thirdparty/vhacd/0005-fix-scale-calculation.patch20
-rw-r--r--thirdparty/vhacd/inc/vhacdVolume.h4
286 files changed, 19955 insertions, 14014 deletions
diff --git a/.clang-format b/.clang-format
index eba6d586f0..b3f1954545 100644
--- a/.clang-format
+++ b/.clang-format
@@ -124,4 +124,5 @@ ObjCBlockIndentWidth: 4
### Java specific config ###
Language: Java
# BreakAfterJavaFieldAnnotations: false
+JavaImportGroups: ['org.godotengine', 'android', 'androidx', 'com.android', 'com.google', 'java', 'javax']
...
diff --git a/COPYRIGHT.txt b/COPYRIGHT.txt
index cdc59a4596..db85071fa5 100644
--- a/COPYRIGHT.txt
+++ b/COPYRIGHT.txt
@@ -128,7 +128,7 @@ License: Expat
Files: ./thirdparty/enet/
Comment: ENet
-Copyright: 2002-2016, Lee Salzman
+Copyright: 2002-2020, Lee Salzman
License: Expat
Files: ./thirdparty/etc2comp/
@@ -246,12 +246,6 @@ Comment: Clipper
Copyright: 2010-2017, Angus Johnson
License: BSL-1.0
-Files: ./thirdparty/misc/curl_hostcheck.c
- ./thirdparty/misc/curl_hostcheck.h
-Comment: curl
-Copyright: 1998-2012, Daniel Stenberg et al.
-License: curl
-
Files: ./thirdparty/misc/easing_equations.cpp
Comment: Robert Penner's Easing Functions
Copyright: 2001, Robert Penner
@@ -260,7 +254,7 @@ License: BSD-3-clause
Files: ./thirdparty/misc/fastlz.c
./thirdparty/misc/fastlz.h
Comment: FastLZ
-Copyright: 2005-2007, Ariya Hidayat
+Copyright: 2005-2020, Ariya Hidayat
License: Expat
Files: ./thirdparty/misc/hq2x.cpp
@@ -857,25 +851,6 @@ License: CC-BY-3.0
.
Creative Commons may be contacted at http://creativecommons.org/.
-License: curl
- All rights reserved.
- .
- Permission to use, copy, modify, and distribute this software for any purpose
- with or without fee is hereby granted, provided that the above copyright
- notice and this permission notice appear in all copies.
- .
- 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 OF THIRD PARTY RIGHTS. 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.
- .
- Except as contained in this notice, the name of a copyright holder shall not
- be used in advertising or otherwise to promote the sale, use or other dealings
- in this Software without prior written authorization of the copyright holder.
-
License: Expat
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
diff --git a/DONORS.md b/DONORS.md
index f11cb85822..134dc0484b 100644
--- a/DONORS.md
+++ b/DONORS.md
@@ -25,7 +25,6 @@ generous deed immortalized in the next stable release of Godot Engine.
AD Ford
Alan Beauchamp
Anand Mallik
- Andres Hernandez
Andrew Dunai
Brandon Lamb
Christian Baune
@@ -36,7 +35,6 @@ generous deed immortalized in the next stable release of Godot Engine.
Edward Flick
Gamechuck
GameDev.net
- GameDev.tv
Grady
Hein-Pieter van Braam
Jacob McKenney
@@ -60,13 +58,10 @@ generous deed immortalized in the next stable release of Godot Engine.
## Gold donors
- Andrei
- Dave
David Gehrig
David Graham
David Snopek
Ed Morley
- Florian Krick
Florian Rämisch
Jakub Grzesik
Manuele Finocchiaro
@@ -85,11 +80,9 @@ generous deed immortalized in the next stable release of Godot Engine.
David Giardi
Default Name
eggs
- Felix Bohmann
Florian Breisch
Gamejunkey
Javier Roman
- Jay Horton
Jon Woodward
Karl Werf
Keinan Powers
@@ -100,6 +93,7 @@ generous deed immortalized in the next stable release of Godot Engine.
Matthew Hillier
Mohamed Ikbel Boulabiar
Mored4u
+ Rene
Retro Village
Rob Messick
Ryan Badour
@@ -122,15 +116,10 @@ generous deed immortalized in the next stable release of Godot Engine.
Darrian Little
Horváth Péter
Ivan Trombley
- Jakub Dering
Joan Fons
Joshua Flores
- Krzysztof Jankowski
- Lord Bloodhound
- Pascal Grüter
Petr Malac
Rami
- Reneator
Rob
Robert Willes
Ronnie Ashlock
@@ -144,9 +133,9 @@ generous deed immortalized in the next stable release of Godot Engine.
Adam Nakonieczny
Adam Neumann
+ Adrian Demetrescu
Alexander J Maynard
Alexey Dyadchenko
- Alex Z
Andreas Funke
André Frélicot
aoshiwik
@@ -158,50 +147,42 @@ generous deed immortalized in the next stable release of Godot Engine.
Christian Alexander Bjørklund Bøhler
Christian Leth Jeppesen
Christoph Schröder
+ Codee Leaf
Cody Parker
Coldragon
Craig Ostrin
D
- Daniel Eichler
- David White
- Denis Janßen
Easypete
Eric Monson
- ethan ball
Eugenio Hugo Salgüero Jáñez
Fain
flesk
Gary Hulst
gavlig
GGGames.org
- Green Fox
Guilherme Felipe de C. G. da Silva
Halom Vered
Heath Hayes
- Idzard Kwadijk
Isaac Clausman
Jared White
Jeff Nyte
- Jeremy Sims
- Jerry Ling
Joe Flood
John G Gentzel
- Jon Hermansen
Jose Malheiro
Joshua Lesperance
Juan Velandia
Juraj Móza
Kelteseth
+ kickmaniac
kinfox
+ Lain Ballard
Marcelo Dornbusch Lopes
Markus Fehr
Markus Wiesner
Martin Eigel
Matt Eunson
- Max Bulai
m kaersten
MuffinManKen
- Nick Nikitin
Oliver Dick
Oscar Campos
Patrick Ting
@@ -210,9 +191,8 @@ generous deed immortalized in the next stable release of Godot Engine.
Pete Goodwin
pl
Ranoller
- Robert Larnach
+ Rob McInroy
Rocknight Studios
- Romildo Franco
Ryan
Samuel Judd
Scott Pilet
@@ -221,10 +201,8 @@ generous deed immortalized in the next stable release of Godot Engine.
Sindre Sømme
SleepCircle
spilldata
- Steve Hyatt
Stoned Xander
TheLevelOfDetail .
- Thomas Krampl
Thomas Kurz
Tobias Bocanegra
Urho
@@ -237,6 +215,7 @@ generous deed immortalized in the next stable release of Godot Engine.
1D_Inc
Abraham Haskins
+ Acheron
Adam
Adam Brunnmeier
Adam Carr
@@ -247,7 +226,6 @@ generous deed immortalized in the next stable release of Godot Engine.
Adam Smeltzer
Adam Szymański
Adisibio
- Adrian Demetrescu
Agustinus Arya
Aidan O'Flannagain
Aki Mimoto
@@ -279,14 +257,13 @@ generous deed immortalized in the next stable release of Godot Engine.
B A
Balázs Batári
Benedikt
- Ben G
- Ben Phelan
Ben Vercammen
Bernd Jänichen
Bjarne
Black Block
Blair Allen
Bobby CC Wong
+ Bram
brian
bugcaptor
Burney Waring
@@ -294,6 +271,7 @@ generous deed immortalized in the next stable release of Godot Engine.
Carlo Sitaro
Carl van der Geest
Carwyn Edwards
+ Cas Brugman
Cassidy James
Chris Brown
Chris Chapin
@@ -304,17 +282,17 @@ generous deed immortalized in the next stable release of Godot Engine.
Christopher Schmitt
Christoph Woinke
Clay Heaton
+ Cole Johnson
Curt King
Daniel Johnson
Daniel Kimblad
- Daniel Pontillo
+ Daniel Tebbutt
David May
David Woodard
DiCola Jamn
Dominic Cooney
Dominik Wetzel
Donn Eddy
- Donovan Hutcheon
Dragontrapper
Dr Ewan Murray
Duobix
@@ -322,9 +300,9 @@ generous deed immortalized in the next stable release of Godot Engine.
Dylan Todd
Eduardo Teixeira
Edward Herbert
- Edward Moulsdale
Edward Swartz
Egon Elbre
+ Elgenzay
Elias Nykrem
Elmeri '- Duy Kevin Nguyen
Ephemeral
@@ -335,20 +313,21 @@ generous deed immortalized in the next stable release of Godot Engine.
Evan Rose
Fancy Ants Studios
Fekinox
+ Felix Bohmann
Felix Kollmann
Flaredown
Forty Doubleu
+ fox
FuDiggity
Gadzhi Kharkharov
gamedev by Celio
Gary Thomas
George Marques
- GiulianoB
Greg Olson
GREGORY C FEIN
- Greg P
Greyson Richey
Grid
+ Guillaume Audirac
Guldoman
Hal A
Heribert Hirth
@@ -358,6 +337,7 @@ generous deed immortalized in the next stable release of Godot Engine.
Iiari
iKlem
IndustrialRobot
+ Ivan Nikolaev
Jacob
Jaiden Gerig
Jaime Ruiz-Borau Vizárraga
@@ -368,26 +348,26 @@ generous deed immortalized in the next stable release of Godot Engine.
JARKKO PARVIAINEN
Jeff Hungerford
Jennifer Graves
- Jeremy Kahn
Jesse Dubay
Joel Fivat
Joel Höglund
Joel Setterberg
- Johannes Wuensch
John Gabriel
+ John Walker
Jomei Jackson
+ Jonas
Jonas Bernemann
Jonas Rudlang
Jonas Yamazaki
Jonatan R
Jonathan G
- Jonathon
Jon Bonazza
Jon Sully
Jorge Caballero
Jose Aleman
Jose C. Rubio
Joseph Catrambone
+ Josh Mitchell
Juanfran
Judd
Julian Murgia
@@ -395,16 +375,16 @@ generous deed immortalized in the next stable release of Godot Engine.
Justin Hamilton
Justin Spedding
KaDokta
+ Karel Němec
Kauzig
Keedong Park
Keith Bradner
+ Kent Jofur
Kevin McPhillips
- kickmaniac
Kiri Jolly
Kiyohiro Kawamura (kyorohiro)
Kjetil Haugland
Klagsam
- KR McGinley
KsyTek Games
Kuan Cheang
kycho
@@ -415,6 +395,7 @@ generous deed immortalized in the next stable release of Godot Engine.
Lin Chear
Linus Lind Lundgren
Lionel Gaillard
+ Lukáš Rendvanský
Luigi Renna
LunaticInAHat
Lurkars
@@ -429,10 +410,10 @@ generous deed immortalized in the next stable release of Godot Engine.
Mathieu Rimelen
Matt Edwards
Matthew Little
- Matti Pohjanvirta
+ Mauro Pellegrini
+ Max Fiedler
Maxime Blade
Maxwell
- medecau
Megasploot
Melissa Mears
mewin
@@ -447,6 +428,7 @@ generous deed immortalized in the next stable release of Godot Engine.
Mike Cunningham
Mitchell J. Wagner
MoM
+ Mored4u
Nathan Fish
Natrim
nee
@@ -456,9 +438,9 @@ generous deed immortalized in the next stable release of Godot Engine.
Nicholas
Nicholas Girga
Nick Macholl
+ Niclas Eriksen
Nicolás Montaña
Nicolas SAN AGUSTIN
- Nima Farid
NZ
Oleg Reva
Olivier
@@ -471,13 +453,11 @@ generous deed immortalized in the next stable release of Godot Engine.
Paweł Kowal
Pedro Assuncao
Penguin
- Petrus Prinsloo
Philip Cohoe
Point08
Rad Cat
Rafa Laguna
rainerLinux
- Raphael Leroux
Remi Rampin
Rémi Verschelde
Ricardo Alcantara
@@ -485,7 +465,6 @@ generous deed immortalized in the next stable release of Godot Engine.
Richard Ivánek
Robert Farr (Larington)
Robert Hernandez
- Roberto Sánchez
Roger Smith
Roland RzÄ…sa
Roman Tinkov
@@ -493,26 +472,28 @@ generous deed immortalized in the next stable release of Godot Engine.
Ronan
Ryan Groom
Ryan Hentz
- Sam.C
Sam Edson
Samuele Zolfanelli
- Sasori Olkof
Scott D. Yelich
Scott Longley
+ ScottMakesGames
Sebastian Michailidis
Sebastian Vetter
Sergio Mello-Grand
- sgnsajgon
Shane
Shane Sicienski
Shane Spoor
Siim Raidma
+ Simon Jonas Larsen
Simon Wenner
+ Sintinium
SK
smbe19
smo1704
Stefano Caronia
+ Steve Cloete
Svenne Krap
+ Taylor Fahlman
Terry
tezuvholovdr
thomas
@@ -521,10 +502,10 @@ generous deed immortalized in the next stable release of Godot Engine.
Thomas Kelly
Tim Drumheller
Timothy B. MacDonald
- tinyBigGames LLC
Title Plinsut
Tobbun
Tom Glenn
+ Toni Duran
Torgeir Lilleskog
Torsten Crass
Travis O'Brien
diff --git a/core/array.cpp b/core/array.cpp
index cd4e0fb4c8..7c0129ffde 100644
--- a/core/array.cpp
+++ b/core/array.cpp
@@ -285,59 +285,49 @@ Array Array::duplicate(bool p_deep) const {
return new_arr;
}
-int Array::_fix_slice_index(int p_index, int p_arr_len, int p_top_mod) {
- p_index = CLAMP(p_index, -p_arr_len, p_arr_len + p_top_mod);
- if (p_index < 0) {
- p_index = (p_index % p_arr_len + p_arr_len) % p_arr_len; // positive modulo
- }
- return p_index;
-}
+int Array::_clamp_slice_index(int p_index) const {
-int Array::_clamp_index(int p_index) const {
- return CLAMP(p_index, -size() + 1, size() - 1);
+ int arr_size = size();
+ int fixed_index = CLAMP(p_index, -arr_size, arr_size - 1);
+ if (fixed_index < 0) {
+ fixed_index = arr_size + fixed_index;
+ }
+ return fixed_index;
}
-#define ARRAY_GET_DEEP(idx, is_deep) is_deep ? get(idx).duplicate(is_deep) : get(idx)
-
Array Array::slice(int p_begin, int p_end, int p_step, bool p_deep) const { // like python, but inclusive on upper bound
- Array new_arr;
-
- if (empty()) // Don't try to slice empty arrays.
- return new_arr;
- p_begin = Array::_fix_slice_index(p_begin, size(), -1); // can't start out of range
- p_end = Array::_fix_slice_index(p_end, size(), 0);
+ Array new_arr;
- int x = p_begin;
- int new_arr_i = 0;
+ ERR_FAIL_COND_V_MSG(p_step == 0, new_arr, "Array slice step size cannot be zero.");
- ERR_FAIL_COND_V(p_step == 0, new_arr);
- if (Array::_clamp_index(p_begin) == Array::_clamp_index(p_end)) { // don't include element twice
- new_arr.resize(1);
- // new_arr[0] = 1;
- new_arr[0] = ARRAY_GET_DEEP(Array::_clamp_index(p_begin), p_deep);
+ if (empty()) // Don't try to slice empty arrays.
return new_arr;
- } else {
- int element_count = ceil((int)MAX(0, (p_end - p_begin) / p_step)) + 1;
- if (element_count == 1) { // delta going in wrong direction to reach end
- new_arr.resize(0);
+ if (p_step > 0) {
+ if (p_begin >= size() || p_end < -size())
+ return new_arr;
+ } else { // p_step < 0
+ if (p_begin < -size() || p_end >= size())
return new_arr;
- }
- new_arr.resize(element_count);
}
- // if going backwards, have to have a different terminating condition
- if (p_step < 0) {
- while (x >= p_end) {
- new_arr[new_arr_i] = ARRAY_GET_DEEP(Array::_clamp_index(x), p_deep);
- x += p_step;
- new_arr_i += 1;
+ int begin = _clamp_slice_index(p_begin);
+ int end = _clamp_slice_index(p_end);
+
+ int new_arr_size = MAX(((end - begin + p_step) / p_step), 0);
+ new_arr.resize(new_arr_size);
+
+ if (p_step > 0) {
+ int dest_idx = 0;
+ for (int idx = begin; idx <= end; idx += p_step) {
+ ERR_FAIL_COND_V_MSG(dest_idx < 0 || dest_idx >= new_arr_size, Array(), "Bug in Array slice()");
+ new_arr[dest_idx++] = p_deep ? get(idx).duplicate(p_deep) : get(idx);
}
- } else if (p_step > 0) {
- while (x <= p_end) {
- new_arr[new_arr_i] = ARRAY_GET_DEEP(Array::_clamp_index(x), p_deep);
- x += p_step;
- new_arr_i += 1;
+ } else { // p_step < 0
+ int dest_idx = 0;
+ for (int idx = begin; idx >= end; idx += p_step) {
+ ERR_FAIL_COND_V_MSG(dest_idx < 0 || dest_idx >= new_arr_size, Array(), "Bug in Array slice()");
+ new_arr[dest_idx++] = p_deep ? get(idx).duplicate(p_deep) : get(idx);
}
}
diff --git a/core/array.h b/core/array.h
index 2840ce199c..14db57f15f 100644
--- a/core/array.h
+++ b/core/array.h
@@ -44,8 +44,7 @@ class Array {
void _ref(const Array &p_from) const;
void _unref() const;
- int _clamp_index(int p_index) const;
- static int _fix_slice_index(int p_index, int p_arr_len, int p_top_mod);
+ inline int _clamp_slice_index(int p_index) const;
protected:
Array(const Array &p_base, uint32_t p_type, const StringName &p_class_name, const Variant &p_script);
diff --git a/core/bind/core_bind.cpp b/core/bind/core_bind.cpp
index e8955c05df..e2774deb3c 100644
--- a/core/bind/core_bind.cpp
+++ b/core/bind/core_bind.cpp
@@ -237,6 +237,11 @@ String _OS::get_executable_path() const {
Error _OS::shell_open(String p_uri) {
+ if (p_uri.begins_with("res://")) {
+ WARN_PRINT("Attempting to open an URL with the \"res://\" protocol. Use `ProjectSettings.globalize_path()` to convert a Godot-specific path to a system path before opening it with `OS.shell_open()`.");
+ } else if (p_uri.begins_with("user://")) {
+ WARN_PRINT("Attempting to open an URL with the \"user://\" protocol. Use `ProjectSettings.globalize_path()` to convert a Godot-specific path to a system path before opening it with `OS.shell_open()`.");
+ }
return OS::get_singleton()->shell_open(p_uri);
};
diff --git a/core/color.h b/core/color.h
index 16dc721072..8b689fdde1 100644
--- a/core/color.h
+++ b/core/color.h
@@ -97,7 +97,7 @@ struct Color {
Color inverted() const;
Color contrasted() const;
- _FORCE_INLINE_ Color linear_interpolate(const Color &p_b, float p_t) const {
+ _FORCE_INLINE_ Color lerp(const Color &p_b, float p_t) const {
Color res = *this;
@@ -205,7 +205,7 @@ struct Color {
operator String() const;
/**
- * No construct parameters, r=0, g=0, b=0. a=255
+ * No construct parameters, r=0, g=0, b=0. a=1
*/
_FORCE_INLINE_ Color() {
r = 0;
@@ -223,6 +223,16 @@ struct Color {
b = p_b;
a = p_a;
}
+
+ /**
+ * Construct a Color from another Color, but with the specified alpha value.
+ */
+ _FORCE_INLINE_ Color(const Color &p_c, float p_a) {
+ r = p_c.r;
+ g = p_c.g;
+ b = p_c.b;
+ a = p_a;
+ }
};
bool Color::operator<(const Color &p_color) const {
diff --git a/core/debugger/remote_debugger.cpp b/core/debugger/remote_debugger.cpp
index fd109c62b6..97d5c71b6f 100644
--- a/core/debugger/remote_debugger.cpp
+++ b/core/debugger/remote_debugger.cpp
@@ -466,7 +466,7 @@ void RemoteDebugger::_print_handler(void *p_this, const String &p_string, bool p
String s = p_string;
int allowed_chars = MIN(MAX(rd->max_chars_per_second - rd->char_count, 0), s.length());
- if (allowed_chars == 0)
+ if (allowed_chars == 0 && s.length() > 0)
return;
if (allowed_chars < s.length()) {
@@ -480,10 +480,16 @@ void RemoteDebugger::_print_handler(void *p_this, const String &p_string, bool p
if (rd->is_peer_connected()) {
if (overflowed)
s += "[...]";
- rd->output_strings.push_back(s);
+
+ OutputString output_string;
+ output_string.message = s;
+ output_string.type = p_error ? MESSAGE_TYPE_ERROR : MESSAGE_TYPE_LOG;
+ rd->output_strings.push_back(output_string);
if (overflowed) {
- rd->output_strings.push_back("[output overflow, print less text!]");
+ output_string.message = "[output overflow, print less text!]";
+ output_string.type = MESSAGE_TYPE_ERROR;
+ rd->output_strings.push_back(output_string);
}
}
}
@@ -517,15 +523,32 @@ void RemoteDebugger::flush_output() {
if (output_strings.size()) {
// Join output strings so we generate less messages.
+ Vector<String> joined_log_strings;
Vector<String> strings;
- strings.resize(output_strings.size());
- String *w = strings.ptrw();
+ Vector<int> types;
for (int i = 0; i < output_strings.size(); i++) {
- w[i] = output_strings[i];
+ const OutputString &output_string = output_strings[i];
+ if (output_string.type == MESSAGE_TYPE_ERROR) {
+ if (!joined_log_strings.empty()) {
+ strings.push_back(String("\n").join(joined_log_strings));
+ types.push_back(MESSAGE_TYPE_LOG);
+ joined_log_strings.clear();
+ }
+ strings.push_back(output_string.message);
+ types.push_back(MESSAGE_TYPE_ERROR);
+ } else {
+ joined_log_strings.push_back(output_string.message);
+ }
+ }
+
+ if (!joined_log_strings.empty()) {
+ strings.push_back(String("\n").join(joined_log_strings));
+ types.push_back(MESSAGE_TYPE_LOG);
}
Array arr;
arr.push_back(strings);
+ arr.push_back(types);
_put_msg("output", arr);
output_strings.clear();
}
diff --git a/core/debugger/remote_debugger.h b/core/debugger/remote_debugger.h
index f805eec631..cac0bc3730 100644
--- a/core/debugger/remote_debugger.h
+++ b/core/debugger/remote_debugger.h
@@ -40,6 +40,11 @@
#include "core/ustring.h"
class RemoteDebugger : public EngineDebugger {
+public:
+ enum MessageType {
+ MESSAGE_TYPE_LOG,
+ MESSAGE_TYPE_ERROR,
+ };
private:
typedef DebuggerMarshalls::OutputError ErrorMessage;
@@ -57,7 +62,11 @@ private:
Ref<RemoteDebuggerPeer> peer;
- List<String> output_strings;
+ struct OutputString {
+ String message;
+ MessageType type;
+ };
+ List<OutputString> output_strings;
List<ErrorMessage> errors;
int n_messages_dropped = 0;
diff --git a/core/input/input.cpp b/core/input/input.cpp
index 5301f5f4ee..357e4c06c1 100644
--- a/core/input/input.cpp
+++ b/core/input/input.cpp
@@ -175,7 +175,7 @@ void Input::SpeedTrack::update(const Vector2 &p_delta_p) {
accum = accum - slice;
accum_t -= min_ref_frame;
- speed = (slice / min_ref_frame).linear_interpolate(speed, min_ref_frame / max_ref_frame);
+ speed = (slice / min_ref_frame).lerp(speed, min_ref_frame / max_ref_frame);
}
}
diff --git a/core/input/input_event.cpp b/core/input/input_event.cpp
index d18adb1983..4b8c104f39 100644
--- a/core/input/input_event.cpp
+++ b/core/input/input_event.cpp
@@ -708,7 +708,7 @@ String InputEventMouseMotion::as_text() const {
button_mask_string = itos(get_button_mask());
break;
}
- return "InputEventMouseMotion : button_mask=" + button_mask_string + ", position=(" + String(get_position()) + "), relative=(" + String(get_relative()) + "), speed=(" + String(get_speed()) + ")";
+ return "InputEventMouseMotion : button_mask=" + button_mask_string + ", position=(" + String(get_position()) + "), relative=(" + String(get_relative()) + "), speed=(" + String(get_speed()) + "), pressure=(" + rtos(get_pressure()) + "), tilt=(" + String(get_tilt()) + ")";
}
bool InputEventMouseMotion::accumulate(const Ref<InputEvent> &p_event) {
diff --git a/core/io/logger.cpp b/core/io/logger.cpp
index 48aebeda3d..ad0cc81023 100644
--- a/core/io/logger.cpp
+++ b/core/io/logger.cpp
@@ -34,17 +34,6 @@
#include "core/os/os.h"
#include "core/print_string.h"
-// va_copy was defined in the C99, but not in C++ standards before C++11.
-// When you compile C++ without --std=c++<XX> option, compilers still define
-// va_copy, otherwise you have to use the internal version (__va_copy).
-#if !defined(va_copy)
-#if defined(__GNUC__)
-#define va_copy(d, s) __va_copy((d), (s))
-#else
-#define va_copy(d, s) ((d) = (s))
-#endif
-#endif
-
#if defined(MINGW_ENABLED) || defined(_MSC_VER)
#define sprintf sprintf_s
#endif
diff --git a/core/math/aabb.h b/core/math/aabb.h
index eca74e6755..7fdad07c89 100644
--- a/core/math/aabb.h
+++ b/core/math/aabb.h
@@ -76,7 +76,7 @@ public:
bool intersects_ray(const Vector3 &p_from, const Vector3 &p_dir, Vector3 *r_clip = nullptr, Vector3 *r_normal = nullptr) const;
_FORCE_INLINE_ bool smits_intersect_ray(const Vector3 &p_from, const Vector3 &p_dir, real_t t0, real_t t1) const;
- _FORCE_INLINE_ bool intersects_convex_shape(const Plane *p_planes, int p_plane_count) const;
+ _FORCE_INLINE_ bool intersects_convex_shape(const Plane *p_planes, int p_plane_count, const Vector3 *p_points, int p_point_count) const;
_FORCE_INLINE_ bool inside_convex_shape(const Plane *p_planes, int p_plane_count) const;
bool intersects_plane(const Plane &p_plane) const;
@@ -190,7 +190,7 @@ Vector3 AABB::get_endpoint(int p_point) const {
ERR_FAIL_V(Vector3());
}
-bool AABB::intersects_convex_shape(const Plane *p_planes, int p_plane_count) const {
+bool AABB::intersects_convex_shape(const Plane *p_planes, int p_plane_count, const Vector3 *p_points, int p_point_count) const {
Vector3 half_extents = size * 0.5;
Vector3 ofs = position + half_extents;
@@ -206,6 +206,30 @@ bool AABB::intersects_convex_shape(const Plane *p_planes, int p_plane_count) con
return false;
}
+ // Make sure all points in the shape aren't fully separated from the AABB on
+ // each axis.
+ int bad_point_counts_positive[3] = { 0 };
+ int bad_point_counts_negative[3] = { 0 };
+
+ for (int k = 0; k < 3; k++) {
+
+ for (int i = 0; i < p_point_count; i++) {
+ if (p_points[i].coord[k] > ofs.coord[k] + half_extents.coord[k]) {
+ bad_point_counts_positive[k]++;
+ }
+ if (p_points[i].coord[k] < ofs.coord[k] - half_extents.coord[k]) {
+ bad_point_counts_negative[k]++;
+ }
+ }
+
+ if (bad_point_counts_negative[k] == p_point_count) {
+ return false;
+ }
+ if (bad_point_counts_positive[k] == p_point_count) {
+ return false;
+ }
+ }
+
return true;
}
diff --git a/core/math/audio_frame.h b/core/math/audio_frame.h
index e1dbb385e4..4665311059 100644
--- a/core/math/audio_frame.h
+++ b/core/math/audio_frame.h
@@ -104,7 +104,7 @@ struct AudioFrame {
r = ::undenormalise(r);
}
- _FORCE_INLINE_ AudioFrame linear_interpolate(const AudioFrame &p_b, float p_t) const {
+ _FORCE_INLINE_ AudioFrame lerp(const AudioFrame &p_b, float p_t) const {
AudioFrame res = *this;
diff --git a/core/math/geometry.cpp b/core/math/geometry.cpp
index 3e07e9253e..fa96fc4535 100644
--- a/core/math/geometry.cpp
+++ b/core/math/geometry.cpp
@@ -911,7 +911,7 @@ Vector<Plane> Geometry::build_sphere_planes(real_t p_radius, int p_lats, int p_l
for (int j = 1; j <= p_lats; j++) {
// FIXME: This is stupid.
- Vector3 angle = normal.linear_interpolate(axis, j / (real_t)p_lats).normalized();
+ Vector3 angle = normal.lerp(axis, j / (real_t)p_lats).normalized();
Vector3 pos = angle * p_radius;
planes.push_back(Plane(pos, angle));
planes.push_back(Plane(pos * axis_neg, angle * axis_neg));
@@ -943,7 +943,7 @@ Vector<Plane> Geometry::build_capsule_planes(real_t p_radius, real_t p_height, i
for (int j = 1; j <= p_lats; j++) {
- Vector3 angle = normal.linear_interpolate(axis, j / (real_t)p_lats).normalized();
+ Vector3 angle = normal.lerp(axis, j / (real_t)p_lats).normalized();
Vector3 pos = axis * p_height * 0.5 + angle * p_radius;
planes.push_back(Plane(pos, angle));
planes.push_back(Plane(pos * axis_neg, angle * axis_neg));
@@ -1178,3 +1178,42 @@ Vector<Vector<Point2>> Geometry::_polypath_offset(const Vector<Point2> &p_polypa
}
return polypaths;
}
+
+Vector<Vector3> Geometry::compute_convex_mesh_points(const Plane *p_planes, int p_plane_count) {
+
+ Vector<Vector3> points;
+
+ // Iterate through every unique combination of any three planes.
+ for (int i = p_plane_count - 1; i >= 0; i--) {
+ for (int j = i - 1; j >= 0; j--) {
+ for (int k = j - 1; k >= 0; k--) {
+
+ // Find the point where these planes all cross over (if they
+ // do at all).
+ Vector3 convex_shape_point;
+ if (p_planes[i].intersect_3(p_planes[j], p_planes[k], &convex_shape_point)) {
+
+ // See if any *other* plane excludes this point because it's
+ // on the wrong side.
+ bool excluded = false;
+ for (int n = 0; n < p_plane_count; n++) {
+ if (n != i && n != j && n != k) {
+ real_t dp = p_planes[n].normal.dot(convex_shape_point);
+ if (dp - p_planes[n].d > CMP_EPSILON) {
+ excluded = true;
+ break;
+ }
+ }
+ }
+
+ // Only add the point if it passed all tests.
+ if (!excluded) {
+ points.push_back(convex_shape_point);
+ }
+ }
+ }
+ }
+ }
+
+ return points;
+}
diff --git a/core/math/geometry.h b/core/math/geometry.h
index e47d18b056..ea063a8a59 100644
--- a/core/math/geometry.h
+++ b/core/math/geometry.h
@@ -117,8 +117,8 @@ public:
if (mub < 0) mub = 0;
if (mua > 1) mua = 1;
if (mub > 1) mub = 1;
- c1 = p1.linear_interpolate(p2, mua);
- c2 = q1.linear_interpolate(q2, mub);
+ c1 = p1.lerp(p2, mua);
+ c2 = q1.lerp(q2, mub);
}
static real_t get_closest_distance_between_segments(const Vector3 &p_from_a, const Vector3 &p_to_a, const Vector3 &p_from_b, const Vector3 &p_to_b) {
@@ -1014,6 +1014,8 @@ public:
static void make_atlas(const Vector<Size2i> &p_rects, Vector<Point2i> &r_result, Size2i &r_size);
+ static Vector<Vector3> compute_convex_mesh_points(const Plane *p_planes, int p_plane_count);
+
private:
static Vector<Vector<Point2>> _polypaths_do_operation(PolyBooleanOperation p_op, const Vector<Point2> &p_polypath_a, const Vector<Point2> &p_polypath_b, bool is_a_open = false);
static Vector<Vector<Point2>> _polypath_offset(const Vector<Point2> &p_polypath, real_t p_delta, PolyJoinType p_join_type, PolyEndType p_end_type);
diff --git a/core/math/octree.h b/core/math/octree.h
index 5225fbecb4..ffb405bd0f 100644
--- a/core/math/octree.h
+++ b/core/math/octree.h
@@ -34,6 +34,7 @@
#include "core/list.h"
#include "core/map.h"
#include "core/math/aabb.h"
+#include "core/math/geometry.h"
#include "core/math/vector3.h"
#include "core/print_string.h"
#include "core/variant.h"
@@ -341,6 +342,8 @@ private:
const Plane *planes;
int plane_count;
+ const Vector3 *points;
+ int point_count;
T **result_array;
int *result_idx;
int result_max;
@@ -1017,8 +1020,7 @@ void Octree<T, use_pairs, AL>::_cull_convex(Octant *p_octant, _CullConvexData *p
continue;
e->last_pass = pass;
- if (e->aabb.intersects_convex_shape(p_cull->planes, p_cull->plane_count)) {
-
+ if (e->aabb.intersects_convex_shape(p_cull->planes, p_cull->plane_count, p_cull->points, p_cull->point_count)) {
if (*p_cull->result_idx < p_cull->result_max) {
p_cull->result_array[*p_cull->result_idx] = e->userdata;
(*p_cull->result_idx)++;
@@ -1043,7 +1045,7 @@ void Octree<T, use_pairs, AL>::_cull_convex(Octant *p_octant, _CullConvexData *p
continue;
e->last_pass = pass;
- if (e->aabb.intersects_convex_shape(p_cull->planes, p_cull->plane_count)) {
+ if (e->aabb.intersects_convex_shape(p_cull->planes, p_cull->plane_count, p_cull->points, p_cull->point_count)) {
if (*p_cull->result_idx < p_cull->result_max) {
@@ -1059,7 +1061,7 @@ void Octree<T, use_pairs, AL>::_cull_convex(Octant *p_octant, _CullConvexData *p
for (int i = 0; i < 8; i++) {
- if (p_octant->children[i] && p_octant->children[i]->aabb.intersects_convex_shape(p_cull->planes, p_cull->plane_count)) {
+ if (p_octant->children[i] && p_octant->children[i]->aabb.intersects_convex_shape(p_cull->planes, p_cull->plane_count, p_cull->points, p_cull->point_count)) {
_cull_convex(p_octant->children[i], p_cull);
}
}
@@ -1288,7 +1290,11 @@ void Octree<T, use_pairs, AL>::_cull_point(Octant *p_octant, const Vector3 &p_po
template <class T, bool use_pairs, class AL>
int Octree<T, use_pairs, AL>::cull_convex(const Vector<Plane> &p_convex, T **p_result_array, int p_result_max, uint32_t p_mask) {
- if (!root)
+ if (!root || p_convex.size() == 0)
+ return 0;
+
+ Vector<Vector3> convex_points = Geometry::compute_convex_mesh_points(&p_convex[0], p_convex.size());
+ if (convex_points.size() == 0)
return 0;
int result_count = 0;
@@ -1296,6 +1302,8 @@ int Octree<T, use_pairs, AL>::cull_convex(const Vector<Plane> &p_convex, T **p_r
_CullConvexData cdata;
cdata.planes = &p_convex[0];
cdata.plane_count = p_convex.size();
+ cdata.points = &convex_points[0];
+ cdata.point_count = convex_points.size();
cdata.result_array = p_result_array;
cdata.result_max = p_result_max;
cdata.result_idx = &result_count;
diff --git a/core/math/transform.cpp b/core/math/transform.cpp
index 9dad3262d2..82e4005d3e 100644
--- a/core/math/transform.cpp
+++ b/core/math/transform.cpp
@@ -129,8 +129,8 @@ Transform Transform::interpolate_with(const Transform &p_transform, real_t p_c)
Vector3 dst_loc = p_transform.origin;
Transform interp;
- interp.basis.set_quat_scale(src_rot.slerp(dst_rot, p_c).normalized(), src_scale.linear_interpolate(dst_scale, p_c));
- interp.origin = src_loc.linear_interpolate(dst_loc, p_c);
+ interp.basis.set_quat_scale(src_rot.slerp(dst_rot, p_c).normalized(), src_scale.lerp(dst_scale, p_c));
+ interp.origin = src_loc.lerp(dst_loc, p_c);
return interp;
}
diff --git a/core/math/transform_2d.cpp b/core/math/transform_2d.cpp
index f28b664e46..ed95baa233 100644
--- a/core/math/transform_2d.cpp
+++ b/core/math/transform_2d.cpp
@@ -70,6 +70,18 @@ void Transform2D::rotate(real_t p_phi) {
*this = Transform2D(p_phi, Vector2()) * (*this);
}
+real_t Transform2D::get_skew() const {
+
+ real_t det = basis_determinant();
+ return Math::acos(elements[0].normalized().dot(SGN(det) * elements[1].normalized())) - Math_PI * 0.5;
+}
+
+void Transform2D::set_skew(float p_angle) {
+
+ real_t det = basis_determinant();
+ elements[1] = SGN(det) * elements[0].rotated((Math_PI * 0.5 + p_angle)).normalized() * elements[1].length();
+}
+
real_t Transform2D::get_rotation() const {
real_t det = basis_determinant();
Transform2D m = orthonormalized();
@@ -267,7 +279,7 @@ Transform2D Transform2D::interpolate_with(const Transform2D &p_transform, real_t
Vector2 v;
if (dot > 0.9995) {
- v = Vector2::linear_interpolate(v1, v2, p_c).normalized(); //linearly interpolate to avoid numerical precision issues
+ v = v1.lerp(v2, p_c).normalized(); //linearly interpolate to avoid numerical precision issues
} else {
real_t angle = p_c * Math::acos(dot);
Vector2 v3 = (v2 - v1 * dot).normalized();
@@ -275,8 +287,8 @@ Transform2D Transform2D::interpolate_with(const Transform2D &p_transform, real_t
}
//construct matrix
- Transform2D res(Math::atan2(v.y, v.x), Vector2::linear_interpolate(p1, p2, p_c));
- res.scale_basis(Vector2::linear_interpolate(s1, s2, p_c));
+ Transform2D res(Math::atan2(v.y, v.x), p1.lerp(p2, p_c));
+ res.scale_basis(s1.lerp(s2, p_c));
return res;
}
diff --git a/core/math/transform_2d.h b/core/math/transform_2d.h
index fa43762aa4..459ceed7a9 100644
--- a/core/math/transform_2d.h
+++ b/core/math/transform_2d.h
@@ -70,7 +70,10 @@ struct Transform2D {
void set_rotation(real_t p_rot);
real_t get_rotation() const;
+ real_t get_skew() const;
+ void set_skew(float p_angle);
_FORCE_INLINE_ void set_rotation_and_scale(real_t p_rot, const Size2 &p_scale);
+ _FORCE_INLINE_ void set_rotation_scale_and_skew(real_t p_rot, const Size2 &p_scale, float p_skew);
void rotate(real_t p_phi);
void scale(const Size2 &p_scale);
@@ -184,6 +187,14 @@ void Transform2D::set_rotation_and_scale(real_t p_rot, const Size2 &p_scale) {
elements[0][1] = Math::sin(p_rot) * p_scale.x;
}
+void Transform2D::set_rotation_scale_and_skew(real_t p_rot, const Size2 &p_scale, float p_skew) {
+
+ elements[0][0] = Math::cos(p_rot) * p_scale.x;
+ elements[1][1] = Math::cos(p_rot + p_skew) * p_scale.y;
+ elements[1][0] = -Math::sin(p_rot + p_skew) * p_scale.y;
+ elements[0][1] = Math::sin(p_rot) * p_scale.x;
+}
+
Rect2 Transform2D::xform_inv(const Rect2 &p_rect) const {
Vector2 ends[4] = {
diff --git a/core/math/triangle_mesh.cpp b/core/math/triangle_mesh.cpp
index 01d38cf24e..5c66721b9d 100644
--- a/core/math/triangle_mesh.cpp
+++ b/core/math/triangle_mesh.cpp
@@ -502,7 +502,7 @@ bool TriangleMesh::intersect_ray(const Vector3 &p_begin, const Vector3 &p_dir, V
return inters;
}
-bool TriangleMesh::intersect_convex_shape(const Plane *p_planes, int p_plane_count) const {
+bool TriangleMesh::intersect_convex_shape(const Plane *p_planes, int p_plane_count, const Vector3 *p_points, int p_point_count) const {
uint32_t *stack = (uint32_t *)alloca(sizeof(int) * max_depth);
//p_fully_inside = true;
@@ -536,7 +536,7 @@ bool TriangleMesh::intersect_convex_shape(const Plane *p_planes, int p_plane_cou
switch (stack[level] >> VISITED_BIT_SHIFT) {
case TEST_AABB_BIT: {
- bool valid = b.aabb.intersects_convex_shape(p_planes, p_plane_count);
+ bool valid = b.aabb.intersects_convex_shape(p_planes, p_plane_count, p_points, p_point_count);
if (!valid) {
stack[level] = (VISIT_DONE_BIT << VISITED_BIT_SHIFT) | node;
@@ -617,7 +617,7 @@ bool TriangleMesh::intersect_convex_shape(const Plane *p_planes, int p_plane_cou
return false;
}
-bool TriangleMesh::inside_convex_shape(const Plane *p_planes, int p_plane_count, Vector3 p_scale) const {
+bool TriangleMesh::inside_convex_shape(const Plane *p_planes, int p_plane_count, const Vector3 *p_points, int p_point_count, Vector3 p_scale) const {
uint32_t *stack = (uint32_t *)alloca(sizeof(int) * max_depth);
enum {
@@ -651,7 +651,7 @@ bool TriangleMesh::inside_convex_shape(const Plane *p_planes, int p_plane_count,
switch (stack[level] >> VISITED_BIT_SHIFT) {
case TEST_AABB_BIT: {
- bool intersects = scale.xform(b.aabb).intersects_convex_shape(p_planes, p_plane_count);
+ bool intersects = scale.xform(b.aabb).intersects_convex_shape(p_planes, p_plane_count, p_points, p_point_count);
if (!intersects) return false;
bool inside = scale.xform(b.aabb).inside_convex_shape(p_planes, p_plane_count);
diff --git a/core/math/triangle_mesh.h b/core/math/triangle_mesh.h
index fdbfb90465..64704477cc 100644
--- a/core/math/triangle_mesh.h
+++ b/core/math/triangle_mesh.h
@@ -90,8 +90,8 @@ public:
bool is_valid() const;
bool intersect_segment(const Vector3 &p_begin, const Vector3 &p_end, Vector3 &r_point, Vector3 &r_normal) const;
bool intersect_ray(const Vector3 &p_begin, const Vector3 &p_dir, Vector3 &r_point, Vector3 &r_normal) const;
- bool intersect_convex_shape(const Plane *p_planes, int p_plane_count) const;
- bool inside_convex_shape(const Plane *p_planes, int p_plane_count, Vector3 p_scale = Vector3(1, 1, 1)) const;
+ bool intersect_convex_shape(const Plane *p_planes, int p_plane_count, const Vector3 *p_points, int p_point_count) const;
+ bool inside_convex_shape(const Plane *p_planes, int p_plane_count, const Vector3 *p_points, int p_point_count, Vector3 p_scale = Vector3(1, 1, 1)) const;
Vector3 get_area_normal(const AABB &p_aabb) const;
Vector<Face3> get_faces() const;
diff --git a/core/math/vector2.h b/core/math/vector2.h
index 95d2474838..c0057f2543 100644
--- a/core/math/vector2.h
+++ b/core/math/vector2.h
@@ -82,8 +82,7 @@ struct Vector2 {
Vector2 clamped(real_t p_len) const;
- _FORCE_INLINE_ static Vector2 linear_interpolate(const Vector2 &p_a, const Vector2 &p_b, real_t p_t);
- _FORCE_INLINE_ Vector2 linear_interpolate(const Vector2 &p_b, real_t p_t) const;
+ _FORCE_INLINE_ Vector2 lerp(const Vector2 &p_b, real_t p_t) const;
_FORCE_INLINE_ Vector2 slerp(const Vector2 &p_b, real_t p_t) const;
Vector2 cubic_interpolate(const Vector2 &p_b, const Vector2 &p_pre_a, const Vector2 &p_post_b, real_t p_t) const;
Vector2 move_toward(const Vector2 &p_to, const real_t p_delta) const;
@@ -224,7 +223,7 @@ _FORCE_INLINE_ bool Vector2::operator!=(const Vector2 &p_vec2) const {
return x != p_vec2.x || y != p_vec2.y;
}
-Vector2 Vector2::linear_interpolate(const Vector2 &p_b, real_t p_t) const {
+Vector2 Vector2::lerp(const Vector2 &p_b, real_t p_t) const {
Vector2 res = *this;
@@ -248,16 +247,6 @@ Vector2 Vector2::direction_to(const Vector2 &p_b) const {
return ret;
}
-Vector2 Vector2::linear_interpolate(const Vector2 &p_a, const Vector2 &p_b, real_t p_t) {
-
- Vector2 res = p_a;
-
- res.x += (p_t * (p_b.x - p_a.x));
- res.y += (p_t * (p_b.y - p_a.y));
-
- return res;
-}
-
typedef Vector2 Size2;
typedef Vector2 Point2;
diff --git a/core/math/vector3.h b/core/math/vector3.h
index 3bf8644af9..a5e9d09208 100644
--- a/core/math/vector3.h
+++ b/core/math/vector3.h
@@ -89,7 +89,7 @@ struct Vector3 {
/* Static Methods between 2 vector3s */
- _FORCE_INLINE_ Vector3 linear_interpolate(const Vector3 &p_b, real_t p_t) const;
+ _FORCE_INLINE_ Vector3 lerp(const Vector3 &p_b, real_t p_t) const;
_FORCE_INLINE_ Vector3 slerp(const Vector3 &p_b, real_t p_t) const;
Vector3 cubic_interpolate(const Vector3 &p_b, const Vector3 &p_pre_a, const Vector3 &p_post_b, real_t p_t) const;
Vector3 cubic_interpolaten(const Vector3 &p_b, const Vector3 &p_pre_a, const Vector3 &p_post_b, real_t p_t) const;
@@ -206,7 +206,7 @@ Vector3 Vector3::round() const {
return Vector3(Math::round(x), Math::round(y), Math::round(z));
}
-Vector3 Vector3::linear_interpolate(const Vector3 &p_b, real_t p_t) const {
+Vector3 Vector3::lerp(const Vector3 &p_b, real_t p_t) const {
return Vector3(
x + (p_t * (p_b.x - x)),
diff --git a/core/os/os.h b/core/os/os.h
index 714a10bf76..38114e6814 100644
--- a/core/os/os.h
+++ b/core/os/os.h
@@ -59,6 +59,7 @@ class OS {
bool _allow_layered;
bool _use_vsync;
bool _vsync_via_compositor;
+ bool _disable_wintab;
char *last_error;
@@ -148,6 +149,7 @@ public:
bool is_layered_allowed() const { return _allow_layered; }
bool is_hidpi_allowed() const { return _allow_hidpi; }
+ bool is_wintab_disabled() const { return _disable_wintab; }
void ensure_user_data_dir();
diff --git a/core/project_settings.cpp b/core/project_settings.cpp
index 63b52661b4..8829181489 100644
--- a/core/project_settings.cpp
+++ b/core/project_settings.cpp
@@ -362,40 +362,29 @@ Error ProjectSettings::_setup(const String &p_path, const String &p_main_pack, b
// We need to test both possibilities as extensions for Linux binaries are optional
// (so both 'mygame.bin' and 'mygame' should be able to find 'mygame.pck').
- bool found = false;
-
String exec_dir = exec_path.get_base_dir();
String exec_filename = exec_path.get_file();
String exec_basename = exec_filename.get_basename();
- // Try to load data pack at the location of the executable
- // As mentioned above, we have two potential names to attempt
-
- if (_load_resource_pack(exec_dir.plus_file(exec_basename + ".pck")) ||
- _load_resource_pack(exec_dir.plus_file(exec_filename + ".pck"))) {
- found = true;
- } else {
- // If we couldn't find them next to the executable, we attempt
- // the current working directory. Same story, two tests.
- if (_load_resource_pack(exec_basename + ".pck") ||
- _load_resource_pack(exec_filename + ".pck")) {
- found = true;
- }
- }
+ // Attempt with PCK bundled into executable
+ bool found = _load_resource_pack(exec_path);
#ifdef OSX_ENABLED
- // Attempt to load PCK from macOS .app bundle resources
if (!found) {
- if (_load_resource_pack(OS::get_singleton()->get_bundle_resource_dir().plus_file(exec_basename + ".pck"))) {
- found = true;
- }
+ // Attempt to load PCK from macOS .app bundle resources
+ found = _load_resource_pack(OS::get_singleton()->get_bundle_resource_dir().plus_file(exec_basename + ".pck"));
}
#endif
- // Attempt with PCK bundled into executable
if (!found) {
- if (_load_resource_pack(exec_path)) {
- found = true;
+ // Try to load data pack at the location of the executable
+ // As mentioned above, we have two potential names to attempt
+ found = _load_resource_pack(exec_dir.plus_file(exec_basename + ".pck")) || _load_resource_pack(exec_dir.plus_file(exec_filename + ".pck"));
+
+ if (!found) {
+ // If we couldn't find them next to the executable, we attempt
+ // the current working directory. Same story, two tests.
+ found = _load_resource_pack(exec_basename + ".pck") || _load_resource_pack(exec_filename + ".pck");
}
}
diff --git a/core/variant.cpp b/core/variant.cpp
index b3611536b8..a91876dd98 100644
--- a/core/variant.cpp
+++ b/core/variant.cpp
@@ -102,11 +102,6 @@ String Variant::get_type_name(Variant::Type p_type) {
return "Plane";
} break;
- /*
- case QUAT: {
-
-
- } break;*/
case AABB: {
return "AABB";
diff --git a/core/variant.h b/core/variant.h
index a832f7ccf8..1ae09ad82f 100644
--- a/core/variant.h
+++ b/core/variant.h
@@ -67,13 +67,6 @@ typedef Vector<Vector2> PackedVector2Array;
typedef Vector<Vector3> PackedVector3Array;
typedef Vector<Color> PackedColorArray;
-// Temporary workaround until c++11 alignas()
-#ifdef __GNUC__
-#define GCC_ALIGNED_8 __attribute__((aligned(8)))
-#else
-#define GCC_ALIGNED_8
-#endif
-
class Variant {
public:
// If this changes the table in variant_op must be updated
@@ -211,7 +204,7 @@ private:
PackedArrayRefBase *packed_array;
void *_ptr; //generic pointer
uint8_t _mem[sizeof(ObjData) > (sizeof(real_t) * 4) ? sizeof(ObjData) : (sizeof(real_t) * 4)];
- } _data GCC_ALIGNED_8;
+ } _data alignas(8);
void reference(const Variant &p_variant);
void clear();
diff --git a/core/variant_call.cpp b/core/variant_call.cpp
index 483565648a..9fffb42ff6 100644
--- a/core/variant_call.cpp
+++ b/core/variant_call.cpp
@@ -362,7 +362,7 @@ struct _VariantCall {
VCALL_LOCALMEM1R(Vector2, angle_to);
VCALL_LOCALMEM1R(Vector2, angle_to_point);
VCALL_LOCALMEM1R(Vector2, direction_to);
- VCALL_LOCALMEM2R(Vector2, linear_interpolate);
+ VCALL_LOCALMEM2R(Vector2, lerp);
VCALL_LOCALMEM2R(Vector2, slerp);
VCALL_LOCALMEM4R(Vector2, cubic_interpolate);
VCALL_LOCALMEM2R(Vector2, move_toward);
@@ -426,7 +426,7 @@ struct _VariantCall {
VCALL_LOCALMEM0R(Vector3, inverse);
VCALL_LOCALMEM1R(Vector3, snapped);
VCALL_LOCALMEM2R(Vector3, rotated);
- VCALL_LOCALMEM2R(Vector3, linear_interpolate);
+ VCALL_LOCALMEM2R(Vector3, lerp);
VCALL_LOCALMEM2R(Vector3, slerp);
VCALL_LOCALMEM4R(Vector3, cubic_interpolate);
VCALL_LOCALMEM2R(Vector3, move_toward);
@@ -509,7 +509,7 @@ struct _VariantCall {
VCALL_LOCALMEM0R(Color, to_rgba64);
VCALL_LOCALMEM0R(Color, inverted);
VCALL_LOCALMEM0R(Color, contrasted);
- VCALL_LOCALMEM2R(Color, linear_interpolate);
+ VCALL_LOCALMEM2R(Color, lerp);
VCALL_LOCALMEM1R(Color, blend);
VCALL_LOCALMEM1R(Color, lightened);
VCALL_LOCALMEM1R(Color, darkened);
@@ -1075,6 +1075,11 @@ struct _VariantCall {
r_ret = Color::hex(*p_args[0]);
}
+ static void Color_init5(Variant &r_ret, const Variant **p_args) {
+
+ r_ret = Color(((Color)(*p_args[0])), *p_args[1]);
+ }
+
static void AABB_init1(Variant &r_ret, const Variant **p_args) {
r_ret = ::AABB(*p_args[0], *p_args[1]);
@@ -1353,6 +1358,8 @@ Variant Variant::construct(const Variant::Type p_type, const Variant **p_args, i
case RECT2I: return (Rect2i(*p_args[0]));
case VECTOR3: return (Vector3(*p_args[0]));
case VECTOR3I: return (Vector3i(*p_args[0]));
+ case TRANSFORM2D:
+ return (Transform2D(p_args[0]->operator Transform2D()));
case PLANE: return (Plane(*p_args[0]));
case QUAT: return (p_args[0]->operator Quat());
case AABB:
@@ -1801,7 +1808,7 @@ void register_variant_methods() {
ADDFUNC1R(VECTOR2, VECTOR2, Vector2, posmod, FLOAT, "mod", varray());
ADDFUNC1R(VECTOR2, VECTOR2, Vector2, posmodv, VECTOR2, "modv", varray());
ADDFUNC1R(VECTOR2, VECTOR2, Vector2, project, VECTOR2, "b", varray());
- ADDFUNC2R(VECTOR2, VECTOR2, Vector2, linear_interpolate, VECTOR2, "b", FLOAT, "t", varray());
+ ADDFUNC2R(VECTOR2, VECTOR2, Vector2, lerp, VECTOR2, "b", FLOAT, "t", varray());
ADDFUNC2R(VECTOR2, VECTOR2, Vector2, slerp, VECTOR2, "b", FLOAT, "t", varray());
ADDFUNC4R(VECTOR2, VECTOR2, Vector2, cubic_interpolate, VECTOR2, "b", VECTOR2, "pre_a", VECTOR2, "post_b", FLOAT, "t", varray());
ADDFUNC2R(VECTOR2, VECTOR2, Vector2, move_toward, VECTOR2, "to", FLOAT, "delta", varray());
@@ -1866,7 +1873,7 @@ void register_variant_methods() {
ADDFUNC0R(VECTOR3, VECTOR3, Vector3, inverse, varray());
ADDFUNC1R(VECTOR3, VECTOR3, Vector3, snapped, VECTOR3, "by", varray());
ADDFUNC2R(VECTOR3, VECTOR3, Vector3, rotated, VECTOR3, "axis", FLOAT, "phi", varray());
- ADDFUNC2R(VECTOR3, VECTOR3, Vector3, linear_interpolate, VECTOR3, "b", FLOAT, "t", varray());
+ ADDFUNC2R(VECTOR3, VECTOR3, Vector3, lerp, VECTOR3, "b", FLOAT, "t", varray());
ADDFUNC2R(VECTOR3, VECTOR3, Vector3, slerp, VECTOR3, "b", FLOAT, "t", varray());
ADDFUNC4R(VECTOR3, VECTOR3, Vector3, cubic_interpolate, VECTOR3, "b", VECTOR3, "pre_a", VECTOR3, "post_b", FLOAT, "t", varray());
ADDFUNC2R(VECTOR3, VECTOR3, Vector3, move_toward, VECTOR3, "to", FLOAT, "delta", varray());
@@ -1925,7 +1932,7 @@ void register_variant_methods() {
ADDFUNC0R(COLOR, INT, Color, to_rgba64, varray());
ADDFUNC0R(COLOR, COLOR, Color, inverted, varray());
ADDFUNC0R(COLOR, COLOR, Color, contrasted, varray());
- ADDFUNC2R(COLOR, COLOR, Color, linear_interpolate, COLOR, "b", FLOAT, "t", varray());
+ ADDFUNC2R(COLOR, COLOR, Color, lerp, COLOR, "b", FLOAT, "t", varray());
ADDFUNC1R(COLOR, COLOR, Color, blend, COLOR, "over", varray());
ADDFUNC1R(COLOR, COLOR, Color, lightened, FLOAT, "amount", varray());
ADDFUNC1R(COLOR, COLOR, Color, darkened, FLOAT, "amount", varray());
@@ -2209,6 +2216,8 @@ void register_variant_methods() {
_VariantCall::add_constructor(_VariantCall::Color_init1, Variant::COLOR, "r", Variant::FLOAT, "g", Variant::FLOAT, "b", Variant::FLOAT, "a", Variant::FLOAT);
_VariantCall::add_constructor(_VariantCall::Color_init2, Variant::COLOR, "r", Variant::FLOAT, "g", Variant::FLOAT, "b", Variant::FLOAT);
+ // init3 and init4 are the constructors for HTML hex strings and integers respectively which don't need binding here, so we skip to init5.
+ _VariantCall::add_constructor(_VariantCall::Color_init5, Variant::COLOR, "c", Variant::COLOR, "a", Variant::FLOAT);
_VariantCall::add_constructor(_VariantCall::AABB_init1, Variant::AABB, "position", Variant::VECTOR3, "size", Variant::VECTOR3);
diff --git a/core/variant_op.cpp b/core/variant_op.cpp
index f173c88054..27624b81ee 100644
--- a/core/variant_op.cpp
+++ b/core/variant_op.cpp
@@ -4220,7 +4220,7 @@ void Variant::interpolate(const Variant &a, const Variant &b, float c, Variant &
}
return;
case VECTOR2: {
- r_dst = reinterpret_cast<const Vector2 *>(a._data._mem)->linear_interpolate(*reinterpret_cast<const Vector2 *>(b._data._mem), c);
+ r_dst = reinterpret_cast<const Vector2 *>(a._data._mem)->lerp(*reinterpret_cast<const Vector2 *>(b._data._mem), c);
}
return;
case VECTOR2I: {
@@ -4233,7 +4233,7 @@ void Variant::interpolate(const Variant &a, const Variant &b, float c, Variant &
return;
case RECT2: {
- r_dst = Rect2(reinterpret_cast<const Rect2 *>(a._data._mem)->position.linear_interpolate(reinterpret_cast<const Rect2 *>(b._data._mem)->position, c), reinterpret_cast<const Rect2 *>(a._data._mem)->size.linear_interpolate(reinterpret_cast<const Rect2 *>(b._data._mem)->size, c));
+ r_dst = Rect2(reinterpret_cast<const Rect2 *>(a._data._mem)->position.lerp(reinterpret_cast<const Rect2 *>(b._data._mem)->position, c), reinterpret_cast<const Rect2 *>(a._data._mem)->size.lerp(reinterpret_cast<const Rect2 *>(b._data._mem)->size, c));
}
return;
case RECT2I: {
@@ -4254,7 +4254,7 @@ void Variant::interpolate(const Variant &a, const Variant &b, float c, Variant &
return;
case VECTOR3: {
- r_dst = reinterpret_cast<const Vector3 *>(a._data._mem)->linear_interpolate(*reinterpret_cast<const Vector3 *>(b._data._mem), c);
+ r_dst = reinterpret_cast<const Vector3 *>(a._data._mem)->lerp(*reinterpret_cast<const Vector3 *>(b._data._mem), c);
}
return;
case VECTOR3I: {
@@ -4281,7 +4281,7 @@ void Variant::interpolate(const Variant &a, const Variant &b, float c, Variant &
}
return;
case AABB: {
- r_dst = ::AABB(a._data._aabb->position.linear_interpolate(b._data._aabb->position, c), a._data._aabb->size.linear_interpolate(b._data._aabb->size, c));
+ r_dst = ::AABB(a._data._aabb->position.lerp(b._data._aabb->position, c), a._data._aabb->size.lerp(b._data._aabb->size, c));
}
return;
case BASIS: {
@@ -4293,7 +4293,7 @@ void Variant::interpolate(const Variant &a, const Variant &b, float c, Variant &
}
return;
case COLOR: {
- r_dst = reinterpret_cast<const Color *>(a._data._mem)->linear_interpolate(*reinterpret_cast<const Color *>(b._data._mem), c);
+ r_dst = reinterpret_cast<const Color *>(a._data._mem)->lerp(*reinterpret_cast<const Color *>(b._data._mem), c);
}
return;
case STRING_NAME: {
@@ -4448,7 +4448,7 @@ void Variant::interpolate(const Variant &a, const Variant &b, float c, Variant &
const Vector2 *br = arr_b->ptr();
for (int i = 0; i < sz; i++) {
- vw[i] = ar[i].linear_interpolate(br[i], c);
+ vw[i] = ar[i].lerp(br[i], c);
}
}
r_dst = v;
@@ -4473,7 +4473,7 @@ void Variant::interpolate(const Variant &a, const Variant &b, float c, Variant &
const Vector3 *br = arr_b->ptr();
for (int i = 0; i < sz; i++) {
- vw[i] = ar[i].linear_interpolate(br[i], c);
+ vw[i] = ar[i].lerp(br[i], c);
}
}
r_dst = v;
@@ -4497,7 +4497,7 @@ void Variant::interpolate(const Variant &a, const Variant &b, float c, Variant &
const Color *br = arr_b->ptr();
for (int i = 0; i < sz; i++) {
- vw[i] = ar[i].linear_interpolate(br[i], c);
+ vw[i] = ar[i].lerp(br[i], c);
}
}
r_dst = v;
diff --git a/doc/classes/@GlobalScope.xml b/doc/classes/@GlobalScope.xml
index b3cd1c1af7..222b70c9c7 100644
--- a/doc/classes/@GlobalScope.xml
+++ b/doc/classes/@GlobalScope.xml
@@ -77,6 +77,9 @@
<member name="ProjectSettings" type="ProjectSettings" setter="" getter="">
The [ProjectSettings] singleton.
</member>
+ <member name="RenderingDevice" type="RenderingDevice" setter="" getter="">
+ The [RenderingDevice] singleton.
+ </member>
<member name="RenderingServer" type="RenderingServer" setter="" getter="">
The [RenderingServer] singleton.
</member>
@@ -1177,10 +1180,10 @@
[codeblock]
var err = method_that_returns_error()
if err != OK:
- print("Failure!)
+ print("Failure!")
# Or, equivalent:
if err:
- print("Still failing!)
+ print("Still failing!")
[/codeblock]
</constant>
<constant name="FAILED" value="1" enum="Error">
diff --git a/doc/classes/AnimatedTexture.xml b/doc/classes/AnimatedTexture.xml
index ddd51cc6b3..285e0d5f39 100644
--- a/doc/classes/AnimatedTexture.xml
+++ b/doc/classes/AnimatedTexture.xml
@@ -75,7 +75,7 @@
If [code]true[/code], the animation will only play once and will not loop back to the first frame after reaching the end. Note that reaching the end will not set [member pause] to [code]true[/code].
</member>
<member name="pause" type="bool" setter="set_pause" getter="get_pause" default="false">
- If [code]true[/code], the animation will pause where it currently is (i.e. at [member current_frame]). The animation will continue from where it was paused when changing this property to [code]false[/code].
+ If [code]true[/code], the animation will pause where it currently is (i.e. at [member current_frame]). The animation will continue from where it was paused when changing this property to [code]false[/code].
</member>
</members>
<constants>
diff --git a/doc/classes/BaseMaterial3D.xml b/doc/classes/BaseMaterial3D.xml
index 76abc31451..1da4e23437 100644
--- a/doc/classes/BaseMaterial3D.xml
+++ b/doc/classes/BaseMaterial3D.xml
@@ -159,6 +159,7 @@
</member>
<member name="detail_normal" type="Texture2D" setter="set_texture" getter="get_texture">
Texture that specifies the per-pixel normal of the detail overlay.
+ [b]Note:[/b] Godot expects the normal map to use X+, Y-, and Z+ coordinates. See [url=http://wiki.polycount.com/wiki/Normal_Map_Technical_Details#Common_Swizzle_Coordinates]this page[/url] for a comparison of normal map coordinates expected by popular engines.
</member>
<member name="detail_uv_layer" type="int" setter="set_detail_uv" getter="get_detail_uv" enum="BaseMaterial3D.DetailUV">
Specifies whether to use [code]UV[/code] or [code]UV2[/code] for the detail layer. See [enum DetailUV] for options.
@@ -250,6 +251,7 @@
</member>
<member name="normal_texture" type="Texture2D" setter="set_texture" getter="get_texture">
Texture used to specify the normal at a given pixel. The [code]normal_texture[/code] only uses the red and green channels. The normal read from [code]normal_texture[/code] is oriented around the surface normal provided by the [Mesh].
+ [b]Note:[/b] Godot expects the normal map to use X+, Y-, and Z+ coordinates. See [url=http://wiki.polycount.com/wiki/Normal_Map_Technical_Details#Common_Swizzle_Coordinates]this page[/url] for a comparison of normal map coordinates expected by popular engines.
</member>
<member name="orm_texture" type="Texture2D" setter="set_texture" getter="get_texture">
</member>
diff --git a/doc/classes/CPUParticles2D.xml b/doc/classes/CPUParticles2D.xml
index c2b821699d..df3ef71a2a 100644
--- a/doc/classes/CPUParticles2D.xml
+++ b/doc/classes/CPUParticles2D.xml
@@ -240,6 +240,7 @@
</member>
<member name="normalmap" type="Texture2D" setter="set_normalmap" getter="get_normalmap">
Normal map to be used for the [member texture] property.
+ [b]Note:[/b] Godot expects the normal map to use X+, Y-, and Z+ coordinates. See [url=http://wiki.polycount.com/wiki/Normal_Map_Technical_Details#Common_Swizzle_Coordinates]this page[/url] for a comparison of normal map coordinates expected by popular engines.
</member>
<member name="one_shot" type="bool" setter="set_one_shot" getter="get_one_shot" default="false">
If [code]true[/code], only one emission cycle occurs. If set [code]true[/code] during a cycle, emission will stop at the cycle's end.
diff --git a/doc/classes/Camera3D.xml b/doc/classes/Camera3D.xml
index bfba23c7ee..6ff4875364 100644
--- a/doc/classes/Camera3D.xml
+++ b/doc/classes/Camera3D.xml
@@ -183,8 +183,13 @@
<member name="far" type="float" setter="set_zfar" getter="get_zfar" default="100.0">
The distance to the far culling boundary for this camera relative to its local Z axis.
</member>
- <member name="fov" type="float" setter="set_fov" getter="get_fov" default="70.0">
+ <member name="fov" type="float" setter="set_fov" getter="get_fov" default="75.0">
The camera's field of view angle (in degrees). Only applicable in perspective mode. Since [member keep_aspect] locks one axis, [code]fov[/code] sets the other axis' field of view angle.
+ For reference, the default vertical field of view value ([code]75.0[/code]) is equivalent to an horizontal FOV of:
+ - ~91.31 degrees in a 4:3 viewport
+ - ~101.67 degrees in a 16:10 viewport
+ - ~107.51 degrees in a 16:9 viewport
+ - ~121.63 degrees in a 21:9 viewport
</member>
<member name="frustum_offset" type="Vector2" setter="set_frustum_offset" getter="get_frustum_offset" default="Vector2( 0, 0 )">
The camera's frustum offset. This can be changed from the default to create "tilted frustum" effects such as [url=https://zdoom.org/wiki/Y-shearing]Y-shearing[/url].
diff --git a/doc/classes/Color.xml b/doc/classes/Color.xml
index d495be2ffd..b35d4fb36a 100644
--- a/doc/classes/Color.xml
+++ b/doc/classes/Color.xml
@@ -42,6 +42,20 @@
<method name="Color">
<return type="Color">
</return>
+ <argument index="0" name="c" type="Color">
+ </argument>
+ <argument index="1" name="a" type="float">
+ </argument>
+ <description>
+ Constructs a color from an existing color, but with a custom alpha value.
+ [codeblock]
+ var red = Color(Color.red, 0.5) # 50% transparent red.
+ [/codeblock]
+ </description>
+ </method>
+ <method name="Color">
+ <return type="Color">
+ </return>
<argument index="0" name="r" type="float">
</argument>
<argument index="1" name="g" type="float">
@@ -149,32 +163,32 @@
Returns [code]true[/code] if this color and [code]color[/code] are approximately equal, by running [method @GDScript.is_equal_approx] on each component.
</description>
</method>
- <method name="lightened">
+ <method name="lerp">
<return type="Color">
</return>
- <argument index="0" name="amount" type="float">
+ <argument index="0" name="b" type="Color">
+ </argument>
+ <argument index="1" name="t" type="float">
</argument>
<description>
- Returns a new color resulting from making this color lighter by the specified percentage (ratio from 0 to 1).
+ Returns the linear interpolation with another color. The interpolation factor [code]t[/code] is between 0 and 1.
[codeblock]
- var green = Color(0.0, 1.0, 0.0)
- var lightgreen = green.lightened(0.2) # 20% lighter than regular green
+ var c1 = Color(1.0, 0.0, 0.0)
+ var c2 = Color(0.0, 1.0, 0.0)
+ var li_c = c1.lerp(c2, 0.5) # A color of an RGBA(128, 128, 0, 255)
[/codeblock]
</description>
</method>
- <method name="linear_interpolate">
+ <method name="lightened">
<return type="Color">
</return>
- <argument index="0" name="b" type="Color">
- </argument>
- <argument index="1" name="t" type="float">
+ <argument index="0" name="amount" type="float">
</argument>
<description>
- Returns the linear interpolation with another color. The interpolation factor [code]t[/code] is between 0 and 1.
+ Returns a new color resulting from making this color lighter by the specified percentage (ratio from 0 to 1).
[codeblock]
- var c1 = Color(1.0, 0.0, 0.0)
- var c2 = Color(0.0, 1.0, 0.0)
- var li_c = c1.linear_interpolate(c2, 0.5) # A color of an RGBA(128, 128, 0, 255)
+ var green = Color(0.0, 1.0, 0.0)
+ var lightgreen = green.lightened(0.2) # 20% lighter than regular green
[/codeblock]
</description>
</method>
diff --git a/doc/classes/GPUParticles2D.xml b/doc/classes/GPUParticles2D.xml
index 64a2522f2f..ee67b5052c 100644
--- a/doc/classes/GPUParticles2D.xml
+++ b/doc/classes/GPUParticles2D.xml
@@ -53,6 +53,7 @@
</member>
<member name="normal_map" type="Texture2D" setter="set_normal_map" getter="get_normal_map">
Normal map to be used for the [member texture] property.
+ [b]Note:[/b] Godot expects the normal map to use X+, Y-, and Z+ coordinates. See [url=http://wiki.polycount.com/wiki/Normal_Map_Technical_Details#Common_Swizzle_Coordinates]this page[/url] for a comparison of normal map coordinates expected by popular engines.
</member>
<member name="one_shot" type="bool" setter="set_one_shot" getter="get_one_shot" default="false">
If [code]true[/code], only one emission cycle occurs. If set [code]true[/code] during a cycle, emission will stop at the cycle's end.
diff --git a/doc/classes/Generic6DOFJoint3D.xml b/doc/classes/Generic6DOFJoint3D.xml
index fae567dc58..ae86ab7365 100644
--- a/doc/classes/Generic6DOFJoint3D.xml
+++ b/doc/classes/Generic6DOFJoint3D.xml
@@ -373,6 +373,12 @@
<constant name="PARAM_LINEAR_MOTOR_FORCE_LIMIT" value="6" enum="Param">
The maximum force the linear motor will apply while trying to reach the velocity target.
</constant>
+ <constant name="PARAM_LINEAR_SPRING_STIFFNESS" value="7" enum="Param">
+ </constant>
+ <constant name="PARAM_LINEAR_SPRING_DAMPING" value="8" enum="Param">
+ </constant>
+ <constant name="PARAM_LINEAR_SPRING_EQUILIBRIUM_POINT" value="9" enum="Param">
+ </constant>
<constant name="PARAM_ANGULAR_LOWER_LIMIT" value="10" enum="Param">
The minimum rotation in negative direction to break loose and rotate around the axes.
</constant>
@@ -400,6 +406,12 @@
<constant name="PARAM_ANGULAR_MOTOR_FORCE_LIMIT" value="18" enum="Param">
Maximum acceleration for the motor at the axes.
</constant>
+ <constant name="PARAM_ANGULAR_SPRING_STIFFNESS" value="19" enum="Param">
+ </constant>
+ <constant name="PARAM_ANGULAR_SPRING_DAMPING" value="20" enum="Param">
+ </constant>
+ <constant name="PARAM_ANGULAR_SPRING_EQUILIBRIUM_POINT" value="21" enum="Param">
+ </constant>
<constant name="PARAM_MAX" value="22" enum="Param">
Represents the size of the [enum Param] enum.
</constant>
diff --git a/doc/classes/Image.xml b/doc/classes/Image.xml
index 8cffe07fc0..99253e8840 100644
--- a/doc/classes/Image.xml
+++ b/doc/classes/Image.xml
@@ -350,7 +350,7 @@
<argument index="0" name="path" type="String">
</argument>
<description>
- Loads an image from file [code]path[/code].
+ Loads an image from file [code]path[/code]. See [url=https://docs.godotengine.org/en/latest/getting_started/workflow/assets/importing_images.html#supported-image-formats]Supported image formats[/url] for a list of supported image formats and limitations.
</description>
</method>
<method name="load_jpg_from_buffer">
diff --git a/doc/classes/KinematicBody3D.xml b/doc/classes/KinematicBody3D.xml
index 5f9b36f97d..830d63ed11 100644
--- a/doc/classes/KinematicBody3D.xml
+++ b/doc/classes/KinematicBody3D.xml
@@ -108,7 +108,7 @@
This method should be used in [method Node._physics_process] (or in a method called by [method Node._physics_process]), as it uses the physics step's [code]delta[/code] value automatically in calculations. Otherwise, the simulation will run at an incorrect speed.
[code]linear_velocity[/code] is the velocity vector (typically meters per second). Unlike in [method move_and_collide], you should [i]not[/i] multiply it by [code]delta[/code] — the physics engine handles applying the velocity.
[code]up_direction[/code] is the up direction, used to determine what is a wall and what is a floor or a ceiling. If set to the default value of [code]Vector3(0, 0, 0)[/code], everything is considered a wall.
- If [code]stop_on_slope[/code] is [code]true[/code], body will not slide on slopes if you include gravity in [code]linear_velocity[/code].
+ If [code]stop_on_slope[/code] is [code]true[/code], body will not slide on slopes when you include gravity in [code]linear_velocity[/code] and the body is standing still.
If the body collides, it will change direction a maximum of [code]max_slides[/code] times before it stops.
[code]floor_max_angle[/code] is the maximum angle (in radians) where a slope is still considered a floor (or a ceiling), rather than a wall. The default value equals 45 degrees.
If [code]infinite_inertia[/code] is [code]true[/code], body will be able to push [RigidBody3D] nodes, but it won't also detect any collisions with them. If [code]false[/code], it will interact with [RigidBody3D] nodes like with [StaticBody3D].
diff --git a/doc/classes/MeshInstance2D.xml b/doc/classes/MeshInstance2D.xml
index 0cfc8deb0a..689f8d83e1 100644
--- a/doc/classes/MeshInstance2D.xml
+++ b/doc/classes/MeshInstance2D.xml
@@ -17,6 +17,7 @@
</member>
<member name="normal_map" type="Texture2D" setter="set_normal_map" getter="get_normal_map">
The normal map that will be used if using the default [CanvasItemMaterial].
+ [b]Note:[/b] Godot expects the normal map to use X+, Y-, and Z+ coordinates. See [url=http://wiki.polycount.com/wiki/Normal_Map_Technical_Details#Common_Swizzle_Coordinates]this page[/url] for a comparison of normal map coordinates expected by popular engines.
</member>
<member name="texture" type="Texture2D" setter="set_texture" getter="get_texture">
The [Texture2D] that will be used if using the default [CanvasItemMaterial]. Can be accessed as [code]TEXTURE[/code] in CanvasItem shader.
diff --git a/doc/classes/MultiMeshInstance2D.xml b/doc/classes/MultiMeshInstance2D.xml
index 07f21514ef..a461c8e056 100644
--- a/doc/classes/MultiMeshInstance2D.xml
+++ b/doc/classes/MultiMeshInstance2D.xml
@@ -17,6 +17,7 @@
</member>
<member name="normal_map" type="Texture2D" setter="set_normal_map" getter="get_normal_map">
The normal map that will be used if using the default [CanvasItemMaterial].
+ [b]Note:[/b] Godot expects the normal map to use X+, Y-, and Z+ coordinates. See [url=http://wiki.polycount.com/wiki/Normal_Map_Technical_Details#Common_Swizzle_Coordinates]this page[/url] for a comparison of normal map coordinates expected by popular engines.
</member>
<member name="texture" type="Texture2D" setter="set_texture" getter="get_texture">
The [Texture2D] that will be used if using the default [CanvasItemMaterial]. Can be accessed as [code]TEXTURE[/code] in CanvasItem shader.
diff --git a/doc/classes/Node2D.xml b/doc/classes/Node2D.xml
index d4517f0588..d29c556216 100644
--- a/doc/classes/Node2D.xml
+++ b/doc/classes/Node2D.xml
@@ -142,6 +142,10 @@
<member name="scale" type="Vector2" setter="set_scale" getter="get_scale" default="Vector2( 1, 1 )">
The node's scale. Unscaled value: [code](1, 1)[/code].
</member>
+ <member name="skew" type="float" setter="set_skew" getter="get_skew" default="0.0">
+ </member>
+ <member name="skew_degrees" type="float" setter="set_skew_degrees" getter="get_skew_degrees" default="0.0">
+ </member>
<member name="transform" type="Transform2D" setter="set_transform" getter="get_transform">
Local [Transform2D].
</member>
diff --git a/doc/classes/Node3D.xml b/doc/classes/Node3D.xml
index 3e7d4d4c05..05d00b9f31 100644
--- a/doc/classes/Node3D.xml
+++ b/doc/classes/Node3D.xml
@@ -26,7 +26,7 @@
Returns the parent [Node3D], or an empty [Object] if no parent exists or parent is not of type [Node3D].
</description>
</method>
- <method name="get_world" qualifiers="const">
+ <method name="get_world_3d" qualifiers="const">
<return type="World3D">
</return>
<description>
diff --git a/doc/classes/OS.xml b/doc/classes/OS.xml
index db79ee7765..6a70297f40 100644
--- a/doc/classes/OS.xml
+++ b/doc/classes/OS.xml
@@ -484,6 +484,7 @@
- [code]OS.shell_open("C:\\Users\name\Downloads")[/code] on Windows opens the file explorer at the user's Downloads folder.
- [code]OS.shell_open("https://godotengine.org")[/code] opens the default web browser on the official Godot website.
- [code]OS.shell_open("mailto:example@example.com")[/code] opens the default email client with the "To" field set to [code]example@example.com[/code]. See [url=https://blog.escapecreative.com/customizing-mailto-links/]Customizing [code]mailto:[/code] Links[/url] for a list of fields that can be added.
+ Use [method ProjectSettings.globalize_path] to convert a [code]res://[/code] or [code]user://[/code] path into a system path for use with this method.
[b]Note:[/b] This method is implemented on Android, iOS, HTML5, Linux, macOS and Windows.
</description>
</method>
diff --git a/doc/classes/Polygon2D.xml b/doc/classes/Polygon2D.xml
index 13332ca4f0..335df1ac3f 100644
--- a/doc/classes/Polygon2D.xml
+++ b/doc/classes/Polygon2D.xml
@@ -102,6 +102,8 @@
If [code]true[/code], polygon will be inverted, containing the area outside the defined points and extending to the [code]invert_border[/code].
</member>
<member name="normal_map" type="Texture2D" setter="set_normal_map" getter="get_normal_map">
+ The normal map gives depth to the Polygon2D.
+ [b]Note:[/b] Godot expects the normal map to use X+, Y-, and Z+ coordinates. See [url=http://wiki.polycount.com/wiki/Normal_Map_Technical_Details#Common_Swizzle_Coordinates]this page[/url] for a comparison of normal map coordinates expected by popular engines.
</member>
<member name="offset" type="Vector2" setter="set_offset" getter="get_offset" default="Vector2( 0, 0 )">
The offset applied to each vertex.
diff --git a/doc/classes/ProjectSettings.xml b/doc/classes/ProjectSettings.xml
index 9e917fb4dd..ded72e796b 100644
--- a/doc/classes/ProjectSettings.xml
+++ b/doc/classes/ProjectSettings.xml
@@ -414,6 +414,9 @@
<member name="display/mouse_cursor/tooltip_position_offset" type="Vector2" setter="" getter="" default="Vector2( 10, 10 )">
Position offset for tooltips, relative to the mouse cursor's hotspot.
</member>
+ <member name="display/window/disable_wintab_api" type="bool" setter="" getter="" default="false">
+ Disables WinTab API and always use Windows Ink API for the pen input (Windows only).
+ </member>
<member name="display/window/dpi/allow_hidpi" type="bool" setter="" getter="" default="false">
If [code]true[/code], allows HiDPI display on Windows and macOS. This setting has no effect on desktop Linux, as DPI-awareness fallbacks are not supported there.
</member>
@@ -469,6 +472,8 @@
<member name="gui/common/swap_ok_cancel" type="bool" setter="" getter="" default="false">
If [code]true[/code], swaps OK and Cancel buttons in dialogs on Windows and UWP to follow interface conventions.
</member>
+ <member name="gui/common/text_edit_undo_stack_max_size" type="int" setter="" getter="" default="1024">
+ </member>
<member name="gui/theme/custom" type="String" setter="" getter="" default="&quot;&quot;">
Path to a custom [Theme] resource file to use for the project ([code]theme[/code] or generic [code]tres[/code]/[code]res[/code] extension).
</member>
@@ -977,6 +982,8 @@
<member name="rendering/limits/rendering/max_renderable_elements" type="int" setter="" getter="" default="128000">
Max amount of elements renderable in a frame. If more than this are visible per frame, they will be dropped. Keep in mind elements refer to mesh surfaces and not meshes themselves.
</member>
+ <member name="rendering/limits/time/time_rollover_secs" type="float" setter="" getter="" default="3600">
+ </member>
<member name="rendering/quality/2d/gles2_use_nvidia_rect_flicker_workaround" type="bool" setter="" getter="" default="false">
Some NVIDIA GPU drivers have a bug which produces flickering issues for the [code]draw_rect[/code] method, especially as used in [TileMap]. Refer to [url=https://github.com/godotengine/godot/issues/9913]GitHub issue 9913[/url] for details.
If [code]true[/code], this option enables a "safe" code path for such NVIDIA GPUs at the cost of performance. This option only impacts the GLES2 rendering backend, and only desktop platforms. It is not necessary when using the Vulkan backend.
diff --git a/doc/classes/RenderingServer.xml b/doc/classes/RenderingServer.xml
index 4e0762a68b..648f4d0107 100644
--- a/doc/classes/RenderingServer.xml
+++ b/doc/classes/RenderingServer.xml
@@ -9,7 +9,7 @@
The rendering server can be used to bypass the scene system entirely.
Resources are created using the [code]*_create[/code] functions.
All objects are drawn to a viewport. You can use the [Viewport] attached to the [SceneTree] or you can create one yourself with [method viewport_create]. When using a custom scenario or canvas, the scenario or canvas needs to be attached to the viewport using [method viewport_set_scenario] or [method viewport_attach_canvas].
- In 3D, all visual objects must be associated with a scenario. The scenario is a visual representation of the world. If accessing the rendering server from a running game, the scenario can be accessed from the scene tree from any [Node3D] node with [method Node3D.get_world]. Otherwise, a scenario can be created with [method scenario_create].
+ In 3D, all visual objects must be associated with a scenario. The scenario is a visual representation of the world. If accessing the rendering server from a running game, the scenario can be accessed from the scene tree from any [Node3D] node with [method Node3D.get_world_3d]. Otherwise, a scenario can be created with [method scenario_create].
Similarly in 2D, a canvas is needed to draw all canvas items.
In 3D, all visible objects are comprised of a resource and an instance. A resource can be a mesh, a particle system, a light, or any other 3D object. In order to be visible resources must be attached to an instance using [method instance_set_base]. The instance must also be attached to the scenario using [method instance_set_scenario] in order to be visible.
In 2D, all visible objects are some form of canvas item. In order to be visible, a canvas item needs to be the child of a canvas attached to a viewport, or it needs to be the child of another canvas item that is eventually attached to the canvas.
diff --git a/doc/classes/SpinBox.xml b/doc/classes/SpinBox.xml
index c8ba8ab697..e674ceb57e 100644
--- a/doc/classes/SpinBox.xml
+++ b/doc/classes/SpinBox.xml
@@ -45,7 +45,7 @@
Adds the specified [code]prefix[/code] string before the numerical value of the [SpinBox].
</member>
<member name="suffix" type="String" setter="set_suffix" getter="get_suffix" default="&quot;&quot;">
- Adds the specified [code]prefix[/code] string after the numerical value of the [SpinBox].
+ Adds the specified [code]suffix[/code] string after the numerical value of the [SpinBox].
</member>
</members>
<constants>
diff --git a/doc/classes/Sprite2D.xml b/doc/classes/Sprite2D.xml
index 950fda4e20..92f561d7b5 100644
--- a/doc/classes/Sprite2D.xml
+++ b/doc/classes/Sprite2D.xml
@@ -54,6 +54,7 @@
</member>
<member name="normal_map" type="Texture2D" setter="set_normal_map" getter="get_normal_map">
The normal map gives depth to the Sprite2D.
+ [b]Note:[/b] Godot expects the normal map to use X+, Y-, and Z+ coordinates. See [url=http://wiki.polycount.com/wiki/Normal_Map_Technical_Details#Common_Swizzle_Coordinates]this page[/url] for a comparison of normal map coordinates expected by popular engines.
</member>
<member name="offset" type="Vector2" setter="set_offset" getter="get_offset" default="Vector2( 0, 0 )">
The texture's drawing offset.
diff --git a/doc/classes/StyleBoxTexture.xml b/doc/classes/StyleBoxTexture.xml
index 8ed94c8c26..f8aa14cb2b 100644
--- a/doc/classes/StyleBoxTexture.xml
+++ b/doc/classes/StyleBoxTexture.xml
@@ -121,6 +121,7 @@
</member>
<member name="normal_map" type="Texture2D" setter="set_normal_map" getter="get_normal_map">
The normal map to use when drawing this style box.
+ [b]Note:[/b] Godot expects the normal map to use X+, Y-, and Z+ coordinates. See [url=http://wiki.polycount.com/wiki/Normal_Map_Technical_Details#Common_Swizzle_Coordinates]this page[/url] for a comparison of normal map coordinates expected by popular engines.
</member>
<member name="region_rect" type="Rect2" setter="set_region_rect" getter="get_region_rect" default="Rect2( 0, 0, 0, 0 )">
Species a sub-region of the texture to use.
diff --git a/doc/classes/TextEdit.xml b/doc/classes/TextEdit.xml
index b7cf93d672..bb2d355bf6 100644
--- a/doc/classes/TextEdit.xml
+++ b/doc/classes/TextEdit.xml
@@ -354,6 +354,17 @@
If [code]true[/code], hides the line of the specified index.
</description>
</method>
+ <method name="set_line">
+ <return type="void">
+ </return>
+ <argument index="0" name="line" type="int">
+ </argument>
+ <argument index="1" name="new_text" type="String">
+ </argument>
+ <description>
+ Sets the text for a specific line.
+ </description>
+ </method>
<method name="toggle_fold_line">
<return type="void">
</return>
diff --git a/doc/classes/TileSet.xml b/doc/classes/TileSet.xml
index 65988ae2b7..c647f83598 100644
--- a/doc/classes/TileSet.xml
+++ b/doc/classes/TileSet.xml
@@ -590,6 +590,7 @@
</argument>
<description>
Sets the tile's normal map texture.
+ [b]Note:[/b] Godot expects the normal map to use X+, Y-, and Z+ coordinates. See [url=http://wiki.polycount.com/wiki/Normal_Map_Technical_Details#Common_Swizzle_Coordinates]this page[/url] for a comparison of normal map coordinates expected by popular engines.
</description>
</method>
<method name="tile_set_occluder_offset">
diff --git a/doc/classes/Tween.xml b/doc/classes/Tween.xml
index f9320ac55e..1938a3facb 100644
--- a/doc/classes/Tween.xml
+++ b/doc/classes/Tween.xml
@@ -16,7 +16,7 @@
[/codeblock]
Many methods require a property name, such as [code]"position"[/code] above. You can find the correct property name by hovering over the property in the Inspector. You can also provide the components of a property directly by using [code]"property:component"[/code] (eg. [code]position:x[/code]), where it would only apply to that particular component.
Many of the methods accept [code]trans_type[/code] and [code]ease_type[/code]. The first accepts an [enum TransitionType] constant, and refers to the way the timing of the animation is handled (see [url=https://easings.net/]easings.net[/url] for some examples). The second accepts an [enum EaseType] constant, and controls the where [code]trans_type[/code] is applied to the interpolation (in the beginning, the end, or both). If you don't know which transition and easing to pick, you can try different [enum TransitionType] constants with [constant EASE_IN_OUT], and use the one that looks best.
- [b][url=https://raw.githubusercontent.com/godotengine/godot-docs/master/img/tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url][/b]
+ [url=https://raw.githubusercontent.com/godotengine/godot-docs/master/img/tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]
</description>
<tutorials>
</tutorials>
diff --git a/doc/classes/Vector2.xml b/doc/classes/Vector2.xml
index 7b02a1a4c9..64ebc1fa09 100644
--- a/doc/classes/Vector2.xml
+++ b/doc/classes/Vector2.xml
@@ -193,7 +193,7 @@
Returns the vector's length squared. Prefer this method over [method length] if you need to sort vectors or need the squared length for some formula.
</description>
</method>
- <method name="linear_interpolate">
+ <method name="lerp">
<return type="Vector2">
</return>
<argument index="0" name="b" type="Vector2">
diff --git a/doc/classes/Vector3.xml b/doc/classes/Vector3.xml
index 600c03ba7d..8c18ca8cc9 100644
--- a/doc/classes/Vector3.xml
+++ b/doc/classes/Vector3.xml
@@ -169,7 +169,7 @@
Returns the vector's length squared. Prefer this function over [method length] if you need to sort vectors or need the squared length for some formula.
</description>
</method>
- <method name="linear_interpolate">
+ <method name="lerp">
<return type="Vector3">
</return>
<argument index="0" name="b" type="Vector3">
diff --git a/doc/classes/Viewport.xml b/doc/classes/Viewport.xml
index a2d53f8e0c..3b52c80c9a 100644
--- a/doc/classes/Viewport.xml
+++ b/doc/classes/Viewport.xml
@@ -16,18 +16,18 @@
<link>https://docs.godotengine.org/en/latest/tutorials/viewports/index.html</link>
</tutorials>
<methods>
- <method name="find_world" qualifiers="const">
- <return type="World3D">
+ <method name="find_world_2d" qualifiers="const">
+ <return type="World2D">
</return>
<description>
- Returns the 3D world of the viewport, or if none the world of the parent viewport.
+ Returns the 2D world of the viewport.
</description>
</method>
- <method name="find_world_2d" qualifiers="const">
- <return type="World2D">
+ <method name="find_world_3d" qualifiers="const">
+ <return type="World3D">
</return>
<description>
- Returns the 2D world of the viewport.
+ Returns the 3D world of the viewport, or if none the world of the parent viewport.
</description>
</method>
<method name="get_camera" qualifiers="const">
@@ -219,8 +219,8 @@
<member name="msaa" type="int" setter="set_msaa" getter="get_msaa" enum="Viewport.MSAA" default="0">
The multisample anti-aliasing mode. A higher number results in smoother edges at the cost of significantly worse performance. A value of 4 is best unless targeting very high-end systems.
</member>
- <member name="own_world" type="bool" setter="set_use_own_world" getter="is_using_own_world" default="false">
- If [code]true[/code], the viewport will use [World3D] defined in [code]world[/code] property.
+ <member name="own_world_3d" type="bool" setter="set_use_own_world_3d" getter="is_using_own_world_3d" default="false">
+ If [code]true[/code], the viewport will use the [World3D] defined in [member world_3d].
</member>
<member name="physics_object_picking" type="bool" setter="set_physics_object_picking" getter="get_physics_object_picking" default="false">
If [code]true[/code], the objects rendered by viewport become subjects of mouse picking process.
@@ -247,12 +247,12 @@
<member name="transparent_bg" type="bool" setter="set_transparent_background" getter="has_transparent_background" default="false">
If [code]true[/code], the viewport should render its background as transparent.
</member>
- <member name="world" type="World3D" setter="set_world" getter="get_world">
- The custom [World3D] which can be used as 3D environment source.
- </member>
<member name="world_2d" type="World2D" setter="set_world_2d" getter="get_world_2d">
The custom [World2D] which can be used as 2D environment source.
</member>
+ <member name="world_3d" type="World3D" setter="set_world_3d" getter="get_world_3d">
+ The custom [World3D] which can be used as 3D environment source.
+ </member>
</members>
<signals>
<signal name="gui_focus_changed">
diff --git a/doc/classes/VisualShaderNodeUniform.xml b/doc/classes/VisualShaderNodeUniform.xml
index c4362f6f2a..1225d9c320 100644
--- a/doc/classes/VisualShaderNodeUniform.xml
+++ b/doc/classes/VisualShaderNodeUniform.xml
@@ -9,9 +9,17 @@
<methods>
</methods>
<members>
+ <member name="qualifier" type="int" setter="set_qualifier" getter="get_qualifier" enum="VisualShaderNodeUniform.Qualifier" default="0">
+ </member>
<member name="uniform_name" type="String" setter="set_uniform_name" getter="get_uniform_name" default="&quot;&quot;">
</member>
</members>
<constants>
+ <constant name="QUAL_NONE" value="0" enum="Qualifier">
+ </constant>
+ <constant name="QUAL_GLOBAL" value="1" enum="Qualifier">
+ </constant>
+ <constant name="QUAL_INSTANCE" value="2" enum="Qualifier">
+ </constant>
</constants>
</class>
diff --git a/doc/translations/classes.pot b/doc/translations/classes.pot
index 641d80c5ca..d58b9d9472 100644
--- a/doc/translations/classes.pot
+++ b/doc/translations/classes.pot
@@ -480,7 +480,7 @@ msgid ""
"[float], the return value is a [float].\n"
"If both are of the same vector type ([Vector2], [Vector3] or [Color]), the "
"return value will be of the same type ([code]lerp[/code] then calls the "
-"vector type's [code]linear_interpolate[/code] method).\n"
+"vector type's [code]lerp[/code] method).\n"
"[codeblock]\n"
"lerp(0, 4, 0.75) # Returns 3.0\n"
"lerp(Vector2(1, 5), Vector2(3, 2), 0.5) # Returns Vector2(2, 3.5)\n"
@@ -1204,19 +1204,19 @@ msgid ""
msgstr ""
#: doc/classes/@GlobalScope.xml:16
-msgid "The [ARVRServer] singleton."
+msgid "The [AudioServer] singleton."
msgstr ""
#: doc/classes/@GlobalScope.xml:19
-msgid "The [AudioServer] singleton."
+msgid "The [CameraServer] singleton."
msgstr ""
#: doc/classes/@GlobalScope.xml:22
-msgid "The [CameraServer] singleton."
+msgid "The [ClassDB] singleton."
msgstr ""
#: doc/classes/@GlobalScope.xml:25
-msgid "The [ClassDB] singleton."
+msgid "The [DisplayServer] singleton."
msgstr ""
#: doc/classes/@GlobalScope.xml:28
@@ -1228,90 +1228,89 @@ msgid "The [Geometry] singleton."
msgstr ""
#: doc/classes/@GlobalScope.xml:34
-msgid ""
-"The [GodotSharp] singleton. Only available when using Godot's Mono build."
+msgid "The [IP] singleton."
msgstr ""
#: doc/classes/@GlobalScope.xml:37
-msgid "The [IP] singleton."
+msgid "The [Input] singleton."
msgstr ""
#: doc/classes/@GlobalScope.xml:40
-msgid "The [InputFilter] singleton."
-msgstr ""
-
-#: doc/classes/@GlobalScope.xml:43
msgid "The [InputMap] singleton."
msgstr ""
-#: doc/classes/@GlobalScope.xml:46
+#: doc/classes/@GlobalScope.xml:43
msgid "The [JSON] singleton."
msgstr ""
-#: doc/classes/@GlobalScope.xml:49
+#: doc/classes/@GlobalScope.xml:46
msgid ""
"The [JavaClassWrapper] singleton.\n"
"[b]Note:[/b] Only implemented on Android."
msgstr ""
-#: doc/classes/@GlobalScope.xml:53
+#: doc/classes/@GlobalScope.xml:50
msgid ""
"The [JavaScript] singleton.\n"
"[b]Note:[/b] Only implemented on HTML5."
msgstr ""
-#: doc/classes/@GlobalScope.xml:57
+#: doc/classes/@GlobalScope.xml:54
msgid "The [Marshalls] singleton."
msgstr ""
-#: doc/classes/@GlobalScope.xml:60
+#: doc/classes/@GlobalScope.xml:57
msgid "The [NavigationMeshGenerator] singleton."
msgstr ""
-#: doc/classes/@GlobalScope.xml:63 doc/classes/@GlobalScope.xml:66
+#: doc/classes/@GlobalScope.xml:60 doc/classes/@GlobalScope.xml:63
msgid "The [NavigationServer2D] singleton."
msgstr ""
-#: doc/classes/@GlobalScope.xml:69
+#: doc/classes/@GlobalScope.xml:66
msgid "The [OS] singleton."
msgstr ""
-#: doc/classes/@GlobalScope.xml:72
+#: doc/classes/@GlobalScope.xml:69
msgid "The [Performance] singleton."
msgstr ""
-#: doc/classes/@GlobalScope.xml:75
+#: doc/classes/@GlobalScope.xml:72
msgid "The [PhysicsServer2D] singleton."
msgstr ""
-#: doc/classes/@GlobalScope.xml:78
+#: doc/classes/@GlobalScope.xml:75
msgid "The [PhysicsServer3D] singleton."
msgstr ""
-#: doc/classes/@GlobalScope.xml:81
+#: doc/classes/@GlobalScope.xml:78
msgid "The [ProjectSettings] singleton."
msgstr ""
-#: doc/classes/@GlobalScope.xml:84
+#: doc/classes/@GlobalScope.xml:81
msgid "The [RenderingServer] singleton."
msgstr ""
-#: doc/classes/@GlobalScope.xml:87
+#: doc/classes/@GlobalScope.xml:84
msgid "The [ResourceLoader] singleton."
msgstr ""
-#: doc/classes/@GlobalScope.xml:90
+#: doc/classes/@GlobalScope.xml:87
msgid "The [ResourceSaver] singleton."
msgstr ""
-#: doc/classes/@GlobalScope.xml:93
+#: doc/classes/@GlobalScope.xml:90
msgid "The [TranslationServer] singleton."
msgstr ""
-#: doc/classes/@GlobalScope.xml:96
+#: doc/classes/@GlobalScope.xml:93
msgid "The [VisualScriptEditor] singleton."
msgstr ""
+#: doc/classes/@GlobalScope.xml:96
+msgid "The [XRServer] singleton."
+msgstr ""
+
#: doc/classes/@GlobalScope.xml:101
msgid "Left margin, usually used for [Control] or [StyleBox]-derived classes."
msgstr ""
@@ -1394,7 +1393,7 @@ msgid "Tab key."
msgstr ""
#: doc/classes/@GlobalScope.xml:158
-msgid "Shift+Tab key."
+msgid "Shift + Tab key."
msgstr ""
#: doc/classes/@GlobalScope.xml:161
@@ -3124,305 +3123,311 @@ msgid "Used to categorize properties together in the editor."
msgstr ""
#: doc/classes/@GlobalScope.xml:1424
-msgid "The property does not save its state in [PackedScene]."
+msgid ""
+"Used to group properties together in the editor in a subgroup (under a "
+"group)."
msgstr ""
#: doc/classes/@GlobalScope.xml:1427
-msgid "Editing the property prompts the user for restarting the editor."
+msgid "The property does not save its state in [PackedScene]."
msgstr ""
#: doc/classes/@GlobalScope.xml:1430
+msgid "Editing the property prompts the user for restarting the editor."
+msgstr ""
+
+#: doc/classes/@GlobalScope.xml:1433
msgid ""
"The property is a script variable which should be serialized and saved in "
"the scene file."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1433
+#: doc/classes/@GlobalScope.xml:1436
msgid "Default usage (storage, editor and network)."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1436
+#: doc/classes/@GlobalScope.xml:1439
msgid ""
"Default usage for translatable strings (storage, editor, network and "
"internationalized)."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1439
+#: doc/classes/@GlobalScope.xml:1442
msgid ""
"Default usage but without showing the property in the editor (storage, "
"network)."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1442
+#: doc/classes/@GlobalScope.xml:1445
msgid "Flag for a normal method."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1445
+#: doc/classes/@GlobalScope.xml:1448
msgid "Flag for an editor method."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1448 doc/classes/@GlobalScope.xml:1454
-#: doc/classes/@GlobalScope.xml:1460
+#: doc/classes/@GlobalScope.xml:1451 doc/classes/@GlobalScope.xml:1457
+#: doc/classes/@GlobalScope.xml:1463
msgid "Deprecated method flag, unused."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1451
+#: doc/classes/@GlobalScope.xml:1454
msgid "Flag for a constant method."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1457
+#: doc/classes/@GlobalScope.xml:1460
msgid "Flag for a virtual method."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1463
+#: doc/classes/@GlobalScope.xml:1466
msgid "Default method flags."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1466
+#: doc/classes/@GlobalScope.xml:1469
msgid "Variable is [code]null[/code]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1469
+#: doc/classes/@GlobalScope.xml:1472
msgid "Variable is of type [bool]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1472
+#: doc/classes/@GlobalScope.xml:1475
msgid "Variable is of type [int]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1475
+#: doc/classes/@GlobalScope.xml:1478
msgid "Variable is of type [float] (real)."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1478
+#: doc/classes/@GlobalScope.xml:1481
msgid "Variable is of type [String]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1481
+#: doc/classes/@GlobalScope.xml:1484
msgid "Variable is of type [Vector2]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1484
+#: doc/classes/@GlobalScope.xml:1487
msgid "Variable is of type [Vector2i]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1487
+#: doc/classes/@GlobalScope.xml:1490
msgid "Variable is of type [Rect2]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1490
+#: doc/classes/@GlobalScope.xml:1493
msgid "Variable is of type [Rect2i]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1493
+#: doc/classes/@GlobalScope.xml:1496
msgid "Variable is of type [Vector3]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1496
+#: doc/classes/@GlobalScope.xml:1499
msgid "Variable is of type [Vector3i]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1499
+#: doc/classes/@GlobalScope.xml:1502
msgid "Variable is of type [Transform2D]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1502
+#: doc/classes/@GlobalScope.xml:1505
msgid "Variable is of type [Plane]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1505
+#: doc/classes/@GlobalScope.xml:1508
msgid "Variable is of type [Quat]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1508
+#: doc/classes/@GlobalScope.xml:1511
msgid "Variable is of type [AABB]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1511
+#: doc/classes/@GlobalScope.xml:1514
msgid "Variable is of type [Basis]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1514
+#: doc/classes/@GlobalScope.xml:1517
msgid "Variable is of type [Transform]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1517
+#: doc/classes/@GlobalScope.xml:1520
msgid "Variable is of type [Color]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1520
+#: doc/classes/@GlobalScope.xml:1523
msgid "Variable is of type [StringName]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1523
+#: doc/classes/@GlobalScope.xml:1526
msgid "Variable is of type [NodePath]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1526
+#: doc/classes/@GlobalScope.xml:1529
msgid "Variable is of type [RID]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1529
+#: doc/classes/@GlobalScope.xml:1532
msgid "Variable is of type [Object]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1532
+#: doc/classes/@GlobalScope.xml:1535
msgid "Variable is of type [Callable]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1535
+#: doc/classes/@GlobalScope.xml:1538
msgid "Variable is of type [Signal]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1538
+#: doc/classes/@GlobalScope.xml:1541
msgid "Variable is of type [Dictionary]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1541
+#: doc/classes/@GlobalScope.xml:1544
msgid "Variable is of type [Array]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1544
+#: doc/classes/@GlobalScope.xml:1547
msgid "Variable is of type [PackedByteArray]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1547
+#: doc/classes/@GlobalScope.xml:1550
msgid "Variable is of type [PackedInt32Array]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1550
+#: doc/classes/@GlobalScope.xml:1553
msgid "Variable is of type [PackedInt64Array]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1553
+#: doc/classes/@GlobalScope.xml:1556
msgid "Variable is of type [PackedFloat32Array]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1556
+#: doc/classes/@GlobalScope.xml:1559
msgid "Variable is of type [PackedFloat64Array]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1559
+#: doc/classes/@GlobalScope.xml:1562
msgid "Variable is of type [PackedStringArray]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1562
+#: doc/classes/@GlobalScope.xml:1565
msgid "Variable is of type [PackedVector2Array]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1565
+#: doc/classes/@GlobalScope.xml:1568
msgid "Variable is of type [PackedVector3Array]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1568
+#: doc/classes/@GlobalScope.xml:1571
msgid "Variable is of type [PackedColorArray]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1571
+#: doc/classes/@GlobalScope.xml:1574
msgid "Represents the size of the [enum Variant.Type] enum."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1574
+#: doc/classes/@GlobalScope.xml:1577
msgid "Equality operator ([code]==[/code])."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1577
+#: doc/classes/@GlobalScope.xml:1580
msgid "Inequality operator ([code]!=[/code])."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1580
+#: doc/classes/@GlobalScope.xml:1583
msgid "Less than operator ([code]<[/code])."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1583
+#: doc/classes/@GlobalScope.xml:1586
msgid "Less than or equal operator ([code]<=[/code])."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1586
+#: doc/classes/@GlobalScope.xml:1589
msgid "Greater than operator ([code]>[/code])."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1589
+#: doc/classes/@GlobalScope.xml:1592
msgid "Greater than or equal operator ([code]>=[/code])."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1592
+#: doc/classes/@GlobalScope.xml:1595
msgid "Addition operator ([code]+[/code])."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1595
+#: doc/classes/@GlobalScope.xml:1598
msgid "Subtraction operator ([code]-[/code])."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1598
+#: doc/classes/@GlobalScope.xml:1601
msgid "Multiplication operator ([code]*[/code])."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1601
+#: doc/classes/@GlobalScope.xml:1604
msgid "Division operator ([code]/[/code])."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1604
+#: doc/classes/@GlobalScope.xml:1607
msgid "Unary negation operator ([code]-[/code])."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1607
+#: doc/classes/@GlobalScope.xml:1610
msgid "Unary plus operator ([code]+[/code])."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1610
+#: doc/classes/@GlobalScope.xml:1613
msgid "Remainder/modulo operator ([code]%[/code])."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1613
+#: doc/classes/@GlobalScope.xml:1616
msgid "String concatenation operator ([code]+[/code])."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1616
+#: doc/classes/@GlobalScope.xml:1619
msgid "Left shift operator ([code]<<[/code])."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1619
+#: doc/classes/@GlobalScope.xml:1622
msgid "Right shift operator ([code]>>[/code])."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1622
+#: doc/classes/@GlobalScope.xml:1625
msgid "Bitwise AND operator ([code]&[/code])."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1625
+#: doc/classes/@GlobalScope.xml:1628
msgid "Bitwise OR operator ([code]|[/code])."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1628
+#: doc/classes/@GlobalScope.xml:1631
msgid "Bitwise XOR operator ([code]^[/code])."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1631
+#: doc/classes/@GlobalScope.xml:1634
msgid "Bitwise NOT operator ([code]~[/code])."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1634
+#: doc/classes/@GlobalScope.xml:1637
msgid "Logical AND operator ([code]and[/code] or [code]&&[/code])."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1637
+#: doc/classes/@GlobalScope.xml:1640
msgid "Logical OR operator ([code]or[/code] or [code]||[/code])."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1640
+#: doc/classes/@GlobalScope.xml:1643
msgid "Logical XOR operator (not implemented in GDScript)."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1643
+#: doc/classes/@GlobalScope.xml:1646
msgid "Logical NOT operator ([code]not[/code] or [code]![/code])."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1646
+#: doc/classes/@GlobalScope.xml:1649
msgid "Logical IN operator ([code]in[/code])."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1649
+#: doc/classes/@GlobalScope.xml:1652
msgid "Represents the size of the [enum Variant.Operator] enum."
msgstr ""
@@ -3794,6 +3799,10 @@ msgid ""
msgstr ""
#: doc/classes/AnimatedTexture.xml:65
+msgid "Sets the currently visible frame of the texture."
+msgstr ""
+
+#: doc/classes/AnimatedTexture.xml:68
msgid ""
"Animation speed in frames per second. This value defines the default time "
"interval between two frames of the animation, and thus the overall duration "
@@ -3804,7 +3813,7 @@ msgid ""
"code] value of 2 will run for 4 seconds, with each frame lasting 0.5 seconds."
msgstr ""
-#: doc/classes/AnimatedTexture.xml:69
+#: doc/classes/AnimatedTexture.xml:72
msgid ""
"Number of frames to use in the animation. While you can create the frames "
"independently with [method set_frame_texture], you need to set this value "
@@ -3812,7 +3821,21 @@ msgid ""
"frames is [constant MAX_FRAMES]."
msgstr ""
-#: doc/classes/AnimatedTexture.xml:74
+#: doc/classes/AnimatedTexture.xml:75
+msgid ""
+"If [code]true[/code], the animation will only play once and will not loop "
+"back to the first frame after reaching the end. Note that reaching the end "
+"will not set [member pause] to [code]true[/code]."
+msgstr ""
+
+#: doc/classes/AnimatedTexture.xml:78
+msgid ""
+"If [code]true[/code], the animation will pause where it currently is (i.e. "
+"at [member current_frame]). The animation will continue from where it was "
+"paused when changing this property to [code]false[/code]."
+msgstr ""
+
+#: doc/classes/AnimatedTexture.xml:83
msgid ""
"The maximum number of frames supported by [AnimatedTexture]. If you need "
"more frames in your animation, use [AnimationPlayer] or [AnimatedSprite2D]."
@@ -6092,22 +6115,27 @@ msgid ""
"var m = MeshInstance3D.new()\n"
"m.mesh = arr_mesh\n"
"[/codeblock]\n"
-"The [MeshInstance3D] is ready to be added to the [SceneTree] to be shown."
+"The [MeshInstance3D] is ready to be added to the [SceneTree] to be shown.\n"
+"See also [ImmediateGeometry3D], [MeshDataTool] and [SurfaceTool] for "
+"procedural geometry generation.\n"
+"[b]Note:[/b] Godot uses clockwise [url=https://learnopengl.com/Advanced-"
+"OpenGL/Face-culling]winding order[/url] for front faces of triangle "
+"primitive modes."
msgstr ""
-#: doc/classes/ArrayMesh.xml:27
+#: doc/classes/ArrayMesh.xml:29
msgid ""
"https://docs.godotengine.org/en/latest/tutorials/content/procedural_geometry/"
"arraymesh.html"
msgstr ""
-#: doc/classes/ArrayMesh.xml:36
+#: doc/classes/ArrayMesh.xml:38
msgid ""
"Adds name for a blend shape that will be added with [method "
"add_surface_from_arrays]. Must be called before surface is added."
msgstr ""
-#: doc/classes/ArrayMesh.xml:55
+#: doc/classes/ArrayMesh.xml:57
msgid ""
"Creates a new surface.\n"
"Surfaces are created to be rendered using a [code]primitive[/code], which "
@@ -6125,141 +6153,139 @@ msgid ""
"it is used.\n"
"Adding an index array puts this function into \"index mode\" where the "
"vertex and other arrays become the sources of data, and the index array "
-"defines the order of the vertices.\n"
-"Godot uses clockwise winding order for front faces of triangle primitive "
-"modes."
+"defines the order of the vertices."
msgstr ""
-#: doc/classes/ArrayMesh.xml:66
+#: doc/classes/ArrayMesh.xml:67
msgid "Removes all blend shapes from this [ArrayMesh]."
msgstr ""
-#: doc/classes/ArrayMesh.xml:73
+#: doc/classes/ArrayMesh.xml:74
msgid "Removes all surfaces from this [ArrayMesh]."
msgstr ""
-#: doc/classes/ArrayMesh.xml:80
+#: doc/classes/ArrayMesh.xml:81
msgid "Returns the number of blend shapes that the [ArrayMesh] holds."
msgstr ""
-#: doc/classes/ArrayMesh.xml:89
+#: doc/classes/ArrayMesh.xml:90
msgid "Returns the name of the blend shape at this index."
msgstr ""
-#: doc/classes/ArrayMesh.xml:100
+#: doc/classes/ArrayMesh.xml:101
msgid ""
"Will perform a UV unwrap on the [ArrayMesh] to prepare the mesh for "
"lightmapping."
msgstr ""
-#: doc/classes/ArrayMesh.xml:107
+#: doc/classes/ArrayMesh.xml:108
msgid "Will regenerate normal maps for the [ArrayMesh]."
msgstr ""
-#: doc/classes/ArrayMesh.xml:116
+#: doc/classes/ArrayMesh.xml:117
msgid ""
"Returns the index of the first surface with this name held within this "
"[ArrayMesh]. If none are found, -1 is returned."
msgstr ""
-#: doc/classes/ArrayMesh.xml:125
+#: doc/classes/ArrayMesh.xml:126
msgid ""
"Returns the length in indices of the index array in the requested surface "
"(see [method add_surface_from_arrays])."
msgstr ""
-#: doc/classes/ArrayMesh.xml:134
+#: doc/classes/ArrayMesh.xml:135
msgid ""
"Returns the length in vertices of the vertex array in the requested surface "
"(see [method add_surface_from_arrays])."
msgstr ""
-#: doc/classes/ArrayMesh.xml:143
+#: doc/classes/ArrayMesh.xml:144
msgid ""
"Returns the format mask of the requested surface (see [method "
"add_surface_from_arrays])."
msgstr ""
-#: doc/classes/ArrayMesh.xml:152
+#: doc/classes/ArrayMesh.xml:153
msgid "Gets the name assigned to this surface."
msgstr ""
-#: doc/classes/ArrayMesh.xml:161
+#: doc/classes/ArrayMesh.xml:162
msgid ""
"Returns the primitive type of the requested surface (see [method "
"add_surface_from_arrays])."
msgstr ""
-#: doc/classes/ArrayMesh.xml:172
+#: doc/classes/ArrayMesh.xml:173
msgid "Sets a name for a given surface."
msgstr ""
-#: doc/classes/ArrayMesh.xml:185
+#: doc/classes/ArrayMesh.xml:186
msgid ""
"Updates a specified region of mesh arrays on the GPU.\n"
"[b]Warning:[/b] Only use if you know what you are doing. You can easily "
"cause crashes by calling this function with improper arguments."
msgstr ""
-#: doc/classes/ArrayMesh.xml:192
+#: doc/classes/ArrayMesh.xml:193
msgid "Sets the blend shape mode to one of [enum Mesh.BlendShapeMode]."
msgstr ""
-#: doc/classes/ArrayMesh.xml:195
+#: doc/classes/ArrayMesh.xml:196
msgid ""
"Overrides the [AABB] with one defined by user for use with frustum culling. "
"Especially useful to avoid unexpected culling when using a shader to offset "
"vertices."
msgstr ""
-#: doc/classes/ArrayMesh.xml:200
+#: doc/classes/ArrayMesh.xml:201
msgid "Default value used for index_array_len when no indices are present."
msgstr ""
-#: doc/classes/ArrayMesh.xml:203
+#: doc/classes/ArrayMesh.xml:204
msgid "Amount of weights/bone indices per vertex (always 4)."
msgstr ""
-#: doc/classes/ArrayMesh.xml:206
+#: doc/classes/ArrayMesh.xml:207
msgid ""
"[PackedVector3Array], [PackedVector2Array], or [Array] of vertex positions."
msgstr ""
-#: doc/classes/ArrayMesh.xml:209
+#: doc/classes/ArrayMesh.xml:210
msgid "[PackedVector3Array] of vertex normals."
msgstr ""
-#: doc/classes/ArrayMesh.xml:212
+#: doc/classes/ArrayMesh.xml:213
msgid ""
"[PackedFloat32Array] of vertex tangents. Each element in groups of 4 floats, "
"first 3 floats determine the tangent, and the last the binormal direction as "
"-1 or 1."
msgstr ""
-#: doc/classes/ArrayMesh.xml:215
+#: doc/classes/ArrayMesh.xml:216
msgid "[PackedColorArray] of vertex colors."
msgstr ""
-#: doc/classes/ArrayMesh.xml:218
+#: doc/classes/ArrayMesh.xml:219
msgid "[PackedVector2Array] for UV coordinates."
msgstr ""
-#: doc/classes/ArrayMesh.xml:221
+#: doc/classes/ArrayMesh.xml:222
msgid "[PackedVector2Array] for second UV coordinates."
msgstr ""
-#: doc/classes/ArrayMesh.xml:224
+#: doc/classes/ArrayMesh.xml:225
msgid ""
"[PackedFloat32Array] or [PackedInt32Array] of bone indices. Each element in "
"groups of 4 floats."
msgstr ""
-#: doc/classes/ArrayMesh.xml:227
+#: doc/classes/ArrayMesh.xml:228
msgid ""
"[PackedFloat32Array] of bone weights. Each element in groups of 4 floats."
msgstr ""
-#: doc/classes/ArrayMesh.xml:230
+#: doc/classes/ArrayMesh.xml:231
msgid ""
"[PackedInt32Array] of integers used as indices referencing vertices, colors, "
"normals, tangents, and textures. All of those arrays must have the same "
@@ -6273,709 +6299,47 @@ msgid ""
"the start and end of each line."
msgstr ""
-#: doc/classes/ArrayMesh.xml:234 doc/classes/Mesh.xml:210
-#: doc/classes/RenderingServer.xml:3180
+#: doc/classes/ArrayMesh.xml:235 doc/classes/Mesh.xml:210
+#: doc/classes/RenderingServer.xml:3232
msgid "Represents the size of the [enum ArrayType] enum."
msgstr ""
-#: doc/classes/ArrayMesh.xml:237
+#: doc/classes/ArrayMesh.xml:238
msgid "Array format will include vertices (mandatory)."
msgstr ""
-#: doc/classes/ArrayMesh.xml:240
+#: doc/classes/ArrayMesh.xml:241
msgid "Array format will include normals."
msgstr ""
-#: doc/classes/ArrayMesh.xml:243
+#: doc/classes/ArrayMesh.xml:244
msgid "Array format will include tangents."
msgstr ""
-#: doc/classes/ArrayMesh.xml:246
+#: doc/classes/ArrayMesh.xml:247
msgid "Array format will include a color array."
msgstr ""
-#: doc/classes/ArrayMesh.xml:249
+#: doc/classes/ArrayMesh.xml:250
msgid "Array format will include UVs."
msgstr ""
-#: doc/classes/ArrayMesh.xml:252
+#: doc/classes/ArrayMesh.xml:253
msgid "Array format will include another set of UVs."
msgstr ""
-#: doc/classes/ArrayMesh.xml:255
+#: doc/classes/ArrayMesh.xml:256
msgid "Array format will include bone indices."
msgstr ""
-#: doc/classes/ArrayMesh.xml:258
+#: doc/classes/ArrayMesh.xml:259
msgid "Array format will include bone weights."
msgstr ""
-#: doc/classes/ArrayMesh.xml:261
+#: doc/classes/ArrayMesh.xml:262
msgid "Index array will be used."
msgstr ""
-#: doc/classes/ARVRAnchor.xml:4
-msgid "An anchor point in AR space."
-msgstr ""
-
-#: doc/classes/ARVRAnchor.xml:7
-msgid ""
-"The [ARVRAnchor] point is a spatial node that maps a real world location "
-"identified by the AR platform to a position within the game world. For "
-"example, as long as plane detection in ARKit is on, ARKit will identify and "
-"update the position of planes (tables, floors, etc) and create anchors for "
-"them.\n"
-"This node is mapped to one of the anchors through its unique ID. When you "
-"receive a signal that a new anchor is available, you should add this node to "
-"your scene for that anchor. You can predefine nodes and set the ID; the "
-"nodes will simply remain on 0,0,0 until a plane is recognized.\n"
-"Keep in mind that, as long as plane detection is enabled, the size, placing "
-"and orientation of an anchor will be updated as the detection logic learns "
-"more about the real world out there especially if only part of the surface "
-"is in view."
-msgstr ""
-
-#: doc/classes/ARVRAnchor.xml:18
-msgid "Returns the name given to this anchor."
-msgstr ""
-
-#: doc/classes/ARVRAnchor.xml:25
-msgid ""
-"Returns [code]true[/code] if the anchor is being tracked and [code]false[/"
-"code] if no anchor with this ID is currently known."
-msgstr ""
-
-#: doc/classes/ARVRAnchor.xml:32
-msgid ""
-"If provided by the [ARVRInterface], this returns a mesh object for the "
-"anchor. For an anchor, this can be a shape related to the object being "
-"tracked or it can be a mesh that provides topology related to the anchor and "
-"can be used to create shadows/reflections on surfaces or for generating "
-"collision shapes."
-msgstr ""
-
-#: doc/classes/ARVRAnchor.xml:39
-msgid ""
-"Returns a plane aligned with our anchor; handy for intersection testing."
-msgstr ""
-
-#: doc/classes/ARVRAnchor.xml:46
-msgid ""
-"Returns the estimated size of the plane that was detected. Say when the "
-"anchor relates to a table in the real world, this is the estimated size of "
-"the surface of that table."
-msgstr ""
-
-#: doc/classes/ARVRAnchor.xml:52
-msgid ""
-"The anchor's ID. You can set this before the anchor itself exists. The first "
-"anchor gets an ID of [code]1[/code], the second an ID of [code]2[/code], "
-"etc. When anchors get removed, the engine can then assign the corresponding "
-"ID to new anchors. The most common situation where anchors \"disappear\" is "
-"when the AR server identifies that two anchors represent different parts of "
-"the same plane and merges them."
-msgstr ""
-
-#: doc/classes/ARVRAnchor.xml:60
-msgid ""
-"Emitted when the mesh associated with the anchor changes or when one becomes "
-"available. This is especially important for topology that is constantly "
-"being [code]mesh_updated[/code]."
-msgstr ""
-
-#: doc/classes/ARVRCamera.xml:4
-msgid ""
-"A camera node with a few overrules for AR/VR applied, such as location "
-"tracking."
-msgstr ""
-
-#: doc/classes/ARVRCamera.xml:7
-msgid ""
-"This is a helper spatial node for our camera; note that, if stereoscopic "
-"rendering is applicable (VR-HMD), most of the camera properties are ignored, "
-"as the HMD information overrides them. The only properties that can be "
-"trusted are the near and far planes.\n"
-"The position and orientation of this node is automatically updated by the "
-"ARVR Server to represent the location of the HMD if such tracking is "
-"available and can thus be used by game logic. Note that, in contrast to the "
-"ARVR Controller, the render thread has access to the most up-to-date "
-"tracking data of the HMD and the location of the ARVRCamera can lag a few "
-"milliseconds behind what is used for rendering as a result."
-msgstr ""
-
-#: doc/classes/ARVRCamera.xml:11 doc/classes/ARVRController.xml:12
-#: doc/classes/ARVRInterface.xml:11 doc/classes/ARVROrigin.xml:13
-#: doc/classes/ARVRPositionalTracker.xml:12 doc/classes/ARVRServer.xml:10
-msgid "https://docs.godotengine.org/en/latest/tutorials/vr/index.html"
-msgstr ""
-
-#: doc/classes/ARVRController.xml:4
-msgid "A spatial node representing a spatially-tracked controller."
-msgstr ""
-
-#: doc/classes/ARVRController.xml:7
-msgid ""
-"This is a helper spatial node that is linked to the tracking of controllers. "
-"It also offers several handy passthroughs to the state of buttons and such "
-"on the controllers.\n"
-"Controllers are linked by their ID. You can create controller nodes before "
-"the controllers are available. If your game always uses two controllers (one "
-"for each hand), you can predefine the controllers with ID 1 and 2; they will "
-"become active as soon as the controllers are identified. If you expect "
-"additional controllers to be used, you should react to the signals and add "
-"ARVRController nodes to your scene.\n"
-"The position of the controller node is automatically updated by the "
-"[ARVRServer]. This makes this node ideal to add child nodes to visualize the "
-"controller."
-msgstr ""
-
-#: doc/classes/ARVRController.xml:19
-msgid ""
-"If active, returns the name of the associated controller if provided by the "
-"AR/VR SDK used."
-msgstr ""
-
-#: doc/classes/ARVRController.xml:26
-msgid ""
-"Returns the hand holding this controller, if known. See [enum "
-"ARVRPositionalTracker.TrackerHand]."
-msgstr ""
-
-#: doc/classes/ARVRController.xml:33
-msgid ""
-"Returns [code]true[/code] if the bound controller is active. ARVR systems "
-"attempt to track active controllers."
-msgstr ""
-
-#: doc/classes/ARVRController.xml:42
-msgid ""
-"Returns the value of the given axis for things like triggers, touchpads, "
-"etc. that are embedded into the controller."
-msgstr ""
-
-#: doc/classes/ARVRController.xml:49
-msgid ""
-"Returns the ID of the joystick object bound to this. Every controller "
-"tracked by the [ARVRServer] that has buttons and axis will also be "
-"registered as a joystick within Godot. This means that all the normal "
-"joystick tracking and input mapping will work for buttons and axis found on "
-"the AR/VR controllers. This ID is purely offered as information so you can "
-"link up the controller with its joystick entry."
-msgstr ""
-
-#: doc/classes/ARVRController.xml:56
-msgid ""
-"If provided by the [ARVRInterface], this returns a mesh associated with the "
-"controller. This can be used to visualize the controller."
-msgstr ""
-
-#: doc/classes/ARVRController.xml:65
-msgid ""
-"Returns [code]true[/code] if the button at index [code]button[/code] is "
-"pressed. See [enum JoystickList], in particular the [code]JOY_VR_*[/code] "
-"constants."
-msgstr ""
-
-#: doc/classes/ARVRController.xml:71
-msgid ""
-"The controller's ID.\n"
-"A controller ID of 0 is unbound and will always result in an inactive node. "
-"Controller ID 1 is reserved for the first controller that identifies itself "
-"as the left-hand controller and ID 2 is reserved for the first controller "
-"that identifies itself as the right-hand controller.\n"
-"For any other controller that the [ARVRServer] detects, we continue with "
-"controller ID 3.\n"
-"When a controller is turned off, its slot is freed. This ensures controllers "
-"will keep the same ID even when controllers with lower IDs are turned off."
-msgstr ""
-
-#: doc/classes/ARVRController.xml:77
-msgid ""
-"The degree to which the controller vibrates. Ranges from [code]0.0[/code] to "
-"[code]1.0[/code] with precision [code].01[/code]. If changed, updates "
-"[member ARVRPositionalTracker.rumble] accordingly.\n"
-"This is a useful property to animate if you want the controller to vibrate "
-"for a limited duration."
-msgstr ""
-
-#: doc/classes/ARVRController.xml:86
-msgid "Emitted when a button on this controller is pressed."
-msgstr ""
-
-#: doc/classes/ARVRController.xml:93
-msgid "Emitted when a button on this controller is released."
-msgstr ""
-
-#: doc/classes/ARVRController.xml:100
-msgid ""
-"Emitted when the mesh associated with the controller changes or when one "
-"becomes available. Generally speaking this will be a static mesh after "
-"becoming available."
-msgstr ""
-
-#: doc/classes/ARVRInterface.xml:4
-msgid "Base class for an AR/VR interface implementation."
-msgstr ""
-
-#: doc/classes/ARVRInterface.xml:7
-msgid ""
-"This class needs to be implemented to make an AR or VR platform available to "
-"Godot and these should be implemented as C++ modules or GDNative modules "
-"(note that for GDNative the subclass ARVRScriptInterface should be used). "
-"Part of the interface is exposed to GDScript so you can detect, enable and "
-"configure an AR or VR platform.\n"
-"Interfaces should be written in such a way that simply enabling them will "
-"give us a working setup. You can query the available interfaces through "
-"[ARVRServer]."
-msgstr ""
-
-#: doc/classes/ARVRInterface.xml:18
-msgid ""
-"If this is an AR interface that requires displaying a camera feed as the "
-"background, this method returns the feed ID in the [CameraServer] for this "
-"interface."
-msgstr ""
-
-#: doc/classes/ARVRInterface.xml:25
-msgid ""
-"Returns a combination of [enum Capabilities] flags providing information "
-"about the capabilities of this interface."
-msgstr ""
-
-#: doc/classes/ARVRInterface.xml:32
-msgid "Returns the name of this interface (OpenVR, OpenHMD, ARKit, etc)."
-msgstr ""
-
-#: doc/classes/ARVRInterface.xml:39
-msgid ""
-"Returns the resolution at which we should render our intermediate results "
-"before things like lens distortion are applied by the VR platform."
-msgstr ""
-
-#: doc/classes/ARVRInterface.xml:46
-msgid ""
-"If supported, returns the status of our tracking. This will allow you to "
-"provide feedback to the user whether there are issues with positional "
-"tracking."
-msgstr ""
-
-#: doc/classes/ARVRInterface.xml:53
-msgid ""
-"Call this to initialize this interface. The first interface that is "
-"initialized is identified as the primary interface and it will be used for "
-"rendering output.\n"
-"After initializing the interface you want to use you then need to enable the "
-"AR/VR mode of a viewport and rendering should commence.\n"
-"[b]Note:[/b] You must enable the AR/VR mode on the main viewport for any "
-"device that uses the main output of Godot, such as for mobile VR.\n"
-"If you do this for a platform that handles its own output (such as OpenVR) "
-"Godot will show just one eye without distortion on screen. Alternatively, "
-"you can add a separate viewport node to your scene and enable AR/VR on that "
-"viewport. It will be used to output to the HMD, leaving you free to do "
-"anything you like in the main window, such as using a separate camera as a "
-"spectator camera or rendering something completely different.\n"
-"While currently not used, you can activate additional interfaces. You may "
-"wish to do this if you want to track controllers from other platforms. "
-"However, at this point in time only one interface can render to an HMD."
-msgstr ""
-
-#: doc/classes/ARVRInterface.xml:64
-msgid ""
-"Returns [code]true[/code] if the current output of this interface is in "
-"stereo."
-msgstr ""
-
-#: doc/classes/ARVRInterface.xml:71
-msgid "Turns the interface off."
-msgstr ""
-
-#: doc/classes/ARVRInterface.xml:77
-msgid "On an AR interface, [code]true[/code] if anchor detection is enabled."
-msgstr ""
-
-#: doc/classes/ARVRInterface.xml:80
-msgid "[code]true[/code] if this interface been initialized."
-msgstr ""
-
-#: doc/classes/ARVRInterface.xml:83
-msgid "[code]true[/code] if this is the primary interface."
-msgstr ""
-
-#: doc/classes/ARVRInterface.xml:88
-msgid "No ARVR capabilities."
-msgstr ""
-
-#: doc/classes/ARVRInterface.xml:91
-msgid ""
-"This interface can work with normal rendering output (non-HMD based AR)."
-msgstr ""
-
-#: doc/classes/ARVRInterface.xml:94
-msgid "This interface supports stereoscopic rendering."
-msgstr ""
-
-#: doc/classes/ARVRInterface.xml:97
-msgid "This interface supports AR (video background and real world tracking)."
-msgstr ""
-
-#: doc/classes/ARVRInterface.xml:100
-msgid ""
-"This interface outputs to an external device. If the main viewport is used, "
-"the on screen output is an unmodified buffer of either the left or right eye "
-"(stretched if the viewport size is not changed to the same aspect ratio of "
-"[method get_render_targetsize]). Using a separate viewport node frees up the "
-"main viewport for other purposes."
-msgstr ""
-
-#: doc/classes/ARVRInterface.xml:103
-msgid ""
-"Mono output, this is mostly used internally when retrieving positioning "
-"information for our camera node or when stereo scopic rendering is not "
-"supported."
-msgstr ""
-
-#: doc/classes/ARVRInterface.xml:106
-msgid ""
-"Left eye output, this is mostly used internally when rendering the image for "
-"the left eye and obtaining positioning and projection information."
-msgstr ""
-
-#: doc/classes/ARVRInterface.xml:109
-msgid ""
-"Right eye output, this is mostly used internally when rendering the image "
-"for the right eye and obtaining positioning and projection information."
-msgstr ""
-
-#: doc/classes/ARVRInterface.xml:112
-msgid "Tracking is behaving as expected."
-msgstr ""
-
-#: doc/classes/ARVRInterface.xml:115
-msgid ""
-"Tracking is hindered by excessive motion (the player is moving faster than "
-"tracking can keep up)."
-msgstr ""
-
-#: doc/classes/ARVRInterface.xml:118
-msgid ""
-"Tracking is hindered by insufficient features, it's too dark (for camera-"
-"based tracking), player is blocked, etc."
-msgstr ""
-
-#: doc/classes/ARVRInterface.xml:121
-msgid ""
-"We don't know the status of the tracking or this interface does not provide "
-"feedback."
-msgstr ""
-
-#: doc/classes/ARVRInterface.xml:124
-msgid ""
-"Tracking is not functional (camera not plugged in or obscured, lighthouses "
-"turned off, etc.)."
-msgstr ""
-
-#: modules/gdnative/doc_classes/ARVRInterfaceGDNative.xml:4
-msgid "GDNative wrapper for an ARVR interface."
-msgstr ""
-
-#: modules/gdnative/doc_classes/ARVRInterfaceGDNative.xml:7
-msgid ""
-"This is a wrapper class for GDNative implementations of the ARVR interface. "
-"To use a GDNative ARVR interface, simply instantiate this object and set "
-"your GDNative library containing the ARVR interface implementation."
-msgstr ""
-
-#: doc/classes/ARVROrigin.xml:4
-msgid "The origin point in AR/VR."
-msgstr ""
-
-#: doc/classes/ARVROrigin.xml:7
-msgid ""
-"This is a special node within the AR/VR system that maps the physical "
-"location of the center of our tracking space to the virtual location within "
-"our game world.\n"
-"There should be only one of these nodes in your scene and you must have one. "
-"All the ARVRCamera, ARVRController and ARVRAnchor nodes should be direct "
-"children of this node for spatial tracking to work correctly.\n"
-"It is the position of this node that you update when your character needs to "
-"move through your game world while we're not moving in the real world. "
-"Movement in the real world is always in relation to this origin point.\n"
-"For example, if your character is driving a car, the ARVROrigin node should "
-"be a child node of this car. Or, if you're implementing a teleport system to "
-"move your character, you should change the position of this node."
-msgstr ""
-
-#: doc/classes/ARVROrigin.xml:19
-msgid ""
-"Allows you to adjust the scale to your game's units. Most AR/VR platforms "
-"assume a scale of 1 game world unit = 1 real world meter.\n"
-"[b]Note:[/b] This method is a passthrough to the [ARVRServer] itself."
-msgstr ""
-
-#: doc/classes/ARVRPositionalTracker.xml:4
-msgid "A tracked object."
-msgstr ""
-
-#: doc/classes/ARVRPositionalTracker.xml:7
-msgid ""
-"An instance of this object represents a device that is tracked, such as a "
-"controller or anchor point. HMDs aren't represented here as they are handled "
-"internally.\n"
-"As controllers are turned on and the AR/VR interface detects them, instances "
-"of this object are automatically added to this list of active tracking "
-"objects accessible through the [ARVRServer].\n"
-"The [ARVRController] and [ARVRAnchor] both consume objects of this type and "
-"should be used in your project. The positional trackers are just under-the-"
-"hood objects that make this all work. These are mostly exposed so that "
-"GDNative-based interfaces can interact with them."
-msgstr ""
-
-#: doc/classes/ARVRPositionalTracker.xml:19
-msgid ""
-"Returns the hand holding this tracker, if known. See [enum TrackerHand] "
-"constants."
-msgstr ""
-
-#: doc/classes/ARVRPositionalTracker.xml:26
-msgid ""
-"If this is a controller that is being tracked, the controller will also be "
-"represented by a joystick entry with this ID."
-msgstr ""
-
-#: doc/classes/ARVRPositionalTracker.xml:33
-msgid ""
-"Returns the mesh related to a controller or anchor point if one is available."
-msgstr ""
-
-#: doc/classes/ARVRPositionalTracker.xml:40
-msgid "Returns the controller or anchor point's name if available."
-msgstr ""
-
-#: doc/classes/ARVRPositionalTracker.xml:47
-msgid "Returns the controller's orientation matrix."
-msgstr ""
-
-#: doc/classes/ARVRPositionalTracker.xml:54
-msgid "Returns the world-space controller position."
-msgstr ""
-
-#: doc/classes/ARVRPositionalTracker.xml:61
-msgid ""
-"Returns the internal tracker ID. This uniquely identifies the tracker per "
-"tracker type and matches the ID you need to specify for nodes such as the "
-"[ARVRController] and [ARVRAnchor] nodes."
-msgstr ""
-
-#: doc/classes/ARVRPositionalTracker.xml:68
-msgid "Returns [code]true[/code] if this device tracks orientation."
-msgstr ""
-
-#: doc/classes/ARVRPositionalTracker.xml:75
-msgid "Returns [code]true[/code] if this device tracks position."
-msgstr ""
-
-#: doc/classes/ARVRPositionalTracker.xml:84
-msgid "Returns the transform combining this device's orientation and position."
-msgstr ""
-
-#: doc/classes/ARVRPositionalTracker.xml:91
-msgid "Returns the tracker's type."
-msgstr ""
-
-#: doc/classes/ARVRPositionalTracker.xml:97
-msgid ""
-"The degree to which the tracker rumbles. Ranges from [code]0.0[/code] to "
-"[code]1.0[/code] with precision [code].01[/code]."
-msgstr ""
-
-#: doc/classes/ARVRPositionalTracker.xml:102
-msgid "The hand this tracker is held in is unknown or not applicable."
-msgstr ""
-
-#: doc/classes/ARVRPositionalTracker.xml:105
-msgid "This tracker is the left hand controller."
-msgstr ""
-
-#: doc/classes/ARVRPositionalTracker.xml:108
-msgid "This tracker is the right hand controller."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:4
-msgid "Server for AR and VR features."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:7
-msgid ""
-"The AR/VR server is the heart of our Advanced and Virtual Reality solution "
-"and handles all the processing."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:21
-msgid ""
-"This is an important function to understand correctly. AR and VR platforms "
-"all handle positioning slightly differently.\n"
-"For platforms that do not offer spatial tracking, our origin point (0,0,0) "
-"is the location of our HMD, but you have little control over the direction "
-"the player is facing in the real world.\n"
-"For platforms that do offer spatial tracking, our origin point depends very "
-"much on the system. For OpenVR, our origin point is usually the center of "
-"the tracking space, on the ground. For other platforms, it's often the "
-"location of the tracking camera.\n"
-"This method allows you to center your tracker on the location of the HMD. It "
-"will take the current location of the HMD and use that to adjust all your "
-"tracking data; in essence, realigning the real world to your player's "
-"current position in the game world.\n"
-"For this method to produce usable results, tracking information must be "
-"available. This often takes a few frames after starting your game.\n"
-"You should call this method after a few seconds have passed. For instance, "
-"when the user requests a realignment of the display holding a designated "
-"button on a controller for a short period of time, or when implementing a "
-"teleport mechanism."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:35
-msgid ""
-"Finds an interface by its name. For instance, if your project uses "
-"capabilities of an AR/VR platform, you can find the interface for that "
-"platform by name and initialize it."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:42
-msgid "Returns the primary interface's transformation."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:51
-msgid ""
-"Returns the interface registered at a given index in our list of interfaces."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:58
-msgid ""
-"Returns the number of interfaces currently registered with the AR/VR server. "
-"If your project supports multiple AR/VR platforms, you can look through the "
-"available interface, and either present the user with a selection or simply "
-"try to initialize each interface and use the first one that returns "
-"[code]true[/code]."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:65
-msgid ""
-"Returns a list of available interfaces the ID and name of each interface."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:72
-msgid ""
-"Returns the absolute timestamp (in μs) of the last [ARVRServer] commit of "
-"the AR/VR eyes to [RenderingServer]. The value comes from an internal call "
-"to [method OS.get_ticks_usec]."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:79
-msgid ""
-"Returns the duration (in μs) of the last frame. This is computed as the "
-"difference between [method get_last_commit_usec] and [method "
-"get_last_process_usec] when committing."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:86
-msgid ""
-"Returns the absolute timestamp (in μs) of the last [ARVRServer] process "
-"callback. The value comes from an internal call to [method OS."
-"get_ticks_usec]."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:93
-msgid ""
-"Returns the reference frame transform. Mostly used internally and exposed "
-"for GDNative build interfaces."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:102
-msgid "Returns the positional tracker at the given ID."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:109
-msgid "Returns the number of trackers currently registered."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:115
-msgid "The primary [ARVRInterface] currently bound to the [ARVRServer]."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:118
-msgid ""
-"Allows you to adjust the scale to your game's units. Most AR/VR platforms "
-"assume a scale of 1 game world unit = 1 real world meter."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:126
-msgid "Emitted when a new interface has been added."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:133
-msgid "Emitted when an interface is removed."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:144
-msgid ""
-"Emitted when a new tracker has been added. If you don't use a fixed number "
-"of controllers or if you're using [ARVRAnchor]s for an AR solution, it is "
-"important to react to this signal to add the appropriate [ARVRController] or "
-"[ARVRAnchor] nodes related to this new tracker."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:155
-msgid ""
-"Emitted when a tracker is removed. You should remove any [ARVRController] or "
-"[ARVRAnchor] points if applicable. This is not mandatory, the nodes simply "
-"become inactive and will be made active again when a new tracker becomes "
-"available (i.e. a new controller is switched on that takes the place of the "
-"previous one)."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:161
-msgid "The tracker tracks the location of a controller."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:164
-msgid "The tracker tracks the location of a base station."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:167
-msgid "The tracker tracks the location and size of an AR anchor."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:170
-msgid "Used internally to filter trackers of any known type."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:173
-msgid "Used internally if we haven't set the tracker type yet."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:176
-msgid "Used internally to select all trackers."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:179
-msgid ""
-"Fully reset the orientation of the HMD. Regardless of what direction the "
-"user is looking to in the real world. The user will look dead ahead in the "
-"virtual world."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:182
-msgid ""
-"Resets the orientation but keeps the tilt of the device. So if we're looking "
-"down, we keep looking down but heading will be reset."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:185
-msgid ""
-"Does not reset the orientation of the HMD, only the position of the player "
-"gets centered."
-msgstr ""
-
#: doc/classes/AStar.xml:4
msgid ""
"An implementation of A* to find shortest paths among connected points in "
@@ -8377,7 +7741,9 @@ msgstr ""
#: doc/classes/AudioStreamPlayer.xml:64 doc/classes/AudioStreamPlayer2D.xml:70
#: doc/classes/AudioStreamPlayer3D.xml:94
-msgid "Changes the pitch and the tempo of the audio."
+msgid ""
+"The pitch and the tempo of the audio, as a multiplier of the audio sample's "
+"sample rate."
msgstr ""
#: doc/classes/AudioStreamPlayer.xml:67 doc/classes/AudioStreamPlayer2D.xml:73
@@ -8622,15 +7988,23 @@ msgid "Audio format. See [enum Format] constants for values."
msgstr ""
#: doc/classes/AudioStreamSample.xml:33
-msgid "Loop start in bytes."
+msgid ""
+"The loop start point (in number of samples, relative to the beginning of the "
+"sample). This information will be imported automatically from the WAV file "
+"if present."
msgstr ""
#: doc/classes/AudioStreamSample.xml:36
-msgid "Loop end in bytes."
+msgid ""
+"The loop end point (in number of samples, relative to the beginning of the "
+"sample). This information will be imported automatically from the WAV file "
+"if present."
msgstr ""
#: doc/classes/AudioStreamSample.xml:39
-msgid "Loop mode. See [enum LoopMode] constants for values."
+msgid ""
+"The loop mode. This information will be imported automatically from the WAV "
+"file if present. See [enum LoopMode] constants for values."
msgstr ""
#: doc/classes/AudioStreamSample.xml:42
@@ -8659,19 +8033,19 @@ msgstr ""
#: doc/classes/AudioStreamSample.xml:62
msgid ""
-"Audio loops the data between [member loop_begin] and [member loop_end] "
+"Audio loops the data between [member loop_begin] and [member loop_end], "
"playing forward only."
msgstr ""
#: doc/classes/AudioStreamSample.xml:65
msgid ""
-"Audio loops the data between [member loop_begin] and [member loop_end] "
+"Audio loops the data between [member loop_begin] and [member loop_end], "
"playing back and forth."
msgstr ""
#: doc/classes/AudioStreamSample.xml:68
msgid ""
-"Audio loops the data between [member loop_begin] and [member loop_end] "
+"Audio loops the data between [member loop_begin] and [member loop_end], "
"playing backward only."
msgstr ""
@@ -8688,30 +8062,35 @@ msgid ""
"in the BackBufferCopy node is bufferized with the content of the screen it "
"covers, or the entire screen according to the copy mode set. Use the "
"[code]texture(SCREEN_TEXTURE, ...)[/code] function in your shader scripts to "
-"access the buffer."
+"access the buffer.\n"
+"[b]Note:[/b] Since this node inherits from [Node2D] (and not [Control]), "
+"anchors and margins won't apply to child [Control]-derived nodes. This can "
+"be problematic when resizing the window. To avoid this, add [Control]-"
+"derived nodes as [i]siblings[/i] to the BackBufferCopy node instead of "
+"adding them as children."
msgstr ""
-#: doc/classes/BackBufferCopy.xml:15
+#: doc/classes/BackBufferCopy.xml:16
msgid "Buffer mode. See [enum CopyMode] constants."
msgstr ""
-#: doc/classes/BackBufferCopy.xml:18
+#: doc/classes/BackBufferCopy.xml:19
msgid ""
"The area covered by the BackBufferCopy. Only used if [member copy_mode] is "
"[constant COPY_MODE_RECT]."
msgstr ""
-#: doc/classes/BackBufferCopy.xml:23
+#: doc/classes/BackBufferCopy.xml:24
msgid ""
"Disables the buffering mode. This means the BackBufferCopy node will "
"directly use the portion of screen it covers."
msgstr ""
-#: doc/classes/BackBufferCopy.xml:26
+#: doc/classes/BackBufferCopy.xml:27
msgid "BackBufferCopy buffers a rectangular region."
msgstr ""
-#: doc/classes/BackBufferCopy.xml:29
+#: doc/classes/BackBufferCopy.xml:30
msgid "BackBufferCopy buffers the entire screen."
msgstr ""
@@ -8781,80 +8160,83 @@ msgstr ""
#: doc/classes/BaseButton.xml:62
msgid ""
"If [code]true[/code], the button stays pressed when moving the cursor "
-"outside the button while pressing it."
+"outside the button while pressing it.\n"
+"[b]Note:[/b] This property only affects the button's visual appearance. "
+"Signals will be emitted at the same moment regardless of this property's "
+"value."
msgstr ""
-#: doc/classes/BaseButton.xml:65
+#: doc/classes/BaseButton.xml:66
msgid ""
"If [code]true[/code], the button's state is pressed. Means the button is "
"pressed down or toggled (if [member toggle_mode] is active)."
msgstr ""
-#: doc/classes/BaseButton.xml:68
+#: doc/classes/BaseButton.xml:69
msgid "[ShortCut] associated to the button."
msgstr ""
-#: doc/classes/BaseButton.xml:71
+#: doc/classes/BaseButton.xml:72
msgid ""
"If [code]true[/code], the button will add information about its shortcut in "
"the tooltip."
msgstr ""
-#: doc/classes/BaseButton.xml:74
+#: doc/classes/BaseButton.xml:75
msgid ""
"If [code]true[/code], the button is in toggle mode. Makes the button flip "
"state between pressed and unpressed each time its area is clicked."
msgstr ""
-#: doc/classes/BaseButton.xml:80
+#: doc/classes/BaseButton.xml:81
msgid "Emitted when the button starts being held down."
msgstr ""
-#: doc/classes/BaseButton.xml:85
+#: doc/classes/BaseButton.xml:86
msgid "Emitted when the button stops being held down."
msgstr ""
-#: doc/classes/BaseButton.xml:90
+#: doc/classes/BaseButton.xml:91
msgid ""
"Emitted when the button is toggled or pressed. This is on [signal "
"button_down] if [member action_mode] is [constant ACTION_MODE_BUTTON_PRESS] "
"and on [signal button_up] otherwise."
msgstr ""
-#: doc/classes/BaseButton.xml:97
+#: doc/classes/BaseButton.xml:98
msgid ""
"Emitted when the button was just toggled between pressed and normal states "
"(only if [member toggle_mode] is active). The new state is contained in the "
"[code]button_pressed[/code] argument."
msgstr ""
-#: doc/classes/BaseButton.xml:103
+#: doc/classes/BaseButton.xml:104
msgid ""
"The normal state (i.e. not pressed, not hovered, not toggled and enabled) of "
"buttons."
msgstr ""
-#: doc/classes/BaseButton.xml:106
+#: doc/classes/BaseButton.xml:107
msgid "The state of buttons are pressed."
msgstr ""
-#: doc/classes/BaseButton.xml:109
+#: doc/classes/BaseButton.xml:110
msgid "The state of buttons are hovered."
msgstr ""
-#: doc/classes/BaseButton.xml:112
+#: doc/classes/BaseButton.xml:113
msgid "The state of buttons are disabled."
msgstr ""
-#: doc/classes/BaseButton.xml:115
+#: doc/classes/BaseButton.xml:116
msgid "The state of buttons are both hovered and pressed."
msgstr ""
-#: doc/classes/BaseButton.xml:118
+#: doc/classes/BaseButton.xml:119
msgid "Require just a press to consider the button clicked."
msgstr ""
-#: doc/classes/BaseButton.xml:121
+#: doc/classes/BaseButton.xml:122
msgid ""
"Require a press and a subsequent release before considering the button "
"clicked."
@@ -8978,8 +8360,8 @@ msgid ""
"the object."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:109 doc/classes/BaseMaterial3D.xml:275
-#: doc/classes/BaseMaterial3D.xml:296
+#: doc/classes/BaseMaterial3D.xml:109 doc/classes/BaseMaterial3D.xml:284
+#: doc/classes/BaseMaterial3D.xml:305
msgid ""
"Specifies the channel of the [member ao_texture] in which the ambient "
"occlusion information is stored. This is useful when you store the "
@@ -8990,29 +8372,45 @@ msgstr ""
#: doc/classes/BaseMaterial3D.xml:112
msgid ""
+"The color used by the backlight effect. Represents the light passing through "
+"an object."
+msgstr ""
+
+#: doc/classes/BaseMaterial3D.xml:115
+msgid "If [code]true[/code], the backlight effect is enabled."
+msgstr ""
+
+#: doc/classes/BaseMaterial3D.xml:118
+msgid ""
+"Texture used to control the backlight effect per-pixel. Added to [member "
+"backlight]."
+msgstr ""
+
+#: doc/classes/BaseMaterial3D.xml:121
+msgid ""
"If [code]true[/code], the shader will keep the scale set for the mesh. "
"Otherwise the scale is lost when billboarding. Only applies when [member "
"billboard_mode] is [constant BILLBOARD_ENABLED]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:115
+#: doc/classes/BaseMaterial3D.xml:124
msgid "Controls how the object faces the camera. See [enum BillboardMode]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:118
+#: doc/classes/BaseMaterial3D.xml:127
msgid ""
"The material's blend mode.\n"
"[b]Note:[/b] Values other than [code]Mix[/code] force the object into the "
"transparent pipeline. See [enum BlendMode]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:122
+#: doc/classes/BaseMaterial3D.xml:131
msgid ""
"Sets the strength of the clearcoat effect. Setting to [code]0[/code] looks "
"the same as disabling the clearcoat effect."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:125
+#: doc/classes/BaseMaterial3D.xml:134
msgid ""
"If [code]true[/code], clearcoat rendering is enabled. Adds a secondary "
"transparent pass to the lighting calculation resulting in an added specular "
@@ -9020,42 +8418,42 @@ msgid ""
"can be either glossy or rough."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:128
+#: doc/classes/BaseMaterial3D.xml:137
msgid ""
"Sets the roughness of the clearcoat pass. A higher value results in a "
"smoother clearcoat while a lower value results in a rougher clearcoat."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:131
+#: doc/classes/BaseMaterial3D.xml:140
msgid ""
"Texture that defines the strength of the clearcoat effect and the glossiness "
"of the clearcoat. Strength is specified in the red channel while glossiness "
"is specified in the green channel."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:134
+#: doc/classes/BaseMaterial3D.xml:143
msgid ""
"Which side of the object is not drawn when backfaces are rendered. See [enum "
"CullMode]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:137
+#: doc/classes/BaseMaterial3D.xml:146
msgid ""
"Determines when depth rendering takes place. See [enum DepthDrawMode]. See "
"also [member transparency]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:140
+#: doc/classes/BaseMaterial3D.xml:149
msgid "Texture that specifies the color of the detail overlay."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:143
+#: doc/classes/BaseMaterial3D.xml:152
msgid ""
"Specifies how the [member detail_albedo] should blend with the current "
"[code]ALBEDO[/code]. See [enum BlendMode] for options."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:146
+#: doc/classes/BaseMaterial3D.xml:155
msgid ""
"If [code]true[/code], enables the detail overlay. Detail is a second texture "
"that gets mixed over the surface of the object based on [member "
@@ -9063,99 +8461,99 @@ msgid ""
"between two different albedo/normal textures."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:149
+#: doc/classes/BaseMaterial3D.xml:158
msgid ""
"Texture used to specify how the detail textures get blended with the base "
"textures."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:152
+#: doc/classes/BaseMaterial3D.xml:161
msgid "Texture that specifies the per-pixel normal of the detail overlay."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:155
+#: doc/classes/BaseMaterial3D.xml:164
msgid ""
"Specifies whether to use [code]UV[/code] or [code]UV2[/code] for the detail "
"layer. See [enum DetailUV] for options."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:158
+#: doc/classes/BaseMaterial3D.xml:167
msgid ""
"The algorithm used for diffuse light scattering. See [enum DiffuseMode]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:161
+#: doc/classes/BaseMaterial3D.xml:170
msgid "If [code]true[/code], the object receives no ambient light."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:164
+#: doc/classes/BaseMaterial3D.xml:173
msgid ""
"If [code]true[/code], the object receives no shadow that would otherwise be "
"cast onto it."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:167
+#: doc/classes/BaseMaterial3D.xml:176
msgid "Distance at which the object fades fully and is no longer visible."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:170
+#: doc/classes/BaseMaterial3D.xml:179
msgid ""
"Distance at which the object starts to fade. If the object is less than this "
"distance away it will appear normal."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:173
+#: doc/classes/BaseMaterial3D.xml:182
msgid ""
"Specifies which type of fade to use. Can be any of the [enum "
"DistanceFadeMode]s."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:176
+#: doc/classes/BaseMaterial3D.xml:185
msgid "The emitted light's color. See [member emission_enabled]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:179
+#: doc/classes/BaseMaterial3D.xml:188
msgid ""
"If [code]true[/code], the body emits light. Emitting light makes the object "
"appear brighter. The object can also cast light on other objects if a "
"[GIProbe] is used and this object is used in baked lighting."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:182
+#: doc/classes/BaseMaterial3D.xml:191
msgid "The emitted light's strength. See [member emission_enabled]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:185
+#: doc/classes/BaseMaterial3D.xml:194
msgid "Use [code]UV2[/code] to read from the [member emission_texture]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:188
+#: doc/classes/BaseMaterial3D.xml:197
msgid ""
"Sets how [member emission] interacts with [member emission_texture]. Can "
"either add or multiply. See [enum EmissionOperator] for options."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:191
+#: doc/classes/BaseMaterial3D.xml:200
msgid "Texture that specifies how much surface emits light at a given point."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:194
+#: doc/classes/BaseMaterial3D.xml:203
msgid ""
"If [code]true[/code], the object is rendered at the same size regardless of "
"distance."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:197
+#: doc/classes/BaseMaterial3D.xml:206
msgid ""
"If [code]true[/code], enables the vertex grow setting. See [member "
"grow_amount]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:200
+#: doc/classes/BaseMaterial3D.xml:209
msgid "Grows object vertices in the direction of their normals."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:221
+#: doc/classes/BaseMaterial3D.xml:230
msgid ""
"A high value makes the material appear more like a metal. Non-metals use "
"their albedo as the diffuse color and add diffuse to the specular "
@@ -9168,7 +8566,7 @@ msgid ""
"roughness]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:224
+#: doc/classes/BaseMaterial3D.xml:233
msgid ""
"Sets the size of the specular lobe. The specular lobe is the bright spot "
"that is reflected from light sources.\n"
@@ -9177,13 +8575,13 @@ msgid ""
"roughness]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:228
+#: doc/classes/BaseMaterial3D.xml:237
msgid ""
"Texture used to specify metallic for an object. This is multiplied by "
"[member metallic]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:231
+#: doc/classes/BaseMaterial3D.xml:240
msgid ""
"Specifies the channel of the [member metallic_texture] in which the metallic "
"information is stored. This is useful when you store the information for "
@@ -9192,21 +8590,21 @@ msgid ""
"you could reduce the number of textures you use."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:234
+#: doc/classes/BaseMaterial3D.xml:243
msgid ""
"If [code]true[/code], depth testing is disabled and the object will be drawn "
"in render order."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:237
+#: doc/classes/BaseMaterial3D.xml:246
msgid "If [code]true[/code], normal mapping is enabled."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:240
+#: doc/classes/BaseMaterial3D.xml:249
msgid "The strength of the normal map's effect."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:243
+#: doc/classes/BaseMaterial3D.xml:252
msgid ""
"Texture used to specify the normal at a given pixel. The "
"[code]normal_texture[/code] only uses the red and green channels. The normal "
@@ -9214,93 +8612,100 @@ msgid ""
"provided by the [Mesh]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:248
+#: doc/classes/BaseMaterial3D.xml:257
msgid ""
"The number of horizontal frames in the particle sprite sheet. Only enabled "
"when using [constant BILLBOARD_PARTICLES]. See [member billboard_mode]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:251
+#: doc/classes/BaseMaterial3D.xml:260
msgid ""
"If [code]true[/code], particle animations are looped. Only enabled when "
"using [constant BILLBOARD_PARTICLES]. See [member billboard_mode]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:254
+#: doc/classes/BaseMaterial3D.xml:263
msgid ""
"The number of vertical frames in the particle sprite sheet. Only enabled "
"when using [constant BILLBOARD_PARTICLES]. See [member billboard_mode]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:257
+#: doc/classes/BaseMaterial3D.xml:266
msgid "The point size in pixels. See [member use_point_size]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:260
+#: doc/classes/BaseMaterial3D.xml:269
msgid ""
"Distance over which the fade effect takes place. The larger the distance the "
"longer it takes for an object to fade."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:263
+#: doc/classes/BaseMaterial3D.xml:272
msgid ""
"If [code]true[/code], the proximity fade effect is enabled. The proximity "
"fade effect fades out each pixel based on its distance to another object."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:266
+#: doc/classes/BaseMaterial3D.xml:275
msgid ""
"If [code]true[/code], the refraction effect is enabled. Distorts "
"transparency based on light from behind the object."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:269
+#: doc/classes/BaseMaterial3D.xml:278
msgid "The strength of the refraction effect."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:272
+#: doc/classes/BaseMaterial3D.xml:281
msgid ""
"Texture that controls the strength of the refraction per-pixel. Multiplied "
"by [member refraction_scale]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:278
+#: doc/classes/BaseMaterial3D.xml:287
msgid "Sets the strength of the rim lighting effect."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:281
+#: doc/classes/BaseMaterial3D.xml:290
msgid ""
"If [code]true[/code], rim effect is enabled. Rim lighting increases the "
"brightness at glancing angles on an object."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:284
+#: doc/classes/BaseMaterial3D.xml:293
msgid ""
"Texture used to set the strength of the rim lighting effect per-pixel. "
"Multiplied by [member rim]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:287
+#: doc/classes/BaseMaterial3D.xml:296
msgid ""
"The amount of to blend light and albedo color when rendering rim effect. If "
"[code]0[/code] the light color is used, while [code]1[/code] means albedo "
"color is used. An intermediate value generally works best."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:290
+#: doc/classes/BaseMaterial3D.xml:299
msgid ""
"Surface reflection. A value of [code]0[/code] represents a perfect mirror "
"while a value of [code]1[/code] completely blurs the reflection. See also "
"[member metallic]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:293
+#: doc/classes/BaseMaterial3D.xml:302
msgid ""
"Texture used to control the roughness per-pixel. Multiplied by [member "
"roughness]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:301
+#: doc/classes/BaseMaterial3D.xml:308
+msgid ""
+"Sets whether the shading takes place per-pixel or per-vertex. Per-vertex "
+"lighting is faster, making it the best choice for mobile applications, "
+"however it looks considerably worse than per-pixel."
+msgstr ""
+
+#: doc/classes/BaseMaterial3D.xml:311
msgid ""
"If [code]true[/code], enables the \"shadow to opacity\" render mode where "
"lighting modifies the alpha so shadowed areas are opaque and non-shadowed "
@@ -9308,77 +8713,67 @@ msgid ""
"AR."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:304
+#: doc/classes/BaseMaterial3D.xml:314
msgid "The method for rendering the specular blob. See [enum SpecularMode]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:307
+#: doc/classes/BaseMaterial3D.xml:317
msgid ""
"If [code]true[/code], subsurface scattering is enabled. Emulates light that "
"penetrates an object's surface, is scattered, and then emerges."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:312
+#: doc/classes/BaseMaterial3D.xml:320
+msgid ""
+"If [code]true[/code], subsurface scattering will use a special mode "
+"optimized for the color and density of human skin."
+msgstr ""
+
+#: doc/classes/BaseMaterial3D.xml:323
msgid "The strength of the subsurface scattering effect."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:315
+#: doc/classes/BaseMaterial3D.xml:326
msgid ""
"Texture used to control the subsurface scattering strength. Stored in the "
"red texture channel. Multiplied by [member subsurf_scatter_strength]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:318
+#: doc/classes/BaseMaterial3D.xml:341
msgid "Filter flags for the texture. See [enum TextureFilter] for options."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:321
+#: doc/classes/BaseMaterial3D.xml:344
msgid "Repeat flags for the texture. See [enum TextureFilter] for options."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:324
-msgid ""
-"The color used by the transmission effect. Represents the light passing "
-"through an object."
-msgstr ""
-
-#: doc/classes/BaseMaterial3D.xml:327
-msgid "If [code]true[/code], the transmission effect is enabled."
-msgstr ""
-
-#: doc/classes/BaseMaterial3D.xml:330
-msgid ""
-"Texture used to control the transmission effect per-pixel. Added to [member "
-"transmission]."
-msgstr ""
-
-#: doc/classes/BaseMaterial3D.xml:333
+#: doc/classes/BaseMaterial3D.xml:347
msgid ""
"If [code]true[/code], transparency is enabled on the body. See also [member "
"blend_mode]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:336
+#: doc/classes/BaseMaterial3D.xml:350
msgid ""
"If [code]true[/code], render point size can be changed.\n"
"[b]Note:[/b] this is only effective for objects whose geometry is point-"
"based rather than triangle-based. See also [member point_size]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:340
+#: doc/classes/BaseMaterial3D.xml:354
msgid ""
"How much to offset the [code]UV[/code] coordinates. This amount will be "
"added to [code]UV[/code] in the vertex function. This can be used to offset "
"a texture."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:343
+#: doc/classes/BaseMaterial3D.xml:357
msgid ""
"How much to scale the [code]UV[/code] coordinates. This is multiplied by "
"[code]UV[/code] in the vertex function."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:346
+#: doc/classes/BaseMaterial3D.xml:360
msgid ""
"If [code]true[/code], instead of using [code]UV[/code] textures will use a "
"triplanar texture lookup to determine how to apply textures. Triplanar uses "
@@ -9392,32 +8787,32 @@ msgid ""
"when you are trying to achieve crisp texturing."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:349 doc/classes/BaseMaterial3D.xml:364
+#: doc/classes/BaseMaterial3D.xml:363 doc/classes/BaseMaterial3D.xml:378
msgid ""
"A lower number blends the texture more softly while a higher number blends "
"the texture more sharply."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:352
+#: doc/classes/BaseMaterial3D.xml:366
msgid ""
"If [code]true[/code], triplanar mapping for [code]UV[/code] is calculated in "
"world space rather than object local space. See also [member uv1_triplanar]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:355
+#: doc/classes/BaseMaterial3D.xml:369
msgid ""
"How much to offset the [code]UV2[/code] coordinates. This amount will be "
"added to [code]UV2[/code] in the vertex function. This can be used to offset "
"a texture."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:358
+#: doc/classes/BaseMaterial3D.xml:372
msgid ""
"How much to scale the [code]UV2[/code] coordinates. This is multiplied by "
"[code]UV2[/code] in the vertex function."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:361
+#: doc/classes/BaseMaterial3D.xml:375
msgid ""
"If [code]true[/code], instead of using [code]UV2[/code] textures will use a "
"triplanar texture lookup to determine how to apply textures. Triplanar uses "
@@ -9431,368 +8826,443 @@ msgid ""
"when you are trying to achieve crisp texturing."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:367
+#: doc/classes/BaseMaterial3D.xml:381
msgid ""
"If [code]true[/code], triplanar mapping for [code]UV2[/code] is calculated "
"in world space rather than object local space. See also [member "
"uv2_triplanar]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:370
+#: doc/classes/BaseMaterial3D.xml:384
msgid ""
"If [code]true[/code], the model's vertex colors are processed as sRGB mode."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:373
+#: doc/classes/BaseMaterial3D.xml:387
msgid "If [code]true[/code], the vertex color is used as albedo color."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:378
+#: doc/classes/BaseMaterial3D.xml:392
msgid "Texture specifying per-pixel color."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:381
+#: doc/classes/BaseMaterial3D.xml:395
msgid "Texture specifying per-pixel metallic value."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:384
+#: doc/classes/BaseMaterial3D.xml:398
msgid "Texture specifying per-pixel roughness value."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:387
+#: doc/classes/BaseMaterial3D.xml:401
msgid "Texture specifying per-pixel emission color."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:390
+#: doc/classes/BaseMaterial3D.xml:404
msgid "Texture specifying per-pixel normal vector."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:393
+#: doc/classes/BaseMaterial3D.xml:407
msgid "Texture specifying per-pixel rim value."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:396
+#: doc/classes/BaseMaterial3D.xml:410
msgid "Texture specifying per-pixel clearcoat value."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:399
+#: doc/classes/BaseMaterial3D.xml:413
msgid ""
"Texture specifying per-pixel flowmap direction for use with [member "
"anisotropy]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:402
+#: doc/classes/BaseMaterial3D.xml:416
msgid "Texture specifying per-pixel ambient occlusion value."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:405
+#: doc/classes/BaseMaterial3D.xml:419
msgid "Texture specifying per-pixel height."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:408
+#: doc/classes/BaseMaterial3D.xml:422
msgid "Texture specifying per-pixel subsurface scattering."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:411
-msgid "Texture specifying per-pixel transmission color."
+#: doc/classes/BaseMaterial3D.xml:425
+msgid "Texture specifying per-pixel transmittance for subsurface scattering."
+msgstr ""
+
+#: doc/classes/BaseMaterial3D.xml:428
+msgid "Texture specifying per-pixel backlight color."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:414
+#: doc/classes/BaseMaterial3D.xml:431
msgid "Texture specifying per-pixel refraction strength."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:417
+#: doc/classes/BaseMaterial3D.xml:434
msgid "Texture specifying per-pixel detail mask blending value."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:420
+#: doc/classes/BaseMaterial3D.xml:437
msgid "Texture specifying per-pixel detail color."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:423
+#: doc/classes/BaseMaterial3D.xml:440
msgid "Texture specifying per-pixel detail normal."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:428
+#: doc/classes/BaseMaterial3D.xml:443
+msgid "Texture holding ambient occlusion, roughness, and metallic."
+msgstr ""
+
+#: doc/classes/BaseMaterial3D.xml:446
msgid "Represents the size of the [enum TextureParam] enum."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:431
+#: doc/classes/BaseMaterial3D.xml:449 doc/classes/RenderingServer.xml:3774
+#: doc/classes/Viewport.xml:390
msgid ""
"The texture filter reads from the nearest pixel only. The simplest and "
"fastest method of filtering, but the texture will look pixelized."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:434 doc/classes/CanvasItem.xml:665
+#: doc/classes/BaseMaterial3D.xml:452 doc/classes/RenderingServer.xml:3777
+#: doc/classes/Viewport.xml:393
msgid ""
-"The texture filter blends between the nearest four pixels. Use this for most "
-"cases where you want to avoid a pixelated style."
+"The texture filter blends between the nearest 4 pixels. Use this when you "
+"want to avoid a pixelated style, but do not want mipmaps."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:445 doc/classes/CanvasItem.xml:676
+#: doc/classes/BaseMaterial3D.xml:455 doc/classes/RenderingServer.xml:3780
+#: doc/classes/Viewport.xml:396
+msgid ""
+"The texture filter reads from the nearest pixel in the nearest mipmap. The "
+"fastest way to read from textures with mipmaps."
+msgstr ""
+
+#: doc/classes/BaseMaterial3D.xml:458
+msgid ""
+"The texture filter blends between the nearest 4 pixels and between the "
+"nearest 2 mipmaps. Use this for most cases as mipmaps are important to "
+"smooth out pixels that are far from the camera."
+msgstr ""
+
+#: doc/classes/BaseMaterial3D.xml:461 doc/classes/RenderingServer.xml:3786
+msgid ""
+"The texture filter reads from the nearest pixel, but selects a mipmap based "
+"on the angle between the surface and the camera view. This reduces artifacts "
+"on surfaces that are almost in line with the camera."
+msgstr ""
+
+#: doc/classes/BaseMaterial3D.xml:464 doc/classes/RenderingServer.xml:3789
+msgid ""
+"The texture filter blends between the nearest 4 pixels and selects a mipmap "
+"based on the angle between the surface and the camera view. This reduces "
+"artifacts on surfaces that are almost in line with the camera. This is the "
+"slowest of the filtering options, but results in the highest quality "
+"texturing."
+msgstr ""
+
+#: doc/classes/BaseMaterial3D.xml:467 doc/classes/CanvasItem.xml:677
msgid "Represents the size of the [enum TextureFilter] enum."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:448
+#: doc/classes/BaseMaterial3D.xml:470
msgid "Use [code]UV[/code] with the detail texture."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:451
+#: doc/classes/BaseMaterial3D.xml:473
msgid "Use [code]UV2[/code] with the detail texture."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:454
+#: doc/classes/BaseMaterial3D.xml:476
msgid "The material will not use transparency."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:457
+#: doc/classes/BaseMaterial3D.xml:479
msgid "The material will use the texture's alpha values for transparency."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:464
+#: doc/classes/BaseMaterial3D.xml:482
+msgid ""
+"The material will cut off all values below a threshold, the rest will remain "
+"opaque."
+msgstr ""
+
+#: doc/classes/BaseMaterial3D.xml:485
+msgid ""
+"The material will use the texture's alpha value for transparency, but will "
+"still be rendered in the pre-pass."
+msgstr ""
+
+#: doc/classes/BaseMaterial3D.xml:488
msgid "Represents the size of the [enum Transparency] enum."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:467
+#: doc/classes/BaseMaterial3D.xml:491
msgid "The object will not receive shadows."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:470
+#: doc/classes/BaseMaterial3D.xml:494
msgid ""
"The object will be shaded per pixel. Useful for realistic shading effect."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:473
+#: doc/classes/BaseMaterial3D.xml:497
msgid ""
"The object will be shaded per vertex. Useful when you want cheaper shaders "
"and do not care about visual quality."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:476
+#: doc/classes/BaseMaterial3D.xml:500
msgid "Represents the size of the [enum ShadingMode] enum."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:479
+#: doc/classes/BaseMaterial3D.xml:503
msgid "Constant for setting [member emission_enabled]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:482
+#: doc/classes/BaseMaterial3D.xml:506
msgid "Constant for setting [member normal_enabled]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:485
+#: doc/classes/BaseMaterial3D.xml:509
msgid "Constant for setting [member rim_enabled]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:488
+#: doc/classes/BaseMaterial3D.xml:512
msgid "Constant for setting [member clearcoat_enabled]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:491
+#: doc/classes/BaseMaterial3D.xml:515
msgid "Constant for setting [member anisotropy_enabled]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:494
+#: doc/classes/BaseMaterial3D.xml:518
msgid "Constant for setting [member ao_enabled]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:499
+#: doc/classes/BaseMaterial3D.xml:521
+msgid "Constant for setting [member heightmap_enabled]."
+msgstr ""
+
+#: doc/classes/BaseMaterial3D.xml:524
msgid "Constant for setting [member subsurf_scatter_enabled]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:502
-msgid "Constant for setting [member transmission_enabled]."
+#: doc/classes/BaseMaterial3D.xml:527
+msgid "Constant for setting [member subsurf_scatter_transmittance_enabled]."
+msgstr ""
+
+#: doc/classes/BaseMaterial3D.xml:530
+msgid "Constant for setting [member backlight_enabled]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:505
+#: doc/classes/BaseMaterial3D.xml:533
msgid "Constant for setting [member refraction_enabled]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:508
+#: doc/classes/BaseMaterial3D.xml:536
msgid "Constant for setting [member detail_enabled]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:511 doc/classes/EditorFeatureProfile.xml:148
+#: doc/classes/BaseMaterial3D.xml:539 doc/classes/EditorFeatureProfile.xml:148
msgid "Represents the size of the [enum Feature] enum."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:514
+#: doc/classes/BaseMaterial3D.xml:542
msgid ""
"Default blend mode. The color of the object is blended over the background "
"based on the object's alpha value."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:517
+#: doc/classes/BaseMaterial3D.xml:545
msgid "The color of the object is added to the background."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:520
+#: doc/classes/BaseMaterial3D.xml:548
msgid "The color of the object is subtracted from the background."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:523
+#: doc/classes/BaseMaterial3D.xml:551
msgid "The color of the object is multiplied by the background."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:526
+#: doc/classes/BaseMaterial3D.xml:554
msgid "Default depth draw mode. Depth is drawn only for opaque objects."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:529
+#: doc/classes/BaseMaterial3D.xml:557
msgid "Depth draw is calculated for both opaque and transparent objects."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:532
+#: doc/classes/BaseMaterial3D.xml:560
msgid "No depth draw."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:535
+#: doc/classes/BaseMaterial3D.xml:563
msgid "Default cull mode. The back of the object is culled when not visible."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:538
+#: doc/classes/BaseMaterial3D.xml:566
msgid "The front of the object is culled when not visible."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:541
+#: doc/classes/BaseMaterial3D.xml:569
msgid "No culling is performed."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:544
+#: doc/classes/BaseMaterial3D.xml:572
msgid ""
"Disables the depth test, so this object is drawn on top of all others. "
"However, objects drawn after it in the draw order may cover it."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:547
+#: doc/classes/BaseMaterial3D.xml:575
msgid "Set [code]ALBEDO[/code] to the per-vertex color specified in the mesh."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:550
+#: doc/classes/BaseMaterial3D.xml:578
msgid ""
"Vertex color is in sRGB space and needs to be converted to linear. Only "
"applies in the Vulkan renderer."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:553
+#: doc/classes/BaseMaterial3D.xml:581
msgid ""
"Uses point size to alter the size of primitive points. Also changes the "
"albedo texture lookup to use [code]POINT_COORD[/code] instead of [code]UV[/"
"code]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:556
+#: doc/classes/BaseMaterial3D.xml:584
msgid ""
"Object is scaled by depth so that it always appears the same size on screen."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:559
+#: doc/classes/BaseMaterial3D.xml:587
msgid ""
"Shader will keep the scale set for the mesh. Otherwise the scale is lost "
"when billboarding. Only applies when [member billboard_mode] is [constant "
"BILLBOARD_ENABLED]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:562 doc/classes/BaseMaterial3D.xml:568
+#: doc/classes/BaseMaterial3D.xml:590 doc/classes/BaseMaterial3D.xml:596
msgid ""
"Use triplanar texture lookup for all texture lookups that would normally use "
"[code]UV[/code]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:565 doc/classes/BaseMaterial3D.xml:571
+#: doc/classes/BaseMaterial3D.xml:593 doc/classes/BaseMaterial3D.xml:599
msgid ""
"Use triplanar texture lookup for all texture lookups that would normally use "
"[code]UV2[/code]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:574
+#: doc/classes/BaseMaterial3D.xml:602
msgid ""
"Use [code]UV2[/code] coordinates to look up from the [member ao_texture]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:577
+#: doc/classes/BaseMaterial3D.xml:605
msgid ""
"Use [code]UV2[/code] coordinates to look up from the [member "
"emission_texture]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:580
+#: doc/classes/BaseMaterial3D.xml:608
msgid "Forces the shader to convert albedo from sRGB space to linear space."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:583
+#: doc/classes/BaseMaterial3D.xml:611
msgid "Disables receiving shadows from other objects."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:586
+#: doc/classes/BaseMaterial3D.xml:614
msgid "Disables receiving ambient light."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:589
+#: doc/classes/BaseMaterial3D.xml:617
msgid "Enables the shadow to opacity feature."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:594
+#: doc/classes/BaseMaterial3D.xml:620 doc/classes/RenderingServer.xml:3801
+#: doc/classes/Viewport.xml:408
+msgid ""
+"Enables the texture to repeat when UV coordinates are outside the 0-1 range. "
+"If using one of the linear filtering modes, this can result in artifacts at "
+"the edges of a texture when the sampler filters across the edges of the "
+"texture."
+msgstr ""
+
+#: doc/classes/BaseMaterial3D.xml:623
msgid ""
"Invert values read from a depth texture to convert them to height values "
"(heightmap)."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:599 doc/classes/CPUParticles2D.xml:355
-#: doc/classes/CPUParticles3D.xml:364 doc/classes/GeometryInstance3D.xml:100
+#: doc/classes/BaseMaterial3D.xml:626
+msgid ""
+"Enables the skin mode for subsurface scattering which is used to improve the "
+"look of subsurface scattering when used for human skin."
+msgstr ""
+
+#: doc/classes/BaseMaterial3D.xml:629 doc/classes/CPUParticles2D.xml:355
+#: doc/classes/CPUParticles3D.xml:364 doc/classes/GeometryInstance3D.xml:118
#: doc/classes/ParticlesMaterial.xml:315
msgid "Represents the size of the [enum Flags] enum."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:602
+#: doc/classes/BaseMaterial3D.xml:632
msgid "Default diffuse scattering algorithm."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:605
+#: doc/classes/BaseMaterial3D.xml:635
msgid "Diffuse scattering ignores roughness."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:608
+#: doc/classes/BaseMaterial3D.xml:638
msgid "Extends Lambert to cover more than 90 degrees when roughness increases."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:611
+#: doc/classes/BaseMaterial3D.xml:641
msgid "Attempts to use roughness to emulate microsurfacing."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:614
+#: doc/classes/BaseMaterial3D.xml:644
msgid "Uses a hard cut for lighting, with smoothing affected by roughness."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:617
+#: doc/classes/BaseMaterial3D.xml:647
msgid "Default specular blob."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:620 doc/classes/BaseMaterial3D.xml:623
+#: doc/classes/BaseMaterial3D.xml:650 doc/classes/BaseMaterial3D.xml:653
msgid "Older specular algorithm, included for compatibility."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:626
+#: doc/classes/BaseMaterial3D.xml:656
msgid "Toon blob which changes size based on roughness."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:629
+#: doc/classes/BaseMaterial3D.xml:659
msgid "No specular blob."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:632
+#: doc/classes/BaseMaterial3D.xml:662
msgid "Billboard mode is disabled."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:635
+#: doc/classes/BaseMaterial3D.xml:665
msgid "The object's Z axis will always face the camera."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:638
+#: doc/classes/BaseMaterial3D.xml:668
msgid "The object's X axis will always face the camera."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:641
+#: doc/classes/BaseMaterial3D.xml:671
msgid ""
"Used for particle systems when assigned to [GPUParticles3D] and "
"[CPUParticles3D] nodes. Enables [code]particles_anim_*[/code] properties.\n"
@@ -9800,45 +9270,45 @@ msgid ""
"anim_speed] should also be set to a positive value for the animation to play."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:645
+#: doc/classes/BaseMaterial3D.xml:675
msgid "Used to read from the red channel of a texture."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:648
+#: doc/classes/BaseMaterial3D.xml:678
msgid "Used to read from the green channel of a texture."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:651
+#: doc/classes/BaseMaterial3D.xml:681
msgid "Used to read from the blue channel of a texture."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:654
+#: doc/classes/BaseMaterial3D.xml:684
msgid "Used to read from the alpha channel of a texture."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:657
+#: doc/classes/BaseMaterial3D.xml:687
msgid "Currently unused."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:660
+#: doc/classes/BaseMaterial3D.xml:690
msgid "Adds the emission color to the color from the emission texture."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:663
+#: doc/classes/BaseMaterial3D.xml:693
msgid "Multiplies the emission color by the color from the emission texture."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:666
+#: doc/classes/BaseMaterial3D.xml:696
msgid "Do not use distance fade."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:669
+#: doc/classes/BaseMaterial3D.xml:699
msgid ""
"Smoothly fades the object out based on each pixel's distance from the camera "
"using the alpha channel."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:672
+#: doc/classes/BaseMaterial3D.xml:702
msgid ""
"Smoothly fades the object out based on each pixel's distance from the camera "
"using a dither approach. Dithering discards pixels based on a set pattern to "
@@ -9846,7 +9316,7 @@ msgid ""
"faster than [constant DISTANCE_FADE_PIXEL_ALPHA]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:675
+#: doc/classes/BaseMaterial3D.xml:705
msgid ""
"Smoothly fades the object out based on the object's distance from the camera "
"using a dither approach. Dithering discards pixels based on a set pattern to "
@@ -10520,176 +9990,181 @@ msgid ""
"scenes than manually changing the position of [CanvasItem]-based nodes.\n"
"This node is intended to be a simple helper to get things going quickly and "
"it may happen that more functionality is desired to change how the camera "
-"works. To make your own custom camera node, simply inherit from [Node2D] and "
-"change the transform of the canvas by calling get_viewport()."
-"set_canvas_transform(m) in [Viewport]."
+"works. To make your own custom camera node, inherit from [Node2D] and change "
+"the transform of the canvas by setting [member Viewport.canvas_transform] in "
+"[Viewport] (you can obtain the current [Viewport] by using [method Node."
+"get_viewport]).\n"
+"Note that the [Camera2D] node's [code]position[/code] doesn't represent the "
+"actual position of the screen, which may differ due to applied smoothing or "
+"limits. You can use [method get_camera_screen_center] to get the real "
+"position."
msgstr ""
-#: doc/classes/Camera2D.xml:17
+#: doc/classes/Camera2D.xml:18
msgid "Aligns the camera to the tracked node."
msgstr ""
-#: doc/classes/Camera2D.xml:24
+#: doc/classes/Camera2D.xml:25
msgid ""
"Removes any [Camera2D] from the ancestor [Viewport]'s internal currently-"
"assigned camera."
msgstr ""
-#: doc/classes/Camera2D.xml:31
+#: doc/classes/Camera2D.xml:32
msgid "Forces the camera to update scroll immediately."
msgstr ""
-#: doc/classes/Camera2D.xml:38
+#: doc/classes/Camera2D.xml:39
msgid "Returns the camera position."
msgstr ""
-#: doc/classes/Camera2D.xml:45
+#: doc/classes/Camera2D.xml:46
msgid ""
"Returns the location of the [Camera2D]'s screen-center, relative to the "
"origin."
msgstr ""
-#: doc/classes/Camera2D.xml:54
+#: doc/classes/Camera2D.xml:55
msgid ""
"Returns the specified margin. See also [member drag_margin_bottom], [member "
"drag_margin_top], [member drag_margin_left], and [member drag_margin_right]."
msgstr ""
-#: doc/classes/Camera2D.xml:63
+#: doc/classes/Camera2D.xml:64
msgid ""
"Returns the specified camera limit. See also [member limit_bottom], [member "
"limit_top], [member limit_left], and [member limit_right]."
msgstr ""
-#: doc/classes/Camera2D.xml:70
+#: doc/classes/Camera2D.xml:71
msgid ""
"Make this the current 2D camera for the scene (viewport and layer), in case "
"there are many cameras in the scene."
msgstr ""
-#: doc/classes/Camera2D.xml:77
+#: doc/classes/Camera2D.xml:78
msgid ""
"Sets the camera's position immediately to its current smoothing "
"destination.\n"
"This has no effect if smoothing is disabled."
msgstr ""
-#: doc/classes/Camera2D.xml:89
+#: doc/classes/Camera2D.xml:90
msgid ""
"Sets the specified margin. See also [member drag_margin_bottom], [member "
"drag_margin_top], [member drag_margin_left], and [member drag_margin_right]."
msgstr ""
-#: doc/classes/Camera2D.xml:100
+#: doc/classes/Camera2D.xml:101
msgid ""
"Sets the specified camera limit. See also [member limit_bottom], [member "
"limit_top], [member limit_left], and [member limit_right]."
msgstr ""
-#: doc/classes/Camera2D.xml:106
+#: doc/classes/Camera2D.xml:107
msgid "The Camera2D's anchor point. See [enum AnchorMode] constants."
msgstr ""
-#: doc/classes/Camera2D.xml:109
+#: doc/classes/Camera2D.xml:110
msgid ""
"If [code]true[/code], the camera is the active camera for the current scene. "
"Only one camera can be current, so setting a different camera [code]current[/"
"code] will disable this one."
msgstr ""
-#: doc/classes/Camera2D.xml:112
+#: doc/classes/Camera2D.xml:113
msgid ""
"The custom [Viewport] node attached to the [Camera2D]. If [code]null[/code] "
"or not a [Viewport], uses the default viewport instead."
msgstr ""
-#: doc/classes/Camera2D.xml:115
+#: doc/classes/Camera2D.xml:116
msgid ""
"Bottom margin needed to drag the camera. A value of [code]1[/code] makes the "
"camera move only when reaching the edge of the screen."
msgstr ""
-#: doc/classes/Camera2D.xml:118
+#: doc/classes/Camera2D.xml:119
msgid ""
"If [code]true[/code], the camera only moves when reaching the horizontal "
"drag margins. If [code]false[/code], the camera moves horizontally "
"regardless of margins."
msgstr ""
-#: doc/classes/Camera2D.xml:121
+#: doc/classes/Camera2D.xml:122
msgid ""
"Left margin needed to drag the camera. A value of [code]1[/code] makes the "
"camera move only when reaching the edge of the screen."
msgstr ""
-#: doc/classes/Camera2D.xml:124
+#: doc/classes/Camera2D.xml:125
msgid ""
"Right margin needed to drag the camera. A value of [code]1[/code] makes the "
"camera move only when reaching the edge of the screen."
msgstr ""
-#: doc/classes/Camera2D.xml:127
+#: doc/classes/Camera2D.xml:128
msgid ""
"Top margin needed to drag the camera. A value of [code]1[/code] makes the "
"camera move only when reaching the edge of the screen."
msgstr ""
-#: doc/classes/Camera2D.xml:130
+#: doc/classes/Camera2D.xml:131
msgid ""
"If [code]true[/code], the camera only moves when reaching the vertical drag "
"margins. If [code]false[/code], the camera moves vertically regardless of "
"margins."
msgstr ""
-#: doc/classes/Camera2D.xml:133
+#: doc/classes/Camera2D.xml:134
msgid ""
"If [code]true[/code], draws the camera's drag margin rectangle in the editor."
msgstr ""
-#: doc/classes/Camera2D.xml:136
+#: doc/classes/Camera2D.xml:137
msgid ""
"If [code]true[/code], draws the camera's limits rectangle in the editor."
msgstr ""
-#: doc/classes/Camera2D.xml:139
+#: doc/classes/Camera2D.xml:140
msgid ""
"If [code]true[/code], draws the camera's screen rectangle in the editor."
msgstr ""
-#: doc/classes/Camera2D.xml:142
+#: doc/classes/Camera2D.xml:143
msgid ""
"Bottom scroll limit in pixels. The camera stops moving when reaching this "
"value."
msgstr ""
-#: doc/classes/Camera2D.xml:145
+#: doc/classes/Camera2D.xml:146
msgid ""
"Left scroll limit in pixels. The camera stops moving when reaching this "
"value."
msgstr ""
-#: doc/classes/Camera2D.xml:148
+#: doc/classes/Camera2D.xml:149
msgid ""
"Right scroll limit in pixels. The camera stops moving when reaching this "
"value."
msgstr ""
-#: doc/classes/Camera2D.xml:151
+#: doc/classes/Camera2D.xml:152
msgid ""
"If [code]true[/code], the camera smoothly stops when reaches its limits."
msgstr ""
-#: doc/classes/Camera2D.xml:154
+#: doc/classes/Camera2D.xml:155
msgid ""
"Top scroll limit in pixels. The camera stops moving when reaching this value."
msgstr ""
-#: doc/classes/Camera2D.xml:157
+#: doc/classes/Camera2D.xml:158
msgid ""
"The camera's offset, useful for looking around or camera shake animations."
msgstr ""
-#: doc/classes/Camera2D.xml:160
+#: doc/classes/Camera2D.xml:161
msgid ""
"The horizontal offset of the camera, relative to the drag margins.\n"
"[b]Note:[/b] Offset H is used only to force offset relative to margins. It's "
@@ -10697,33 +10172,33 @@ msgid ""
"initial offset."
msgstr ""
-#: doc/classes/Camera2D.xml:164
+#: doc/classes/Camera2D.xml:165
msgid ""
"The vertical offset of the camera, relative to the drag margins.\n"
"[b]Note:[/b] Used the same as [member offset_h]."
msgstr ""
-#: doc/classes/Camera2D.xml:168
+#: doc/classes/Camera2D.xml:169
msgid "The camera's process callback. See [enum Camera2DProcessMode]."
msgstr ""
-#: doc/classes/Camera2D.xml:171
+#: doc/classes/Camera2D.xml:172
msgid "If [code]true[/code], the camera rotates with the target."
msgstr ""
-#: doc/classes/Camera2D.xml:174
+#: doc/classes/Camera2D.xml:175
msgid ""
"If [code]true[/code], the camera smoothly moves towards the target at "
"[member smoothing_speed]."
msgstr ""
-#: doc/classes/Camera2D.xml:177
+#: doc/classes/Camera2D.xml:178
msgid ""
"Speed in pixels per second of the camera's smoothing effect when [member "
"smoothing_enabled] is [code]true[/code]."
msgstr ""
-#: doc/classes/Camera2D.xml:180
+#: doc/classes/Camera2D.xml:181
msgid ""
"The camera's zoom relative to the viewport. Values larger than "
"[code]Vector2(1, 1)[/code] zoom out and smaller values zoom in. For an "
@@ -10731,23 +10206,23 @@ msgid ""
"[code]Vector2(4, 4)[/code] for a 4× zoom-out."
msgstr ""
-#: doc/classes/Camera2D.xml:185
+#: doc/classes/Camera2D.xml:186
msgid ""
"The camera's position is fixed so that the top-left corner is always at the "
"origin."
msgstr ""
-#: doc/classes/Camera2D.xml:188
+#: doc/classes/Camera2D.xml:189
msgid ""
"The camera's position takes into account vertical/horizontal offsets and the "
"screen size."
msgstr ""
-#: doc/classes/Camera2D.xml:191 doc/classes/ClippedCamera3D.xml:104
+#: doc/classes/Camera2D.xml:192 doc/classes/ClippedCamera3D.xml:104
msgid "The camera updates with the [code]_physics_process[/code] callback."
msgstr ""
-#: doc/classes/Camera2D.xml:194 doc/classes/ClippedCamera3D.xml:107
+#: doc/classes/Camera2D.xml:195 doc/classes/ClippedCamera3D.xml:107
msgid "The camera updates with the [code]_process[/code] callback."
msgstr ""
@@ -11009,6 +10484,72 @@ msgid ""
"Audio's [code]pitch shift[/code])."
msgstr ""
+#: doc/classes/CameraEffects.xml:4
+msgid ""
+"Contains camera-specific effects such as depth of field and exposure "
+"override."
+msgstr ""
+
+#: doc/classes/CameraEffects.xml:7
+msgid ""
+"Contains camera-specific effects such as depth of field and exposure "
+"override.\n"
+"See also [Environment] for general 3D environment settings."
+msgstr ""
+
+#: doc/classes/CameraEffects.xml:16
+msgid ""
+"The amount of blur for both near and far depth-of-field effects. The amount "
+"of blur increases the radius of the blur effect, making the affected area "
+"blurrier. However, If the amount is too high, you might start to see lines "
+"appearing, especially when using a low quality blur."
+msgstr ""
+
+#: doc/classes/CameraEffects.xml:19
+msgid ""
+"The distance from the camera where the far blur effect affects the rendering."
+msgstr ""
+
+#: doc/classes/CameraEffects.xml:22
+msgid ""
+"If [code]true[/code], enables the depth-of-field far blur effect. This has a "
+"significant performance cost. Consider disabling it in scenes where there "
+"are no far away objects."
+msgstr ""
+
+#: doc/classes/CameraEffects.xml:25
+msgid "The length of the transition between the no-blur area and far blur."
+msgstr ""
+
+#: doc/classes/CameraEffects.xml:28
+msgid ""
+"Distance from the camera where the near blur effect affects the rendering."
+msgstr ""
+
+#: doc/classes/CameraEffects.xml:31
+msgid ""
+"If [code]true[/code], enables the depth-of-field near blur effect. This has "
+"a significant performance cost. Consider disabling it in scenes where there "
+"are no nearby objects."
+msgstr ""
+
+#: doc/classes/CameraEffects.xml:34
+msgid "The length of the transition between the near blur and no-blur area."
+msgstr ""
+
+#: doc/classes/CameraEffects.xml:37
+msgid ""
+"The exposure override value to use. Higher values will result in a brighter "
+"scene. Only effective if [member override_exposure_enable] is [code]true[/"
+"code]."
+msgstr ""
+
+#: doc/classes/CameraEffects.xml:40
+msgid ""
+"If [code]true[/code], overrides the manual or automatic exposure defined in "
+"the [Environment] with the value in [member override_exposure]."
+msgstr ""
+
#: doc/classes/CameraFeed.xml:4
msgid ""
"A camera feed gives you access to a single physical camera attached to your "
@@ -11019,7 +10560,7 @@ msgstr ""
msgid ""
"A camera feed gives you access to a single physical camera attached to your "
"device. When enabled, Godot will start capturing frames from the camera "
-"which can then be used.\n"
+"which can then be used. See also [CameraServer].\n"
"[b]Note:[/b] Many cameras will return YCbCr images which are split into two "
"textures and need to be combined in a shader. Godot does this automatically "
"for you if you set the environment to show the camera image in the "
@@ -11034,50 +10575,54 @@ msgstr ""
msgid ""
"The [CameraServer] keeps track of different cameras accessible in Godot. "
"These are external cameras such as webcams or the cameras on your phone.\n"
-"It is notably used to provide AR modules with a video feed from the camera."
+"It is notably used to provide AR modules with a video feed from the camera.\n"
+"[b]Note:[/b] This class is currently only implemented on macOS and iOS. On "
+"other platforms, no [CameraFeed]s will be available."
msgstr ""
-#: doc/classes/CameraServer.xml:19
-msgid "Adds a camera feed to the camera server."
+#: doc/classes/CameraServer.xml:20
+msgid "Adds the camera [code]feed[/code] to the camera server."
msgstr ""
-#: doc/classes/CameraServer.xml:26
+#: doc/classes/CameraServer.xml:27
msgid "Returns an array of [CameraFeed]s."
msgstr ""
-#: doc/classes/CameraServer.xml:35
-msgid "Returns the [CameraFeed] with this id."
+#: doc/classes/CameraServer.xml:36
+msgid ""
+"Returns the [CameraFeed] corresponding to the camera with the given "
+"[code]index[/code]."
msgstr ""
-#: doc/classes/CameraServer.xml:42
+#: doc/classes/CameraServer.xml:43
msgid "Returns the number of [CameraFeed]s registered."
msgstr ""
-#: doc/classes/CameraServer.xml:51
-msgid "Removes a [CameraFeed]."
+#: doc/classes/CameraServer.xml:52
+msgid "Removes the specified camera [code]feed[/code]."
msgstr ""
-#: doc/classes/CameraServer.xml:60
-msgid "Emitted when a [CameraFeed] is added (e.g. webcam is plugged in)."
+#: doc/classes/CameraServer.xml:61
+msgid "Emitted when a [CameraFeed] is added (e.g. a webcam is plugged in)."
msgstr ""
-#: doc/classes/CameraServer.xml:67
-msgid "Emitted when a [CameraFeed] is removed (e.g. webcam is unplugged)."
+#: doc/classes/CameraServer.xml:68
+msgid "Emitted when a [CameraFeed] is removed (e.g. a webcam is unplugged)."
msgstr ""
-#: doc/classes/CameraServer.xml:73
+#: doc/classes/CameraServer.xml:74
msgid "The RGBA camera image."
msgstr ""
-#: doc/classes/CameraServer.xml:76
-msgid "The YCbCr camera image."
+#: doc/classes/CameraServer.xml:77
+msgid "The [url=https://en.wikipedia.org/wiki/YCbCr]YCbCr[/url] camera image."
msgstr ""
-#: doc/classes/CameraServer.xml:79
+#: doc/classes/CameraServer.xml:80
msgid "The Y component camera image."
msgstr ""
-#: doc/classes/CameraServer.xml:82
+#: doc/classes/CameraServer.xml:83
msgid "The CbCr component camera image."
msgstr ""
@@ -11133,97 +10678,100 @@ msgid ""
"its children) and self modulation (only for itself), as well as its blend "
"mode.\n"
"Ultimately, a transform notification can be requested, which will notify the "
-"node that its global position changed in case the parent tree changed."
+"node that its global position changed in case the parent tree changed.\n"
+"[b]Note:[/b] Unless otherwise specified, all methods that have angle "
+"parameters must have angles specified as [i]radians[/i]. To convert degrees "
+"to radians, use [method @GDScript.deg2rad]."
msgstr ""
-#: doc/classes/CanvasItem.xml:14 doc/classes/CanvasLayer.xml:10
+#: doc/classes/CanvasItem.xml:15 doc/classes/CanvasLayer.xml:10
#: doc/classes/InputEvent.xml:11 doc/classes/Viewport.xml:15
msgid "https://docs.godotengine.org/en/latest/tutorials/2d/2d_transforms.html"
msgstr ""
-#: doc/classes/CanvasItem.xml:15 doc/classes/Control.xml:19
+#: doc/classes/CanvasItem.xml:16 doc/classes/Control.xml:19
#: doc/classes/Node2D.xml:10
msgid ""
"https://docs.godotengine.org/en/latest/tutorials/2d/custom_drawing_in_2d.html"
msgstr ""
-#: doc/classes/CanvasItem.xml:22
+#: doc/classes/CanvasItem.xml:23
msgid ""
"Overridable function called by the engine (if defined) to draw the canvas "
"item."
msgstr ""
-#: doc/classes/CanvasItem.xml:43
+#: doc/classes/CanvasItem.xml:44
msgid ""
"Draws an arc between the given angles. The larger the value of "
"[code]point_count[/code], the smoother the curve."
msgstr ""
-#: doc/classes/CanvasItem.xml:60
+#: doc/classes/CanvasItem.xml:61
msgid ""
"Draws a string character using a custom font. Returns the advance, depending "
"on the character width and kerning with an optional next character."
msgstr ""
-#: doc/classes/CanvasItem.xml:73
+#: doc/classes/CanvasItem.xml:74
msgid "Draws a colored circle."
msgstr ""
-#: doc/classes/CanvasItem.xml:98
+#: doc/classes/CanvasItem.xml:99
msgid "Draws a colored polygon of any amount of points, convex or concave."
msgstr ""
-#: doc/classes/CanvasItem.xml:113
+#: doc/classes/CanvasItem.xml:114
msgid "Draws a line from a 2D point to another, with a given color and width."
msgstr ""
-#: doc/classes/CanvasItem.xml:138
+#: doc/classes/CanvasItem.xml:139
msgid ""
"Draws a [Mesh] in 2D, using the provided texture. See [MeshInstance2D] for "
"related documentation."
msgstr ""
-#: doc/classes/CanvasItem.xml:151
+#: doc/classes/CanvasItem.xml:152
msgid "Draws multiple, parallel lines with a uniform [code]color[/code]."
msgstr ""
-#: doc/classes/CanvasItem.xml:164
+#: doc/classes/CanvasItem.xml:165
msgid ""
"Draws multiple, parallel lines with a uniform [code]width[/code] and segment-"
"by-segment coloring. Colors assigned to line segments match by index between "
"[code]points[/code] and [code]colors[/code]."
msgstr ""
-#: doc/classes/CanvasItem.xml:185
+#: doc/classes/CanvasItem.xml:186
msgid ""
"Draws a [MultiMesh] in 2D with the provided texture. See "
"[MultiMeshInstance2D] for related documentation."
msgstr ""
-#: doc/classes/CanvasItem.xml:210
+#: doc/classes/CanvasItem.xml:211
msgid "Draws a polygon of any amount of points, convex or concave."
msgstr ""
-#: doc/classes/CanvasItem.xml:223
+#: doc/classes/CanvasItem.xml:224
msgid ""
"Draws interconnected line segments with a uniform [code]color[/code] and "
"[code]width[/code]."
msgstr ""
-#: doc/classes/CanvasItem.xml:236
+#: doc/classes/CanvasItem.xml:237
msgid ""
"Draws interconnected line segments with a uniform [code]width[/code] and "
"segment-by-segment coloring. Colors assigned to line segments match by index "
"between [code]points[/code] and [code]colors[/code]."
msgstr ""
-#: doc/classes/CanvasItem.xml:263
+#: doc/classes/CanvasItem.xml:264
msgid ""
"Draws a custom primitive. 1 point for a point, 2 points for a line, 3 points "
"for a triangle, and 4 points for a quad."
msgstr ""
-#: doc/classes/CanvasItem.xml:278
+#: doc/classes/CanvasItem.xml:279
msgid ""
"Draws a rectangle. If [code]filled[/code] is [code]true[/code], the "
"rectangle will be filled with the [code]color[/code] specified. If "
@@ -11233,272 +10781,278 @@ msgid ""
"[code]false[/code]."
msgstr ""
-#: doc/classes/CanvasItem.xml:292
+#: doc/classes/CanvasItem.xml:293
msgid ""
"Sets a custom transform for drawing via components. Anything drawn "
"afterwards will be transformed by this."
msgstr ""
-#: doc/classes/CanvasItem.xml:301
+#: doc/classes/CanvasItem.xml:302
msgid ""
"Sets a custom transform for drawing via matrix. Anything drawn afterwards "
"will be transformed by this."
msgstr ""
-#: doc/classes/CanvasItem.xml:318
+#: doc/classes/CanvasItem.xml:319
msgid "Draws a string using a custom font."
msgstr ""
-#: doc/classes/CanvasItem.xml:329
+#: doc/classes/CanvasItem.xml:330
msgid "Draws a styled rectangle."
msgstr ""
-#: doc/classes/CanvasItem.xml:352
+#: doc/classes/CanvasItem.xml:353
msgid "Draws a texture at a given position."
msgstr ""
-#: doc/classes/CanvasItem.xml:379
+#: doc/classes/CanvasItem.xml:380
msgid ""
"Draws a textured rectangle at a given position, optionally modulated by a "
"color. If [code]transpose[/code] is [code]true[/code], the texture will have "
"its X and Y coordinates swapped."
msgstr ""
-#: doc/classes/CanvasItem.xml:408
+#: doc/classes/CanvasItem.xml:409
msgid ""
"Draws a textured rectangle region at a given position, optionally modulated "
"by a color. If [code]transpose[/code] is [code]true[/code], the texture will "
"have its X and Y coordinates swapped."
msgstr ""
-#: doc/classes/CanvasItem.xml:415 doc/classes/Node3D.xml:18
+#: doc/classes/CanvasItem.xml:416 doc/classes/Node3D.xml:19
msgid ""
"Forces the transform to update. Transform changes in physics are not instant "
"for performance reasons. Transforms are accumulated and then set. Use this "
"if you need an up-to-date transform when doing physics operations."
msgstr ""
-#: doc/classes/CanvasItem.xml:422
+#: doc/classes/CanvasItem.xml:423
msgid "Returns the [RID] of the [World2D] canvas where this item is in."
msgstr ""
-#: doc/classes/CanvasItem.xml:429
+#: doc/classes/CanvasItem.xml:430
msgid "Returns the canvas item RID used by [RenderingServer] for this item."
msgstr ""
-#: doc/classes/CanvasItem.xml:436
+#: doc/classes/CanvasItem.xml:437
msgid "Returns the transform matrix of this item's canvas."
msgstr ""
-#: doc/classes/CanvasItem.xml:443
+#: doc/classes/CanvasItem.xml:444
msgid "Returns the global position of the mouse."
msgstr ""
-#: doc/classes/CanvasItem.xml:450
+#: doc/classes/CanvasItem.xml:451
msgid "Returns the global transform matrix of this item."
msgstr ""
-#: doc/classes/CanvasItem.xml:457
+#: doc/classes/CanvasItem.xml:458
msgid ""
"Returns the global transform matrix of this item in relation to the canvas."
msgstr ""
-#: doc/classes/CanvasItem.xml:464
+#: doc/classes/CanvasItem.xml:465
msgid "Returns the mouse position relative to this item's position."
msgstr ""
-#: doc/classes/CanvasItem.xml:471
+#: doc/classes/CanvasItem.xml:472
msgid "Returns the transform matrix of this item."
msgstr ""
-#: doc/classes/CanvasItem.xml:478
+#: doc/classes/CanvasItem.xml:479
msgid "Returns the viewport's boundaries as a [Rect2]."
msgstr ""
-#: doc/classes/CanvasItem.xml:485
+#: doc/classes/CanvasItem.xml:486
msgid "Returns this item's transform in relation to the viewport."
msgstr ""
-#: doc/classes/CanvasItem.xml:492
+#: doc/classes/CanvasItem.xml:493
msgid "Returns the [World2D] where this item is in."
msgstr ""
-#: doc/classes/CanvasItem.xml:499
+#: doc/classes/CanvasItem.xml:500
msgid "Hide the [CanvasItem] if it's currently visible."
msgstr ""
-#: doc/classes/CanvasItem.xml:506
+#: doc/classes/CanvasItem.xml:507
msgid ""
"Returns [code]true[/code] if local transform notifications are communicated "
"to children."
msgstr ""
-#: doc/classes/CanvasItem.xml:513
+#: doc/classes/CanvasItem.xml:514
msgid ""
"Returns [code]true[/code] if the node is set as top-level. See [method "
"set_as_toplevel]."
msgstr ""
-#: doc/classes/CanvasItem.xml:520
+#: doc/classes/CanvasItem.xml:521
msgid ""
"Returns [code]true[/code] if global transform notifications are communicated "
"to children."
msgstr ""
-#: doc/classes/CanvasItem.xml:527
+#: doc/classes/CanvasItem.xml:528
msgid ""
"Returns [code]true[/code] if the node is present in the [SceneTree], its "
"[member visible] property is [code]true[/code] and its inherited visibility "
"is also [code]true[/code]."
msgstr ""
-#: doc/classes/CanvasItem.xml:536
+#: doc/classes/CanvasItem.xml:537
msgid "Assigns [code]screen_point[/code] as this node's new local transform."
msgstr ""
-#: doc/classes/CanvasItem.xml:545
+#: doc/classes/CanvasItem.xml:546
msgid ""
"Transformations issued by [code]event[/code]'s inputs are applied in local "
"space instead of global space."
msgstr ""
-#: doc/classes/CanvasItem.xml:554
+#: doc/classes/CanvasItem.xml:555
msgid ""
"If [code]enable[/code] is [code]true[/code], the node won't inherit its "
"transform from parent canvas items."
msgstr ""
-#: doc/classes/CanvasItem.xml:563
+#: doc/classes/CanvasItem.xml:564
msgid ""
"If [code]enable[/code] is [code]true[/code], children will be updated with "
"local transform data."
msgstr ""
-#: doc/classes/CanvasItem.xml:572
+#: doc/classes/CanvasItem.xml:573
msgid ""
"If [code]enable[/code] is [code]true[/code], children will be updated with "
"global transform data."
msgstr ""
-#: doc/classes/CanvasItem.xml:579
+#: doc/classes/CanvasItem.xml:580
msgid ""
"Show the [CanvasItem] if it's currently hidden. For controls that inherit "
"[Popup], the correct way to make them visible is to call one of the multiple "
"[code]popup*()[/code] functions instead."
msgstr ""
-#: doc/classes/CanvasItem.xml:586
+#: doc/classes/CanvasItem.xml:587
msgid ""
"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be "
"called on idle time to request redraw."
msgstr ""
-#: doc/classes/CanvasItem.xml:592
+#: doc/classes/CanvasItem.xml:593
msgid ""
"The rendering layers in which this [CanvasItem] responds to [Light2D] nodes."
msgstr ""
-#: doc/classes/CanvasItem.xml:595
+#: doc/classes/CanvasItem.xml:596
msgid "The material applied to textures on this [CanvasItem]."
msgstr ""
-#: doc/classes/CanvasItem.xml:598
+#: doc/classes/CanvasItem.xml:599
msgid "The color applied to textures on this [CanvasItem]."
msgstr ""
-#: doc/classes/CanvasItem.xml:601
+#: doc/classes/CanvasItem.xml:602
msgid ""
"The color applied to textures on this [CanvasItem]. This is not inherited by "
"children [CanvasItem]s."
msgstr ""
-#: doc/classes/CanvasItem.xml:604
+#: doc/classes/CanvasItem.xml:605
msgid "If [code]true[/code], the object draws behind its parent."
msgstr ""
-#: doc/classes/CanvasItem.xml:607
+#: doc/classes/CanvasItem.xml:608
msgid "If [code]true[/code], the object draws on top of its parent."
msgstr ""
-#: doc/classes/CanvasItem.xml:614
+#: doc/classes/CanvasItem.xml:615
msgid ""
"If [code]true[/code], the parent [CanvasItem]'s [member material] property "
"is used as this one's material."
msgstr ""
-#: doc/classes/CanvasItem.xml:617
+#: doc/classes/CanvasItem.xml:618
msgid ""
"If [code]true[/code], this [CanvasItem] is drawn. For controls that inherit "
"[Popup], the correct way to make them visible is to call one of the multiple "
"[code]popup*()[/code] functions instead."
msgstr ""
-#: doc/classes/CanvasItem.xml:623
+#: doc/classes/CanvasItem.xml:624
msgid ""
"Emitted when the [CanvasItem] must redraw. This can only be connected "
"realtime, as deferred will not allow drawing."
msgstr ""
-#: doc/classes/CanvasItem.xml:628
+#: doc/classes/CanvasItem.xml:629
msgid "Emitted when becoming hidden."
msgstr ""
-#: doc/classes/CanvasItem.xml:633
+#: doc/classes/CanvasItem.xml:634
msgid "Emitted when the item rect has changed."
msgstr ""
-#: doc/classes/CanvasItem.xml:638
+#: doc/classes/CanvasItem.xml:639
msgid "Emitted when the visibility (hidden/visible) changes."
msgstr ""
-#: doc/classes/CanvasItem.xml:644
+#: doc/classes/CanvasItem.xml:645
msgid ""
"The [CanvasItem]'s transform has changed. This notification is only received "
"if enabled by [method set_notify_transform] or [method "
"set_notify_local_transform]."
msgstr ""
-#: doc/classes/CanvasItem.xml:647
+#: doc/classes/CanvasItem.xml:648
msgid "The [CanvasItem] is requested to draw."
msgstr ""
-#: doc/classes/CanvasItem.xml:650
+#: doc/classes/CanvasItem.xml:651
msgid "The [CanvasItem]'s visibility has changed."
msgstr ""
-#: doc/classes/CanvasItem.xml:653
+#: doc/classes/CanvasItem.xml:654
msgid "The [CanvasItem] has entered the canvas."
msgstr ""
-#: doc/classes/CanvasItem.xml:656
+#: doc/classes/CanvasItem.xml:657
msgid "The [CanvasItem] has exited the canvas."
msgstr ""
-#: doc/classes/CanvasItem.xml:659 doc/classes/CanvasItem.xml:679
+#: doc/classes/CanvasItem.xml:660 doc/classes/CanvasItem.xml:680
msgid "The [CanvasItem] will inherit the filter from its parent."
msgstr ""
-#: doc/classes/CanvasItem.xml:662
+#: doc/classes/CanvasItem.xml:663
msgid ""
"The texture filter reads from the nearest pixel only. The simplest and "
"fastest method of filtering. Useful for pixel art."
msgstr ""
-#: doc/classes/CanvasItem.xml:682
+#: doc/classes/CanvasItem.xml:666
+msgid ""
+"The texture filter blends between the nearest four pixels. Use this for most "
+"cases where you want to avoid a pixelated style."
+msgstr ""
+
+#: doc/classes/CanvasItem.xml:683
msgid "Texture will not repeat."
msgstr ""
-#: doc/classes/CanvasItem.xml:685
+#: doc/classes/CanvasItem.xml:686
msgid "Texture will repeat normally."
msgstr ""
-#: doc/classes/CanvasItem.xml:688
+#: doc/classes/CanvasItem.xml:689
msgid ""
"Texture will repeat in a 2x2 tiled mode, where elements at even positions "
"are mirrored."
msgstr ""
-#: doc/classes/CanvasItem.xml:691
+#: doc/classes/CanvasItem.xml:692
msgid "Represents the size of the [enum TextureRepeat] enum."
msgstr ""
@@ -12686,25 +12240,24 @@ msgid ""
"component."
msgstr ""
-#: doc/classes/Color.xml:158
+#: doc/classes/Color.xml:160
msgid ""
-"Returns a new color resulting from making this color lighter by the "
-"specified percentage (ratio from 0 to 1).\n"
+"Returns the linear interpolation with another color. The interpolation "
+"factor [code]t[/code] is between 0 and 1.\n"
"[codeblock]\n"
-"var green = Color(0.0, 1.0, 0.0)\n"
-"var lightgreen = green.lightened(0.2) # 20% lighter than regular green\n"
+"var c1 = Color(1.0, 0.0, 0.0)\n"
+"var c2 = Color(0.0, 1.0, 0.0)\n"
+"var li_c = c1.lerp(c2, 0.5) # A color of an RGBA(128, 128, 0, 255)\n"
"[/codeblock]"
msgstr ""
-#: doc/classes/Color.xml:173
+#: doc/classes/Color.xml:174
msgid ""
-"Returns the linear interpolation with another color. The interpolation "
-"factor [code]t[/code] is between 0 and 1.\n"
+"Returns a new color resulting from making this color lighter by the "
+"specified percentage (ratio from 0 to 1).\n"
"[codeblock]\n"
-"var c1 = Color(1.0, 0.0, 0.0)\n"
-"var c2 = Color(0.0, 1.0, 0.0)\n"
-"var li_c = c1.linear_interpolate(c2, 0.5) # A color of an RGBA(128, 128, 0, "
-"255)\n"
+"var green = Color(0.0, 1.0, 0.0)\n"
+"var lightgreen = green.lightened(0.2) # 20% lighter than regular green\n"
"[/codeblock]"
msgstr ""
@@ -13726,7 +13279,7 @@ msgid ""
msgstr ""
#: doc/classes/ConeTwistJoint3D.xml:77 doc/classes/Generic6DOFJoint3D.xml:404
-#: doc/classes/HingeJoint3D.xml:109 doc/classes/Light3D.xml:124
+#: doc/classes/HingeJoint3D.xml:109 doc/classes/Light3D.xml:145
#: doc/classes/SliderJoint3D.xml:170
msgid "Represents the size of the [enum Param] enum."
msgstr ""
@@ -14610,8 +14163,8 @@ msgstr ""
#: doc/classes/Control.xml:801
msgid ""
"Tells Godot which node it should give keyboard focus to if the user presses "
-"Tab on a keyboard by default. You can change the key by editing the "
-"[code]ui_focus_next[/code] input action.\n"
+"[kbd]Tab[/kbd] on a keyboard by default. You can change the key by editing "
+"the [code]ui_focus_next[/code] input action.\n"
"If this property is not set, Godot will select a \"best guess\" based on "
"surrounding nodes in the scene tree."
msgstr ""
@@ -14619,8 +14172,8 @@ msgstr ""
#: doc/classes/Control.xml:805
msgid ""
"Tells Godot which node it should give keyboard focus to if the user presses "
-"Shift+Tab on a keyboard by default. You can change the key by editing the "
-"[code]ui_focus_prev[/code] input action.\n"
+"[kbd]Shift + Tab[/kbd] on a keyboard by default. You can change the key by "
+"editing the [code]ui_focus_prev[/code] input action.\n"
"If this property is not set, Godot will select a \"best guess\" based on "
"surrounding nodes in the scene tree."
msgstr ""
@@ -14702,9 +14255,9 @@ msgstr ""
#: doc/classes/Control.xml:841
msgid ""
-"Enables whether rendering of children should be clipped to this control's "
-"rectangle. If [code]true[/code], parts of a child which would be visibly "
-"outside of this control's rectangle will not be rendered."
+"Enables whether rendering of [CanvasItem] based children should be clipped "
+"to this control's rectangle. If [code]true[/code], parts of a child which "
+"would be visibly outside of this control's rectangle will not be rendered."
msgstr ""
#: doc/classes/Control.xml:844
@@ -16860,6 +16413,172 @@ msgid ""
"stiffness multiplied by the size difference from its resting length."
msgstr ""
+#: doc/classes/Decal.xml:4
+msgid "Node that projects a texture onto a [MeshInstance3D]."
+msgstr ""
+
+#: doc/classes/Decal.xml:7
+msgid ""
+"[Decal]s are used to project a texture onto a [Mesh] in the scene. Use "
+"Decals to add detail to a scene without affecting the underlying [Mesh]. "
+"They are often used to add weathering to building, add dirt or mud to the "
+"ground, or add variety to props. Decals can be moved at any time, making "
+"them suitable for things like blob shadows or laser sight dots.\n"
+"They are made of an [AABB] and a group of [Texture2D]s specifying [Color], "
+"normal, ORM (ambient occlusion, roughness, metallic), and emission. Decals "
+"are projected within their [AABB] so altering the orientation of the Decal "
+"affects the direction in which they are projected. By default, Decals are "
+"projected down (i.e. from positive Y to negative Y).\n"
+"The [Texture2D]s associated with the Decal are automatically stored in a "
+"texture atlas which is used for drawing the decals so all decals can be "
+"drawn at once. Godot uses clustered decals, meaning they are stored in "
+"cluster data and drawn when the mesh is drawn, they are not drawn as a "
+"postprocessing effect after."
+msgstr ""
+
+#: doc/classes/Decal.xml:20
+msgid ""
+"Returns the [Texture2D] associated with the specified [enum DecalTexture]. "
+"This is a convenience method, in most cases you should access the texture "
+"directly. \n"
+"For example, instead of [code]albedo_tex = $Decal.get_texture(Decal."
+"TEXTURE_ALBEDO)[/code], use [code]albedo_tex = $Decal.texture_albedo[/"
+"code].\n"
+"One case where this is better than accessing the texture directly is when "
+"you want to copy one Decal's textures to another. For example:\n"
+"[codeblock]\n"
+"for i in Decal.TEXTURE_MAX:\n"
+" $NewDecal.set_texture(i, $OldDecal.get_texture(i))\n"
+"[/codeblock]"
+msgstr ""
+
+#: doc/classes/Decal.xml:37
+msgid ""
+"Sets the [Texture2D] associated with the specified [enum DecalTexture]. This "
+"is a convenience method, in most cases you should access the texture "
+"directly. \n"
+"For example, instead of [code]$Decal.set_texture(Decal.TEXTURE_ALBEDO, "
+"albedo_tex)[/code], use [code]$Decal.texture_albedo = albedo_tex[/code].\n"
+"One case where this is better than accessing the texture directly is when "
+"you want to copy one Decal's textures to another. For example:\n"
+"[codeblock]\n"
+"for i in Decal.TEXTURE_MAX:\n"
+" $NewDecal.set_texture(i, $OldDecal.get_texture(i))\n"
+"[/codeblock]"
+msgstr ""
+
+#: doc/classes/Decal.xml:49
+msgid ""
+"Blends the albedo [Color] of the decal with albedo [Color] of the underlying "
+"mesh."
+msgstr ""
+
+#: doc/classes/Decal.xml:52
+msgid ""
+"Specifies which [member VisualInstance3D.layers] this decal will project on. "
+"By default, Decals affect all layers. This is used so you can specify which "
+"types of objects receive the Decal and which do not. This is especially "
+"useful so you an ensure that dynamic objects don't accidentally receive a "
+"Decal intended for the terrain under them."
+msgstr ""
+
+#: doc/classes/Decal.xml:55
+msgid "Distance from the camera at which the Decal begins to fade away."
+msgstr ""
+
+#: doc/classes/Decal.xml:58
+msgid ""
+"If [code]true[/code], decals will smoothly fade away when far from the "
+"active [Camera3D] starting at [member distance_fade_begin]. The Decal will "
+"fade out over [member distance_fade_length], after which it will be culled "
+"and not sent to the shader at all. Use this to reduce the number of active "
+"Decals in a scene and thus improve performance."
+msgstr ""
+
+#: doc/classes/Decal.xml:61
+msgid ""
+"Distance over which the Decal fades. The Decal becomes slowly more "
+"transparent over this distance and is completely invisible at the end."
+msgstr ""
+
+#: doc/classes/Decal.xml:64
+msgid ""
+"Energy multiplier for the emission texture. This will make the decal emit "
+"light at a higher intensity."
+msgstr ""
+
+#: doc/classes/Decal.xml:67
+msgid ""
+"Sets the size of the [AABB] used by the decal. The AABB goes from [code]-"
+"extents[/code] to [code]extents[/code]."
+msgstr ""
+
+#: doc/classes/Decal.xml:70 doc/classes/Decal.xml:91
+msgid ""
+"Sets the curve over which the decal will fade as the surface gets further "
+"from the center of the [AABB]."
+msgstr ""
+
+#: doc/classes/Decal.xml:73
+msgid "Changes the [Color] of the Decal by multiplying it with this value."
+msgstr ""
+
+#: doc/classes/Decal.xml:76
+msgid ""
+"Fades the Decal if the angle between the Decal's [AABB] and the target "
+"surface becomes too large. A value of [code]0[/code] projects the Decal "
+"regardless of angle, a value of [code]1[/code] limits the Decal to surfaces "
+"that are nearly perpendicular."
+msgstr ""
+
+#: doc/classes/Decal.xml:79
+msgid ""
+"[Texture2D] with the base [Color] of the Decal. Either this or the [member "
+"texture_emission] must be set for the Decal to be visible. Use the alpha "
+"channel like a mask to smoothly blend the edges of the decal with the "
+"underlying object."
+msgstr ""
+
+#: doc/classes/Decal.xml:82
+msgid ""
+"[Texture2D] with the emission [Color] of the Decal. Either this or the "
+"[member texture_emission] must be set for the Decal to be visible. Use the "
+"alpha channel like a mask to smoothly blend the edges of the decal with the "
+"underlying object."
+msgstr ""
+
+#: doc/classes/Decal.xml:85
+msgid ""
+"[Texture2D] with the per-pixel normalmap for the decal. Use this to add "
+"extra detail to decals."
+msgstr ""
+
+#: doc/classes/Decal.xml:88
+msgid ""
+"[Texture2D] storing ambient occlusion, roughness, and metallic for the "
+"decal. Use this to add extra detail to decals."
+msgstr ""
+
+#: doc/classes/Decal.xml:96
+msgid "[Texture2D] corresponding to [member texture_albedo]."
+msgstr ""
+
+#: doc/classes/Decal.xml:99
+msgid "[Texture2D] corresponding to [member texture_normal]."
+msgstr ""
+
+#: doc/classes/Decal.xml:102
+msgid "[Texture2D] corresponding to [member texture_orm]."
+msgstr ""
+
+#: doc/classes/Decal.xml:105
+msgid "[Texture2D] corresponding to [member texture_emission]."
+msgstr ""
+
+#: doc/classes/Decal.xml:108
+msgid "Max size of [enum DecalTexture] enum."
+msgstr ""
+
#: doc/classes/Dictionary.xml:4
msgid "Dictionary type."
msgstr ""
@@ -16867,30 +16586,40 @@ msgstr ""
#: doc/classes/Dictionary.xml:7
msgid ""
"Dictionary type. Associative container which contains values referenced by "
-"unique keys. Dictionary are composed of pairs of keys (which must be unique) "
-"and values. You can define a dictionary by placing a comma separated list of "
-"[code]key: value[/code] pairs in curly braces [code]{}[/code].\n"
-"Erasing elements while iterating over them [b]is not supported[/b].\n"
+"unique keys. Dictionaries are composed of pairs of keys (which must be "
+"unique) and values. Dictionaries will preserve the insertion order when "
+"adding elements, even though this may not be reflected when printing the "
+"dictionary. In other programming languages, this data structure is sometimes "
+"referred to as an hash map or associative array.\n"
+"You can define a dictionary by placing a comma-separated list of [code]key: "
+"value[/code] pairs in curly braces [code]{}[/code].\n"
+"Erasing elements while iterating over them [b]is not supported[/b] and will "
+"result in undefined behavior.\n"
"Creating a dictionary:\n"
"[codeblock]\n"
"var my_dir = {} # Creates an empty dictionary.\n"
"var points_dir = {\"White\": 50, \"Yellow\": 75, \"Orange\": 100}\n"
-"var my_dir = {\n"
+"var another_dir = {\n"
" key1: value1,\n"
" key2: value2,\n"
" key3: value3,\n"
"}\n"
"[/codeblock]\n"
-"You can access values of a dictionary by referencing appropriate key in "
-"above example [code]points_dir[\"White\"][/code] would return value of 50.\n"
+"You can access a dictionary's values by referencing the appropriate key. In "
+"the above example, [code]points_dir[\"White\"][/code] will return [code]50[/"
+"code]. You can also write [code]points_dir.White[/code], which is "
+"equivalent. However, you'll have to use the bracket syntax if the key you're "
+"accessing the dictionary with isn't a fixed string (such as a number or "
+"variable).\n"
"[codeblock]\n"
"export(String, \"White\", \"Yellow\", \"Orange\") var my_color\n"
"var points_dir = {\"White\": 50, \"Yellow\": 75, \"Orange\": 100}\n"
"\n"
"func _ready():\n"
+" # We can't use dot syntax here as `my_color` is a variable.\n"
" var points = points_dir[my_color]\n"
"[/codeblock]\n"
-"In the above code [code]points[/code] will be assigned the value that is "
+"In the above code, [code]points[/code] will be assigned the value that is "
"paired with the appropriate color selected in [code]my_color[/code].\n"
"Dictionaries can contain more complex data:\n"
"[codeblock]\n"
@@ -16901,16 +16630,24 @@ msgid ""
"assign to it:\n"
"[codeblock]\n"
"var points_dir = {\"White\": 50, \"Yellow\": 75, \"Orange\": 100}\n"
-"var points_dir[\"Blue\"] = 150 # Add \"Blue\" as a key and assign 150 as its "
+"points_dir[\"Blue\"] = 150 # Add \"Blue\" as a key and assign 150 as its "
"value.\n"
"[/codeblock]\n"
"Finally, dictionaries can contain different types of keys and values in the "
"same dictionary:\n"
"[codeblock]\n"
-"var my_dir = {\"String Key\": 5, 4: [1, 2, 3], 7: \"Hello\"} # This is a "
-"valid dictionary.\n"
+"# This is a valid dictionary.\n"
+"# To access the string \"Nested value\" below, use `my_dir.sub_dir.sub_key` "
+"or `my_dir[\"sub_dir\"][\"sub_key\"]`.\n"
+"# Indexing styles can be mixed and matched depending on your needs.\n"
+"var my_dir = {\n"
+" \"String Key\": 5,\n"
+" 4: [1, 2, 3],\n"
+" 7: \"Hello\",\n"
+" \"sub_dir\": {\"sub_key\": \"Nested value\"},\n"
+"}\n"
"[/codeblock]\n"
-"[b]Note:[/b] Unlike [Array]s you can't compare dictionaries directly:\n"
+"[b]Note:[/b] Unlike [Array]s, you can't compare dictionaries directly:\n"
"[codeblock]\n"
"array1 = [1, 2, 3]\n"
"array2 = [1, 2, 3]\n"
@@ -16935,49 +16672,52 @@ msgid ""
"[/codeblock]"
msgstr ""
-#: doc/classes/Dictionary.xml:65
+#: doc/classes/Dictionary.xml:75
msgid ""
"https://docs.godotengine.org/en/latest/getting_started/scripting/gdscript/"
"gdscript_basics.html#dictionary"
msgstr ""
-#: doc/classes/Dictionary.xml:72
+#: doc/classes/Dictionary.xml:82
msgid "Clear the dictionary, removing all key/value pairs."
msgstr ""
-#: doc/classes/Dictionary.xml:81
-msgid "Creates a copy of the dictionary, and returns it."
+#: doc/classes/Dictionary.xml:91
+msgid ""
+"Creates a copy of the dictionary, and returns it. The [code]deep[/code] "
+"parameter causes inner dictionaries and arrays to be copied recursively, but "
+"does not apply to objects."
msgstr ""
-#: doc/classes/Dictionary.xml:88
+#: doc/classes/Dictionary.xml:98
msgid "Returns [code]true[/code] if the dictionary is empty."
msgstr ""
-#: doc/classes/Dictionary.xml:97
+#: doc/classes/Dictionary.xml:107
msgid ""
"Erase a dictionary key/value pair by key. Returns [code]true[/code] if the "
"given key was present in the dictionary, [code]false[/code] otherwise. Does "
"not erase elements while iterating over the dictionary."
msgstr ""
-#: doc/classes/Dictionary.xml:108
+#: doc/classes/Dictionary.xml:118
msgid ""
"Returns the current value for the specified key in the [Dictionary]. If the "
"key does not exist, the method returns the value of the optional default "
"argument, or [code]null[/code] if it is omitted."
msgstr ""
-#: doc/classes/Dictionary.xml:117
+#: doc/classes/Dictionary.xml:127
msgid "Returns [code]true[/code] if the dictionary has a given key."
msgstr ""
-#: doc/classes/Dictionary.xml:126
+#: doc/classes/Dictionary.xml:136
msgid ""
"Returns [code]true[/code] if the dictionary has all of the keys in the given "
"array."
msgstr ""
-#: doc/classes/Dictionary.xml:133
+#: doc/classes/Dictionary.xml:143
msgid ""
"Returns a hashed integer value representing the dictionary contents. This "
"can be used to compare dictionaries by value:\n"
@@ -16990,15 +16730,15 @@ msgid ""
"[/codeblock]"
msgstr ""
-#: doc/classes/Dictionary.xml:146
+#: doc/classes/Dictionary.xml:156
msgid "Returns the list of keys in the [Dictionary]."
msgstr ""
-#: doc/classes/Dictionary.xml:153
+#: doc/classes/Dictionary.xml:163
msgid "Returns the size of the dictionary (in pairs)."
msgstr ""
-#: doc/classes/Dictionary.xml:160
+#: doc/classes/Dictionary.xml:170
msgid "Returns the list of values in the [Dictionary]."
msgstr ""
@@ -17024,37 +16764,42 @@ msgstr ""
#: doc/classes/DirectionalLight3D.xml:16
msgid ""
-"Amount of extra bias for shadow splits that are far away. If self-shadowing "
-"occurs only on the splits far away, increasing this value can fix them."
+"If [code]true[/code], shadow detail is sacrificed in exchange for smoother "
+"transitions between splits."
msgstr ""
#: doc/classes/DirectionalLight3D.xml:19
msgid ""
-"If [code]true[/code], shadow detail is sacrificed in exchange for smoother "
-"transitions between splits."
+"Optimizes shadow rendering for detail versus movement. See [enum "
+"ShadowDepthRange]."
msgstr ""
#: doc/classes/DirectionalLight3D.xml:22
msgid ""
-"Optimizes shadow rendering for detail versus movement. See [enum "
-"ShadowDepthRange]."
+"Proportion of [member directional_shadow_max_distance] at which point the "
+"shadow starts to fade. At [member directional_shadow_max_distance] the "
+"shadow will disappear."
msgstr ""
-#: doc/classes/DirectionalLight3D.xml:27
+#: doc/classes/DirectionalLight3D.xml:25
msgid "The maximum distance for shadow splits."
msgstr ""
-#: doc/classes/DirectionalLight3D.xml:30
+#: doc/classes/DirectionalLight3D.xml:28
msgid "The light's shadow rendering algorithm. See [enum ShadowMode]."
msgstr ""
-#: doc/classes/DirectionalLight3D.xml:33
+#: doc/classes/DirectionalLight3D.xml:31 doc/classes/RenderingServer.xml:3371
msgid ""
-"Can be used to fix special cases of self shadowing when objects are "
-"perpendicular to the light."
+"Sets the size of the directional shadow pancake. The pancake offsets the "
+"start of the shadow's camera frustum to provide a higher effective depth "
+"resolution for the shadow. However, a high pancake size can cause artifacts "
+"in the shadows of large objects that are close to the edge of the frustum. "
+"Reducing the pancake size can help. Setting the size to [code]0[/code] turns "
+"off the pancaking effect."
msgstr ""
-#: doc/classes/DirectionalLight3D.xml:36
+#: doc/classes/DirectionalLight3D.xml:34
msgid ""
"The distance from camera to shadow split 1. Relative to [member "
"directional_shadow_max_distance]. Only used when [member "
@@ -17062,7 +16807,7 @@ msgid ""
"[code]SHADOW_PARALLEL_4_SPLITS[/code]."
msgstr ""
-#: doc/classes/DirectionalLight3D.xml:39
+#: doc/classes/DirectionalLight3D.xml:37
msgid ""
"The distance from shadow split 1 to split 2. Relative to [member "
"directional_shadow_max_distance]. Only used when [member "
@@ -17070,34 +16815,34 @@ msgid ""
"[code]SHADOW_PARALLEL_4_SPLITS[/code]."
msgstr ""
-#: doc/classes/DirectionalLight3D.xml:42
+#: doc/classes/DirectionalLight3D.xml:40
msgid ""
"The distance from shadow split 2 to split 3. Relative to [member "
"directional_shadow_max_distance]. Only used when [member "
"directional_shadow_mode] is [code]SHADOW_PARALLEL_4_SPLITS[/code]."
msgstr ""
-#: doc/classes/DirectionalLight3D.xml:48
+#: doc/classes/DirectionalLight3D.xml:45
msgid ""
"Renders the entire scene's shadow map from an orthogonal point of view. May "
"result in blockier shadows on close objects."
msgstr ""
-#: doc/classes/DirectionalLight3D.xml:51
+#: doc/classes/DirectionalLight3D.xml:48
msgid "Splits the view frustum in 2 areas, each with its own shadow map."
msgstr ""
-#: doc/classes/DirectionalLight3D.xml:54
+#: doc/classes/DirectionalLight3D.xml:51
msgid "Splits the view frustum in 4 areas, each with its own shadow map."
msgstr ""
-#: doc/classes/DirectionalLight3D.xml:57
+#: doc/classes/DirectionalLight3D.xml:54
msgid ""
"Keeps the shadow stable when the camera moves, at the cost of lower "
"effective shadow resolution."
msgstr ""
-#: doc/classes/DirectionalLight3D.xml:60
+#: doc/classes/DirectionalLight3D.xml:57
msgid ""
"Tries to achieve maximum shadow resolution. May result in saw effect on "
"shadow edges."
@@ -17387,61 +17132,67 @@ msgid ""
"dynamic_font.font_data = load(\"res://BarlowCondensed-Bold.ttf\")\n"
"dynamic_font.size = 64\n"
"$\"Label\".set(\"custom_fonts/font\", dynamic_font)\n"
-"[/codeblock]"
+"[/codeblock]\n"
+"[b]Note:[/b] DynamicFont doesn't support features such as right-to-left "
+"typesetting, ligatures, text shaping, variable fonts and optional font "
+"features yet. If you wish to \"bake\" an optional font feature into a TTF "
+"font file, you can use [url=https://fontforge.org/]FontForge[/url] to do so. "
+"In FontForge, use [b]File > Generate Fonts[/b], click [b]Options[/b], choose "
+"the desired features then generate the font."
msgstr ""
-#: doc/classes/DynamicFont.xml:25
+#: doc/classes/DynamicFont.xml:26
msgid "Adds a fallback font."
msgstr ""
-#: doc/classes/DynamicFont.xml:34
+#: doc/classes/DynamicFont.xml:35
msgid "Returns the fallback font at index [code]idx[/code]."
msgstr ""
-#: doc/classes/DynamicFont.xml:41
+#: doc/classes/DynamicFont.xml:42
msgid "Returns the number of fallback fonts."
msgstr ""
-#: doc/classes/DynamicFont.xml:50
+#: doc/classes/DynamicFont.xml:51
msgid ""
"Returns the spacing for the given [code]type[/code] (see [enum SpacingType])."
msgstr ""
-#: doc/classes/DynamicFont.xml:59
+#: doc/classes/DynamicFont.xml:60
msgid "Removes the fallback font at index [code]idx[/code]."
msgstr ""
-#: doc/classes/DynamicFont.xml:70
+#: doc/classes/DynamicFont.xml:71
msgid "Sets the fallback font at index [code]idx[/code]."
msgstr ""
-#: doc/classes/DynamicFont.xml:81
+#: doc/classes/DynamicFont.xml:82
msgid ""
"Sets the spacing for [code]type[/code] (see [enum SpacingType]) to "
"[code]value[/code] in pixels (not relative to the font size)."
msgstr ""
-#: doc/classes/DynamicFont.xml:87
+#: doc/classes/DynamicFont.xml:88
msgid "Extra spacing at the bottom in pixels."
msgstr ""
-#: doc/classes/DynamicFont.xml:90
+#: doc/classes/DynamicFont.xml:91
msgid "Extra character spacing in pixels."
msgstr ""
-#: doc/classes/DynamicFont.xml:93
+#: doc/classes/DynamicFont.xml:94
msgid "Extra space spacing in pixels."
msgstr ""
-#: doc/classes/DynamicFont.xml:96
+#: doc/classes/DynamicFont.xml:97
msgid "Extra spacing at the top in pixels."
msgstr ""
-#: doc/classes/DynamicFont.xml:99
+#: doc/classes/DynamicFont.xml:100
msgid "The font data."
msgstr ""
-#: doc/classes/DynamicFont.xml:102
+#: doc/classes/DynamicFont.xml:103
msgid ""
"The font outline's color.\n"
"[b]Note:[/b] It's recommended to leave this at the default value so that you "
@@ -17450,27 +17201,27 @@ msgid ""
"outline modulate theme item."
msgstr ""
-#: doc/classes/DynamicFont.xml:106
+#: doc/classes/DynamicFont.xml:107
msgid "The font outline's thickness in pixels (not relative to the font size)."
msgstr ""
-#: doc/classes/DynamicFont.xml:109
+#: doc/classes/DynamicFont.xml:110
msgid "The font size in pixels."
msgstr ""
-#: doc/classes/DynamicFont.xml:114
+#: doc/classes/DynamicFont.xml:115
msgid "Spacing at the top."
msgstr ""
-#: doc/classes/DynamicFont.xml:117
+#: doc/classes/DynamicFont.xml:118
msgid "Spacing at the bottom."
msgstr ""
-#: doc/classes/DynamicFont.xml:120
+#: doc/classes/DynamicFont.xml:121
msgid "Character spacing."
msgstr ""
-#: doc/classes/DynamicFont.xml:123
+#: doc/classes/DynamicFont.xml:124
msgid "Space spacing."
msgstr ""
@@ -17585,7 +17336,7 @@ msgstr ""
msgid ""
"Saves the editor feature profile to a file in JSON format. It can then be "
"imported using the feature profile manager's [b]Import[/b] button or the "
-"[method load_from_file] button."
+"[method load_from_file] button."
msgstr ""
#: doc/classes/EditorFeatureProfile.xml:86
@@ -17799,56 +17550,58 @@ msgstr ""
#: doc/classes/EditorFileSystem.xml:7
msgid ""
"This object holds information of all resources in the filesystem, their "
-"types, etc."
+"types, etc.\n"
+"[b]Note:[/b] This class shouldn't be instantiated directly. Instead, access "
+"the singleton using [method EditorInterface.get_resource_filesystem]."
msgstr ""
-#: doc/classes/EditorFileSystem.xml:18
+#: doc/classes/EditorFileSystem.xml:19
msgid "Gets the type of the file, given the full path."
msgstr ""
-#: doc/classes/EditorFileSystem.xml:25
+#: doc/classes/EditorFileSystem.xml:26
msgid "Gets the root directory object."
msgstr ""
-#: doc/classes/EditorFileSystem.xml:34
+#: doc/classes/EditorFileSystem.xml:35
msgid "Returns a view into the filesystem at [code]path[/code]."
msgstr ""
-#: doc/classes/EditorFileSystem.xml:41
+#: doc/classes/EditorFileSystem.xml:42
msgid "Returns the scan progress for 0 to 1 if the FS is being scanned."
msgstr ""
-#: doc/classes/EditorFileSystem.xml:48
+#: doc/classes/EditorFileSystem.xml:49
msgid "Returns [code]true[/code] of the filesystem is being scanned."
msgstr ""
-#: doc/classes/EditorFileSystem.xml:55
+#: doc/classes/EditorFileSystem.xml:56
msgid "Scan the filesystem for changes."
msgstr ""
-#: doc/classes/EditorFileSystem.xml:62
+#: doc/classes/EditorFileSystem.xml:63
msgid "Check if the source of any imported resource changed."
msgstr ""
-#: doc/classes/EditorFileSystem.xml:71
+#: doc/classes/EditorFileSystem.xml:72
msgid ""
"Update a file information. Call this if an external program (not Godot) "
"modified the file."
msgstr ""
-#: doc/classes/EditorFileSystem.xml:78
+#: doc/classes/EditorFileSystem.xml:79
msgid "Scans the script files and updates the list of custom class names."
msgstr ""
-#: doc/classes/EditorFileSystem.xml:85
+#: doc/classes/EditorFileSystem.xml:86
msgid "Emitted if the filesystem changed."
msgstr ""
-#: doc/classes/EditorFileSystem.xml:92
+#: doc/classes/EditorFileSystem.xml:93
msgid "Remitted if a resource is reimported."
msgstr ""
-#: doc/classes/EditorFileSystem.xml:105
+#: doc/classes/EditorFileSystem.xml:106
msgid "Emitted if the source of any imported file changed."
msgstr ""
@@ -18052,7 +17805,9 @@ msgid ""
"editor. It's used to edit the properties of the selected node. For example, "
"you can select a node such as the Sprite2D then edit its transform through "
"the inspector tool. The editor inspector is an essential tool in the game "
-"development workflow."
+"development workflow.\n"
+"[b]Note:[/b] This class shouldn't be instantiated directly. Instead, access "
+"the singleton using [method EditorInterface.get_inspector]."
msgstr ""
#: doc/classes/EditorInspectorPlugin.xml:4
@@ -18122,95 +17877,97 @@ msgid ""
"customizing the window, saving and (re-)loading scenes, rendering mesh "
"previews, inspecting and editing resources and objects, and provides access "
"to [EditorSettings], [EditorFileSystem], [EditorResourcePreview], "
-"[ScriptEditor], the editor viewport, and information about scenes."
+"[ScriptEditor], the editor viewport, and information about scenes.\n"
+"[b]Note:[/b] This class shouldn't be instantiated directly. Instead, access "
+"the singleton using [method EditorPlugin.get_editor_interface]."
msgstr ""
-#: doc/classes/EditorInterface.xml:18
+#: doc/classes/EditorInterface.xml:19
msgid "Edits the given [Resource]."
msgstr ""
-#: doc/classes/EditorInterface.xml:25
+#: doc/classes/EditorInterface.xml:26
msgid ""
"Returns the main container of Godot editor's window. You can use it, for "
"example, to retrieve the size of the container and place your controls "
"accordingly."
msgstr ""
-#: doc/classes/EditorInterface.xml:38
+#: doc/classes/EditorInterface.xml:39
msgid "Returns the edited (current) scene's root [Node]."
msgstr ""
-#: doc/classes/EditorInterface.xml:45
+#: doc/classes/EditorInterface.xml:46
msgid "Returns the [EditorSettings]."
msgstr ""
-#: doc/classes/EditorInterface.xml:52
+#: doc/classes/EditorInterface.xml:53
msgid "Returns the editor [Viewport]."
msgstr ""
-#: doc/classes/EditorInterface.xml:71
+#: doc/classes/EditorInterface.xml:72
msgid "Returns an [Array] with the file paths of the currently opened scenes."
msgstr ""
-#: doc/classes/EditorInterface.xml:78
+#: doc/classes/EditorInterface.xml:79
msgid "Returns the [EditorFileSystem]."
msgstr ""
-#: doc/classes/EditorInterface.xml:85
+#: doc/classes/EditorInterface.xml:86
msgid "Returns the [EditorResourcePreview]."
msgstr ""
-#: doc/classes/EditorInterface.xml:92
+#: doc/classes/EditorInterface.xml:93
msgid "Returns the [ScriptEditor]."
msgstr ""
-#: doc/classes/EditorInterface.xml:105
+#: doc/classes/EditorInterface.xml:106
msgid "Returns the [EditorSelection]."
msgstr ""
-#: doc/classes/EditorInterface.xml:116
+#: doc/classes/EditorInterface.xml:117
msgid ""
"Shows the given property on the given [code]object[/code] in the Editor's "
"Inspector dock."
msgstr ""
-#: doc/classes/EditorInterface.xml:125
+#: doc/classes/EditorInterface.xml:126
msgid ""
"Returns the enabled status of a plugin. The plugin name is the same as its "
"directory name."
msgstr ""
-#: doc/classes/EditorInterface.xml:136
+#: doc/classes/EditorInterface.xml:137
msgid ""
"Returns mesh previews rendered at the given size as an [Array] of "
"[Texture2D]s."
msgstr ""
-#: doc/classes/EditorInterface.xml:145
+#: doc/classes/EditorInterface.xml:146
msgid "Opens the scene at the given path."
msgstr ""
-#: doc/classes/EditorInterface.xml:154
+#: doc/classes/EditorInterface.xml:155
msgid "Reloads the scene at the given path."
msgstr ""
-#: doc/classes/EditorInterface.xml:161
+#: doc/classes/EditorInterface.xml:162
msgid ""
"Saves the scene. Returns either [code]OK[/code] or [code]ERR_CANT_CREATE[/"
"code] (see [@GlobalScope] constants)."
msgstr ""
-#: doc/classes/EditorInterface.xml:172
+#: doc/classes/EditorInterface.xml:173
msgid "Saves the scene as a file at [code]path[/code]."
msgstr ""
-#: doc/classes/EditorInterface.xml:181
+#: doc/classes/EditorInterface.xml:182
msgid ""
"Selects the file, with the path provided by [code]file[/code], in the "
"FileSystem dock."
msgstr ""
-#: doc/classes/EditorInterface.xml:208
+#: doc/classes/EditorInterface.xml:209
msgid ""
"Sets the enabled status of a plugin. The plugin name is the same as its "
"directory name."
@@ -18823,57 +18580,57 @@ msgstr ""
msgid "Used by the inspector, when the property is checked."
msgstr ""
-#: doc/classes/EditorProperty.xml:82
+#: doc/classes/EditorProperty.xml:84
msgid "Used by the inspector, when the property must draw with error color."
msgstr ""
-#: doc/classes/EditorProperty.xml:85
+#: doc/classes/EditorProperty.xml:87
msgid "Used by the inspector, when the property can add keys for animation."
msgstr ""
-#: doc/classes/EditorProperty.xml:88
+#: doc/classes/EditorProperty.xml:90
msgid "Sets this property to change the label (if you want to show one)."
msgstr ""
-#: doc/classes/EditorProperty.xml:91
+#: doc/classes/EditorProperty.xml:93
msgid "Used by the inspector, when the property is read-only."
msgstr ""
-#: doc/classes/EditorProperty.xml:101
+#: doc/classes/EditorProperty.xml:103
msgid ""
"Emit it if you want multiple properties modified at the same time. Do not "
"use if added via [method EditorInspectorPlugin.parse_property]."
msgstr ""
-#: doc/classes/EditorProperty.xml:110
+#: doc/classes/EditorProperty.xml:112
msgid "Used by sub-inspectors. Emit it if what was selected was an Object ID."
msgstr ""
-#: doc/classes/EditorProperty.xml:119
+#: doc/classes/EditorProperty.xml:121
msgid ""
"Do not emit this manually, use the [method emit_changed] method instead."
msgstr ""
-#: doc/classes/EditorProperty.xml:128
+#: doc/classes/EditorProperty.xml:130
msgid "Emitted when a property was checked. Used internally."
msgstr ""
-#: doc/classes/EditorProperty.xml:135
+#: doc/classes/EditorProperty.xml:143
msgid ""
"Emit it if you want to add this value as an animation key (check for keying "
"being enabled first)."
msgstr ""
-#: doc/classes/EditorProperty.xml:144
+#: doc/classes/EditorProperty.xml:152
msgid "Emit it if you want to key a property with a single value."
msgstr ""
-#: doc/classes/EditorProperty.xml:153
+#: doc/classes/EditorProperty.xml:161
msgid ""
"If you want a sub-resource to be edited, emit this signal with the resource."
msgstr ""
-#: doc/classes/EditorProperty.xml:162
+#: doc/classes/EditorProperty.xml:170
msgid "Emitted when selected. Used internally."
msgstr ""
@@ -18882,20 +18639,23 @@ msgid "Helper to generate previews of resources or files."
msgstr ""
#: doc/classes/EditorResourcePreview.xml:7
-msgid "This object is used to generate previews for resources of files."
+msgid ""
+"This object is used to generate previews for resources of files.\n"
+"[b]Note:[/b] This class shouldn't be instantiated directly. Instead, access "
+"the singleton using [method EditorInterface.get_resource_previewer]."
msgstr ""
-#: doc/classes/EditorResourcePreview.xml:18
+#: doc/classes/EditorResourcePreview.xml:19
msgid "Create an own, custom preview generator."
msgstr ""
-#: doc/classes/EditorResourcePreview.xml:27
+#: doc/classes/EditorResourcePreview.xml:28
msgid ""
"Check if the resource changed, if so, it will be invalidated and the "
"corresponding signal emitted."
msgstr ""
-#: doc/classes/EditorResourcePreview.xml:42
+#: doc/classes/EditorResourcePreview.xml:43
msgid ""
"Queue a resource being edited for preview (using an instance). Once the "
"preview is ready, your receiver.receiver_func will be called either "
@@ -18904,7 +18664,7 @@ msgid ""
"can be anything."
msgstr ""
-#: doc/classes/EditorResourcePreview.xml:57
+#: doc/classes/EditorResourcePreview.xml:58
msgid ""
"Queue a resource file for preview (using a path). Once the preview is ready, "
"your receiver.receiver_func will be called either containing the preview "
@@ -18912,11 +18672,11 @@ msgid ""
"the format: (path,texture,userdata). Userdata can be anything."
msgstr ""
-#: doc/classes/EditorResourcePreview.xml:66
+#: doc/classes/EditorResourcePreview.xml:67
msgid "Removes a custom preview generator."
msgstr ""
-#: doc/classes/EditorResourcePreview.xml:75
+#: doc/classes/EditorResourcePreview.xml:76
msgid ""
"Emitted if a preview was invalidated (changed). [code]path[/code] "
"corresponds to the path of the preview."
@@ -19074,7 +18834,7 @@ msgstr ""
msgid ""
"Scripts extending this class and implementing its [method _run] method can "
"be executed from the Script Editor's [b]File > Run[/b] menu option (or by "
-"pressing [code]Ctrl+Shift+X[/code]) while the editor is running. This is "
+"pressing [kbd]Ctrl + Shift + X[/kbd]) while the editor is running. This is "
"useful for adding custom in-editor functionality to Godot. For more complex "
"additions, consider using [EditorPlugin]s instead.\n"
"[b]Note:[/b] Extending scripts need to have [code]tool[/code] mode enabled.\n"
@@ -19114,33 +18874,36 @@ msgid "Manages the SceneTree selection in the editor."
msgstr ""
#: doc/classes/EditorSelection.xml:7
-msgid "This object manages the SceneTree selection in the editor."
+msgid ""
+"This object manages the SceneTree selection in the editor.\n"
+"[b]Note:[/b] This class shouldn't be instantiated directly. Instead, access "
+"the singleton using [method EditorInterface.get_selection]."
msgstr ""
-#: doc/classes/EditorSelection.xml:18
+#: doc/classes/EditorSelection.xml:19
msgid "Adds a node to the selection."
msgstr ""
-#: doc/classes/EditorSelection.xml:25
+#: doc/classes/EditorSelection.xml:26
msgid "Clear the selection."
msgstr ""
-#: doc/classes/EditorSelection.xml:32
+#: doc/classes/EditorSelection.xml:33
msgid "Gets the list of selected nodes."
msgstr ""
-#: doc/classes/EditorSelection.xml:39
+#: doc/classes/EditorSelection.xml:40
msgid ""
"Gets the list of selected nodes, optimized for transform operations (i.e. "
"moving them, rotating, etc). This list avoids situations where a node is "
"selected and also child/grandchild."
msgstr ""
-#: doc/classes/EditorSelection.xml:48
+#: doc/classes/EditorSelection.xml:49
msgid "Removes a node from the selection."
msgstr ""
-#: doc/classes/EditorSelection.xml:55
+#: doc/classes/EditorSelection.xml:56
msgid "Emitted when the selection changes."
msgstr ""
@@ -19157,10 +18920,12 @@ msgid ""
"settings.set(prop,value)\n"
"settings.get(prop)\n"
"list_of_settings = settings.get_property_list()\n"
-"[/codeblock]"
+"[/codeblock]\n"
+"[b]Note:[/b] This class shouldn't be instantiated directly. Instead, access "
+"the singleton using [method EditorInterface.get_editor_settings]."
msgstr ""
-#: doc/classes/EditorSettings.xml:24
+#: doc/classes/EditorSettings.xml:25
msgid ""
"Adds a custom property info to a property. The dictionary must contain:\n"
"- [code]name[/code]: [String] (the name of the property)\n"
@@ -19182,27 +18947,27 @@ msgid ""
"[/codeblock]"
msgstr ""
-#: doc/classes/EditorSettings.xml:49
+#: doc/classes/EditorSettings.xml:50
msgid "Erase a given setting (pass full property path)."
msgstr ""
-#: doc/classes/EditorSettings.xml:56
+#: doc/classes/EditorSettings.xml:57
msgid "Gets the list of favorite files and directories for this project."
msgstr ""
-#: doc/classes/EditorSettings.xml:75
+#: doc/classes/EditorSettings.xml:76
msgid ""
"Gets the specific project settings path. Projects all have a unique sub-"
"directory inside the settings path where project specific settings are saved."
msgstr ""
-#: doc/classes/EditorSettings.xml:82
+#: doc/classes/EditorSettings.xml:83
msgid ""
"Gets the list of recently visited folders in the file dialog for this "
"project."
msgstr ""
-#: doc/classes/EditorSettings.xml:97
+#: doc/classes/EditorSettings.xml:98
msgid ""
"Gets the global settings path for the engine. Inside this path, you can find "
"some standard paths such as:\n"
@@ -19210,21 +18975,21 @@ msgid ""
"[code]settings/templates[/code] - Where export templates are located"
msgstr ""
-#: doc/classes/EditorSettings.xml:132
+#: doc/classes/EditorSettings.xml:133
msgid "Sets the list of favorite files and directories for this project."
msgstr ""
-#: doc/classes/EditorSettings.xml:165
+#: doc/classes/EditorSettings.xml:166
msgid ""
"Sets the list of recently visited folders in the file dialog for this "
"project."
msgstr ""
-#: doc/classes/EditorSettings.xml:182
+#: doc/classes/EditorSettings.xml:183
msgid "Emitted when editor settings change."
msgstr ""
-#: doc/classes/EditorSettings.xml:188
+#: doc/classes/EditorSettings.xml:189
msgid ""
"Emitted when editor settings change. It used by various editor plugins to "
"update their visuals on theme changes or logic on configuration changes."
@@ -19967,7 +19732,7 @@ msgid ""
"is visible, \"ghost trail\" artifacts will be visible when moving the camera."
msgstr ""
-#: doc/classes/Environment.xml:262 doc/classes/RenderingServer.xml:3476
+#: doc/classes/Environment.xml:262 doc/classes/RenderingServer.xml:3563
msgid "Displays a camera feed in the background."
msgstr ""
@@ -19975,64 +19740,103 @@ msgstr ""
msgid "Represents the size of the [enum BGMode] enum."
msgstr ""
-#: doc/classes/Environment.xml:282
+#: doc/classes/Environment.xml:268 doc/classes/RenderingServer.xml:3569
+msgid ""
+"Gather ambient light from whichever source is specified as the background."
+msgstr ""
+
+#: doc/classes/Environment.xml:271 doc/classes/RenderingServer.xml:3572
+msgid "Disable ambient light."
+msgstr ""
+
+#: doc/classes/Environment.xml:274 doc/classes/RenderingServer.xml:3575
+msgid "Specify a specific [Color] for ambient light."
+msgstr ""
+
+#: doc/classes/Environment.xml:277 doc/classes/RenderingServer.xml:3578
+msgid ""
+"Gather ambient light from the [Sky] regardless of what the background is."
+msgstr ""
+
+#: doc/classes/Environment.xml:280 doc/classes/RenderingServer.xml:3581
+msgid "Use the background for reflections."
+msgstr ""
+
+#: doc/classes/Environment.xml:283 doc/classes/RenderingServer.xml:3584
+msgid "Disable reflections."
+msgstr ""
+
+#: doc/classes/Environment.xml:286 doc/classes/RenderingServer.xml:3587
+msgid "Use the [Sky] for reflections regardless of what the background is."
+msgstr ""
+
+#: doc/classes/Environment.xml:289 doc/classes/RenderingServer.xml:3590
msgid ""
"Additive glow blending mode. Mostly used for particles, glows (bloom), lens "
"flare, bright sources."
msgstr ""
-#: doc/classes/Environment.xml:285
+#: doc/classes/Environment.xml:292 doc/classes/RenderingServer.xml:3593
msgid ""
"Screen glow blending mode. Increases brightness, used frequently with bloom."
msgstr ""
-#: doc/classes/Environment.xml:288
+#: doc/classes/Environment.xml:295 doc/classes/RenderingServer.xml:3596
msgid ""
"Soft light glow blending mode. Modifies contrast, exposes shadows and "
"highlights (vivid bloom)."
msgstr ""
-#: doc/classes/Environment.xml:291
+#: doc/classes/Environment.xml:298 doc/classes/RenderingServer.xml:3599
msgid ""
"Replace glow blending mode. Replaces all pixels' color by the glow value. "
"This can be used to simulate a full-screen blur effect by tweaking the glow "
"parameters to match the original image's brightness."
msgstr ""
-#: doc/classes/Environment.xml:296
+#: doc/classes/Environment.xml:301 doc/classes/RenderingServer.xml:3602
+msgid ""
+"Mixes the glow with the underlying color to avoid increasing brightness as "
+"much while still maintaining a glow effect."
+msgstr ""
+
+#: doc/classes/Environment.xml:304
msgid ""
"Linear tonemapper operator. Reads the linear data and passes it on "
"unmodified."
msgstr ""
-#: doc/classes/Environment.xml:299
+#: doc/classes/Environment.xml:307
msgid ""
"Reinhardt tonemapper operator. Performs a variation on rendered pixels' "
"colors by this formula: [code]color = color / (1 + color)[/code]."
msgstr ""
-#: doc/classes/Environment.xml:302
+#: doc/classes/Environment.xml:310
msgid "Filmic tonemapper operator."
msgstr ""
-#: doc/classes/Environment.xml:305
+#: doc/classes/Environment.xml:313
msgid "Academy Color Encoding System tonemapper operator."
msgstr ""
-#: doc/classes/Environment.xml:308
+#: doc/classes/Environment.xml:316
msgid "No blur for the screen-space ambient occlusion effect (fastest)."
msgstr ""
-#: doc/classes/Environment.xml:311
+#: doc/classes/Environment.xml:319
msgid "1×1 blur for the screen-space ambient occlusion effect."
msgstr ""
-#: doc/classes/Environment.xml:314
+#: doc/classes/Environment.xml:322
msgid "2×2 blur for the screen-space ambient occlusion effect."
msgstr ""
-#: doc/classes/Environment.xml:317
-msgid "3×3 blur for the screen-space ambient occlusion effect (slowest)."
+#: doc/classes/Environment.xml:325
+msgid ""
+"3×3 blur for the screen-space ambient occlusion effect. Increases the radius "
+"of the blur for a smoother look, but can result in checkerboard-like "
+"artifacts."
msgstr ""
#: doc/classes/Expression.xml:4
@@ -20293,26 +20097,38 @@ msgid ""
msgstr ""
#: doc/classes/File.xml:299
-msgid "Stores an integer as 16 bits in the file."
+msgid ""
+"Stores an integer as 16 bits in the file.\n"
+"[b]Note:[/b] The [code]value[/code] should lie in the interval [code][0, "
+"2^16 - 1][/code]."
msgstr ""
-#: doc/classes/File.xml:308
-msgid "Stores an integer as 32 bits in the file."
+#: doc/classes/File.xml:309
+msgid ""
+"Stores an integer as 32 bits in the file.\n"
+"[b]Note:[/b] The [code]value[/code] should lie in the interval [code][0, "
+"2^32 - 1][/code]."
msgstr ""
-#: doc/classes/File.xml:317
-msgid "Stores an integer as 64 bits in the file."
+#: doc/classes/File.xml:319
+msgid ""
+"Stores an integer as 64 bits in the file.\n"
+"[b]Note:[/b] The [code]value[/code] must lie in the interval [code][-2^63, "
+"2^63 - 1][/code] (i.e. be a valid [int] value)."
msgstr ""
-#: doc/classes/File.xml:326
-msgid "Stores an integer as 8 bits in the file."
+#: doc/classes/File.xml:329
+msgid ""
+"Stores an integer as 8 bits in the file.\n"
+"[b]Note:[/b] The [code]value[/code] should lie in the interval [code][0, 255]"
+"[/code]."
msgstr ""
-#: doc/classes/File.xml:335
+#: doc/classes/File.xml:339
msgid "Stores the given array of bytes in the file."
msgstr ""
-#: doc/classes/File.xml:346
+#: doc/classes/File.xml:350
msgid ""
"Store the given [PackedStringArray] in the file as a line formatted in the "
"CSV (Comma-Separated Values) format. You can pass a different delimiter "
@@ -20321,45 +20137,45 @@ msgid ""
"Text will be encoded as UTF-8."
msgstr ""
-#: doc/classes/File.xml:356
+#: doc/classes/File.xml:360
msgid "Stores a floating-point number as 64 bits in the file."
msgstr ""
-#: doc/classes/File.xml:365
+#: doc/classes/File.xml:369
msgid "Stores a floating-point number as 32 bits in the file."
msgstr ""
-#: doc/classes/File.xml:374
+#: doc/classes/File.xml:378
msgid ""
"Stores the given [String] as a line in the file.\n"
"Text will be encoded as UTF-8."
msgstr ""
-#: doc/classes/File.xml:384
+#: doc/classes/File.xml:388
msgid ""
"Stores the given [String] as a line in the file in Pascal format (i.e. also "
"store the length of the string).\n"
"Text will be encoded as UTF-8."
msgstr ""
-#: doc/classes/File.xml:394
+#: doc/classes/File.xml:398
msgid "Stores a floating-point number in the file."
msgstr ""
-#: doc/classes/File.xml:403
+#: doc/classes/File.xml:407
msgid ""
"Stores the given [String] in the file.\n"
"Text will be encoded as UTF-8."
msgstr ""
-#: doc/classes/File.xml:415
+#: doc/classes/File.xml:419
msgid ""
"Stores any Variant value in the file. If [code]full_objects[/code] is "
"[code]true[/code], encoding objects is allowed (and can potentially include "
"code)."
msgstr ""
-#: doc/classes/File.xml:421
+#: doc/classes/File.xml:425
msgid ""
"If [code]true[/code], the file's endianness is swapped. Use this if you're "
"dealing with files written on big-endian machines.\n"
@@ -20367,44 +20183,44 @@ msgid ""
"reset to [code]false[/code] whenever you open the file."
msgstr ""
-#: doc/classes/File.xml:427
+#: doc/classes/File.xml:431
msgid "Opens the file for read operations."
msgstr ""
-#: doc/classes/File.xml:430
+#: doc/classes/File.xml:434
msgid ""
"Opens the file for write operations. Create it if the file does not exist "
"and truncate if it exists."
msgstr ""
-#: doc/classes/File.xml:433
+#: doc/classes/File.xml:437
msgid ""
"Opens the file for read and write operations. Does not truncate the file."
msgstr ""
-#: doc/classes/File.xml:436
+#: doc/classes/File.xml:440
msgid ""
"Opens the file for read and write operations. Create it if the file does not "
"exist and truncate if it exists."
msgstr ""
-#: doc/classes/File.xml:439
+#: doc/classes/File.xml:443
msgid "Uses the [url=http://fastlz.org/]FastLZ[/url] compression method."
msgstr ""
-#: doc/classes/File.xml:442
+#: doc/classes/File.xml:446
msgid ""
"Uses the [url=https://en.wikipedia.org/wiki/DEFLATE]DEFLATE[/url] "
"compression method."
msgstr ""
-#: doc/classes/File.xml:445
+#: doc/classes/File.xml:449
msgid ""
"Uses the [url=https://facebook.github.io/zstd/]Zstandard[/url] compression "
"method."
msgstr ""
-#: doc/classes/File.xml:448
+#: doc/classes/File.xml:452
msgid "Uses the [url=https://www.gzip.org/]gzip[/url] compression method."
msgstr ""
@@ -20708,7 +20524,7 @@ msgstr ""
msgid ""
"A GDNative library can implement [NativeScript]s, global functions to call "
"with the [GDNative] class, or low-level engine extensions through interfaces "
-"such as [ARVRInterfaceGDNative]. The library must be compiled for each "
+"such as [XRInterfaceGDNative]. The library must be compiled for each "
"platform and architecture that the project will run on."
msgstr ""
@@ -21663,99 +21479,99 @@ msgid ""
"object."
msgstr ""
-#: doc/classes/GeometryInstance3D.xml:27
+#: doc/classes/GeometryInstance3D.xml:35
msgid ""
"Overrides the bounding box of this node with a custom one. To remove it, set "
"an [AABB] with all fields set to zero."
msgstr ""
-#: doc/classes/GeometryInstance3D.xml:38
+#: doc/classes/GeometryInstance3D.xml:46
msgid ""
"Sets the [enum GeometryInstance3D.Flags] specified. See [enum "
"GeometryInstance3D.Flags] for options."
msgstr ""
-#: doc/classes/GeometryInstance3D.xml:44
+#: doc/classes/GeometryInstance3D.xml:62
msgid ""
"The selected shadow casting flag. See [enum ShadowCastingSetting] for "
"possible values."
msgstr ""
-#: doc/classes/GeometryInstance3D.xml:47
+#: doc/classes/GeometryInstance3D.xml:65
msgid ""
"The extra distance added to the GeometryInstance3D's bounding box ([AABB]) "
"to increase its cull box."
msgstr ""
-#: doc/classes/GeometryInstance3D.xml:50
+#: doc/classes/GeometryInstance3D.xml:68
msgid ""
"The GeometryInstance3D's max LOD distance.\n"
"[b]Note:[/b] This property currently has no effect."
msgstr ""
-#: doc/classes/GeometryInstance3D.xml:54
+#: doc/classes/GeometryInstance3D.xml:72
msgid ""
"The GeometryInstance3D's max LOD margin.\n"
"[b]Note:[/b] This property currently has no effect."
msgstr ""
-#: doc/classes/GeometryInstance3D.xml:58
+#: doc/classes/GeometryInstance3D.xml:76
msgid ""
"The GeometryInstance3D's min LOD distance.\n"
"[b]Note:[/b] This property currently has no effect."
msgstr ""
-#: doc/classes/GeometryInstance3D.xml:62
+#: doc/classes/GeometryInstance3D.xml:80
msgid ""
"The GeometryInstance3D's min LOD margin.\n"
"[b]Note:[/b] This property currently has no effect."
msgstr ""
-#: doc/classes/GeometryInstance3D.xml:66
+#: doc/classes/GeometryInstance3D.xml:84
msgid ""
"The material override for the whole geometry.\n"
"If a material is assigned to this property, it will be used instead of any "
"material set in any material slot of the mesh."
msgstr ""
-#: doc/classes/GeometryInstance3D.xml:72
+#: doc/classes/GeometryInstance3D.xml:90
msgid ""
"If [code]true[/code], this GeometryInstance3D will be used when baking "
"lights using a [GIProbe]."
msgstr ""
-#: doc/classes/GeometryInstance3D.xml:77
+#: doc/classes/GeometryInstance3D.xml:95
msgid "Will not cast any shadows."
msgstr ""
-#: doc/classes/GeometryInstance3D.xml:80
+#: doc/classes/GeometryInstance3D.xml:98
msgid ""
"Will cast shadows from all visible faces in the GeometryInstance3D.\n"
"Will take culling into account, so faces not being rendered will not be "
"taken into account when shadow casting."
msgstr ""
-#: doc/classes/GeometryInstance3D.xml:84
+#: doc/classes/GeometryInstance3D.xml:102
msgid ""
"Will cast shadows from all visible faces in the GeometryInstance3D.\n"
"Will not take culling into account, so all faces will be taken into account "
"when shadow casting."
msgstr ""
-#: doc/classes/GeometryInstance3D.xml:88
+#: doc/classes/GeometryInstance3D.xml:106
msgid ""
"Will only show the shadows casted from this object.\n"
"In other words, the actual mesh will not be visible, only the shadows casted "
"from the mesh will be."
msgstr ""
-#: doc/classes/GeometryInstance3D.xml:92
+#: doc/classes/GeometryInstance3D.xml:110
msgid ""
"Will allow the GeometryInstance3D to be used when baking lights using a "
"[GIProbe]."
msgstr ""
-#: doc/classes/GeometryInstance3D.xml:97
+#: doc/classes/GeometryInstance3D.xml:115
msgid ""
"Unused in this class, exposed for consistency with [enum RenderingServer."
"InstanceFlags]."
@@ -22225,7 +22041,7 @@ msgid ""
msgstr ""
#: doc/classes/GraphEdit.xml:243
-msgid "Emitted when the user presses [code]Ctrl + C[/code]."
+msgid "Emitted when the user presses [kbd]Ctrl + C[/kbd]."
msgstr ""
#: doc/classes/GraphEdit.xml:248
@@ -22248,65 +22064,65 @@ msgstr ""
msgid "Emitted when a GraphNode is selected."
msgstr ""
-#: doc/classes/GraphEdit.xml:278
-msgid "Emitted when the user presses [code]Ctrl + V[/code]."
+#: doc/classes/GraphEdit.xml:284
+msgid "Emitted when the user presses [kbd]Ctrl + V[/kbd]."
msgstr ""
-#: doc/classes/GraphEdit.xml:285
+#: doc/classes/GraphEdit.xml:291
msgid ""
"Emitted when a popup is requested. Happens on right-clicking in the "
"GraphEdit. [code]position[/code] is the position of the mouse pointer when "
"the signal is sent."
msgstr ""
-#: doc/classes/GraphEdit.xml:292
+#: doc/classes/GraphEdit.xml:298
msgid ""
"Emitted when the scroll offset is changed by the user. It will not be "
"emitted when changed in code."
msgstr ""
-#: doc/classes/GraphEdit.xml:306
+#: doc/classes/GraphEdit.xml:312
msgid "The background drawn under the grid."
msgstr ""
-#: doc/classes/GraphEdit.xml:309
+#: doc/classes/GraphEdit.xml:315
msgid "Color of major grid lines."
msgstr ""
-#: doc/classes/GraphEdit.xml:312
+#: doc/classes/GraphEdit.xml:318
msgid "Color of minor grid lines."
msgstr ""
-#: doc/classes/GraphEdit.xml:315
+#: doc/classes/GraphEdit.xml:321
msgid "The icon for the zoom out button."
msgstr ""
-#: doc/classes/GraphEdit.xml:318
+#: doc/classes/GraphEdit.xml:324
msgid "The icon for the zoom in button."
msgstr ""
-#: doc/classes/GraphEdit.xml:321
+#: doc/classes/GraphEdit.xml:327
msgid ""
"The horizontal range within which a port can be grabbed (on both sides)."
msgstr ""
-#: doc/classes/GraphEdit.xml:324
+#: doc/classes/GraphEdit.xml:330
msgid "The vertical range within which a port can be grabbed (on both sides)."
msgstr ""
-#: doc/classes/GraphEdit.xml:327
+#: doc/classes/GraphEdit.xml:333
msgid "The icon for the zoom reset button."
msgstr ""
-#: doc/classes/GraphEdit.xml:330
+#: doc/classes/GraphEdit.xml:336
msgid "The fill color of the selection rectangle."
msgstr ""
-#: doc/classes/GraphEdit.xml:333
+#: doc/classes/GraphEdit.xml:339
msgid "The outline color of the selection rectangle."
msgstr ""
-#: doc/classes/GraphEdit.xml:336
+#: doc/classes/GraphEdit.xml:342
msgid "The icon for the snap toggle button."
msgstr ""
@@ -23039,21 +22855,21 @@ msgstr ""
msgid "The background of the area to the left of the grabber."
msgstr ""
-#: doc/classes/HSlider.xml:23 doc/classes/VSlider.xml:27
+#: doc/classes/HSlider.xml:25 doc/classes/VSlider.xml:29
msgid "The texture for the grabber when it's disabled."
msgstr ""
-#: doc/classes/HSlider.xml:26 doc/classes/VSlider.xml:30
+#: doc/classes/HSlider.xml:28 doc/classes/VSlider.xml:32
msgid "The texture for the grabber when it's focused."
msgstr ""
-#: doc/classes/HSlider.xml:29
+#: doc/classes/HSlider.xml:31
msgid ""
"The background for the whole slider. Determines the height of the "
"[code]grabber_area[/code]."
msgstr ""
-#: doc/classes/HSlider.xml:32 doc/classes/VSlider.xml:36
+#: doc/classes/HSlider.xml:34 doc/classes/VSlider.xml:38
msgid ""
"The texture for the ticks, visible when [member Slider.tick_count] is "
"greater than 0."
@@ -23996,16 +23812,19 @@ msgstr ""
msgid ""
"Native image datatype. Contains image data, which can be converted to a "
"[Texture2D], and several functions to interact with it. The maximum width "
-"and height for an [Image] are [constant MAX_WIDTH] and [constant MAX_HEIGHT]."
+"and height for an [Image] are [constant MAX_WIDTH] and [constant "
+"MAX_HEIGHT].\n"
+"[b]Note:[/b] The maximum image size is 16384×16384 pixels due to graphics "
+"hardware limitations. Larger images will fail to import."
msgstr ""
-#: doc/classes/Image.xml:22
+#: doc/classes/Image.xml:23
msgid ""
"Alpha-blends [code]src_rect[/code] from [code]src[/code] image to this image "
"at coordinates [code]dest[/code]."
msgstr ""
-#: doc/classes/Image.xml:37
+#: doc/classes/Image.xml:38
msgid ""
"Alpha-blends [code]src_rect[/code] from [code]src[/code] image to this image "
"using [code]mask[/code] image at coordinates [code]dst[/code]. Alpha "
@@ -24016,13 +23835,13 @@ msgid ""
"but they can have different formats."
msgstr ""
-#: doc/classes/Image.xml:50
+#: doc/classes/Image.xml:51
msgid ""
"Copies [code]src_rect[/code] from [code]src[/code] image to this image at "
"coordinates [code]dst[/code]."
msgstr ""
-#: doc/classes/Image.xml:65
+#: doc/classes/Image.xml:66
msgid ""
"Blits [code]src_rect[/code] area from [code]src[/code] image to this image "
"at the coordinates given by [code]dst[/code]. [code]src[/code] pixel is "
@@ -24032,17 +23851,17 @@ msgid ""
"different formats."
msgstr ""
-#: doc/classes/Image.xml:74
+#: doc/classes/Image.xml:75
msgid ""
"Converts a bumpmap to a normalmap. A bumpmap provides a height offset per-"
"pixel, while a normalmap provides a normal direction per pixel."
msgstr ""
-#: doc/classes/Image.xml:81
+#: doc/classes/Image.xml:82
msgid "Removes the image's mipmaps."
msgstr ""
-#: doc/classes/Image.xml:94
+#: doc/classes/Image.xml:95
msgid ""
"Compresses the image to use less memory. Can not directly access pixel data "
"while the image is compressed. Returns error if the chosen compression mode "
@@ -24050,22 +23869,22 @@ msgid ""
"constants."
msgstr ""
-#: doc/classes/Image.xml:115
+#: doc/classes/Image.xml:116
msgid "Converts the image's format. See [enum Format] constants."
msgstr ""
-#: doc/classes/Image.xml:124
+#: doc/classes/Image.xml:125
msgid "Copies [code]src[/code] image to this image."
msgstr ""
-#: doc/classes/Image.xml:139
+#: doc/classes/Image.xml:140
msgid ""
"Creates an empty image of given size and format. See [enum Format] "
"constants. If [code]use_mipmaps[/code] is [code]true[/code] then generate "
"mipmaps for this image. See the [method generate_mipmaps]."
msgstr ""
-#: doc/classes/Image.xml:156
+#: doc/classes/Image.xml:157
msgid ""
"Creates a new image of given size and format. See [enum Format] constants. "
"Fills the image with the given raw data. If [code]use_mipmaps[/code] is "
@@ -24073,49 +23892,49 @@ msgid ""
"generate_mipmaps]."
msgstr ""
-#: doc/classes/Image.xml:167
+#: doc/classes/Image.xml:168
msgid ""
"Crops the image to the given [code]width[/code] and [code]height[/code]. If "
"the specified size is larger than the current size, the extra area is filled "
"with black pixels."
msgstr ""
-#: doc/classes/Image.xml:174
+#: doc/classes/Image.xml:175
msgid ""
"Decompresses the image if it is compressed. Returns an error if decompress "
"function is not available."
msgstr ""
-#: doc/classes/Image.xml:181
+#: doc/classes/Image.xml:182
msgid ""
"Returns [constant ALPHA_BLEND] if the image has data for alpha values. "
"Returns [constant ALPHA_BIT] if all the alpha values are stored in a single "
"bit. Returns [constant ALPHA_NONE] if no data for alpha values is found."
msgstr ""
-#: doc/classes/Image.xml:196
+#: doc/classes/Image.xml:197
msgid ""
"Stretches the image and enlarges it by a factor of 2. No interpolation is "
"done."
msgstr ""
-#: doc/classes/Image.xml:205
+#: doc/classes/Image.xml:206
msgid "Fills the image with a given [Color]."
msgstr ""
-#: doc/classes/Image.xml:212
+#: doc/classes/Image.xml:213
msgid "Blends low-alpha pixels with nearby pixels."
msgstr ""
-#: doc/classes/Image.xml:219
+#: doc/classes/Image.xml:220
msgid "Flips the image horizontally."
msgstr ""
-#: doc/classes/Image.xml:226
+#: doc/classes/Image.xml:227
msgid "Flips the image vertically."
msgstr ""
-#: doc/classes/Image.xml:235
+#: doc/classes/Image.xml:236
msgid ""
"Generates mipmaps for the image. Mipmaps are pre-calculated and lower "
"resolution copies of the image. Mipmaps are automatically used if the image "
@@ -24124,125 +23943,129 @@ msgid ""
"in a custom format or if the image's width/height is 0."
msgstr ""
-#: doc/classes/Image.xml:242
+#: doc/classes/Image.xml:243
msgid "Returns the image's raw data."
msgstr ""
-#: doc/classes/Image.xml:249
+#: doc/classes/Image.xml:250
msgid "Returns the image's format. See [enum Format] constants."
msgstr ""
-#: doc/classes/Image.xml:256
+#: doc/classes/Image.xml:257
msgid "Returns the image's height."
msgstr ""
-#: doc/classes/Image.xml:265
+#: doc/classes/Image.xml:266
msgid ""
"Returns the offset where the image's mipmap with index [code]mipmap[/code] "
"is stored in the [code]data[/code] dictionary."
msgstr ""
-#: doc/classes/Image.xml:276
+#: doc/classes/Image.xml:277
msgid ""
"Returns the color of the pixel at [code](x, y)[/code]. This is the same as "
"[method get_pixelv], but with two integer arguments instead of a [Vector2] "
"argument."
msgstr ""
-#: doc/classes/Image.xml:285
+#: doc/classes/Image.xml:286
msgid ""
"Returns the color of the pixel at [code]src[/code]. This is the same as "
"[method get_pixel], but with a [Vector2] argument instead of two integer "
"arguments."
msgstr ""
-#: doc/classes/Image.xml:294
+#: doc/classes/Image.xml:295
msgid ""
"Returns a new image that is a copy of the image's area specified with "
"[code]rect[/code]."
msgstr ""
-#: doc/classes/Image.xml:301
+#: doc/classes/Image.xml:302
msgid "Returns the image's size (width and height)."
msgstr ""
-#: doc/classes/Image.xml:308
+#: doc/classes/Image.xml:309
msgid ""
"Returns a [Rect2] enclosing the visible portion of the image, considering "
"each pixel with a non-zero alpha channel as visible."
msgstr ""
-#: doc/classes/Image.xml:315
+#: doc/classes/Image.xml:316
msgid "Returns the image's width."
msgstr ""
-#: doc/classes/Image.xml:322
+#: doc/classes/Image.xml:323
msgid "Returns [code]true[/code] if the image has generated mipmaps."
msgstr ""
-#: doc/classes/Image.xml:329
+#: doc/classes/Image.xml:330
msgid "Returns [code]true[/code] if the image is compressed."
msgstr ""
-#: doc/classes/Image.xml:336
+#: doc/classes/Image.xml:337
msgid "Returns [code]true[/code] if the image has no data."
msgstr ""
-#: doc/classes/Image.xml:343
+#: doc/classes/Image.xml:344
msgid ""
"Returns [code]true[/code] if all the image's pixels have an alpha value of "
"0. Returns [code]false[/code] if any pixel has an alpha value higher than 0."
msgstr ""
-#: doc/classes/Image.xml:352
-msgid "Loads an image from file [code]path[/code]."
+#: doc/classes/Image.xml:353
+msgid ""
+"Loads an image from file [code]path[/code]. See [url=https://docs."
+"godotengine.org/en/latest/getting_started/workflow/assets/importing_images."
+"html#supported-image-formats]Supported image formats[/url] for a list of "
+"supported image formats and limitations."
msgstr ""
-#: doc/classes/Image.xml:361
+#: doc/classes/Image.xml:362
msgid "Loads an image from the binary contents of a JPEG file."
msgstr ""
-#: doc/classes/Image.xml:370
+#: doc/classes/Image.xml:371
msgid "Loads an image from the binary contents of a PNG file."
msgstr ""
-#: doc/classes/Image.xml:379
+#: doc/classes/Image.xml:380
msgid "Loads an image from the binary contents of a WebP file."
msgstr ""
-#: doc/classes/Image.xml:386
+#: doc/classes/Image.xml:387
msgid ""
"Converts the image's data to represent coordinates on a 3D plane. This is "
"used when the image represents a normalmap. A normalmap can add lots of "
"detail to a 3D surface without increasing the polygon count."
msgstr ""
-#: doc/classes/Image.xml:393
+#: doc/classes/Image.xml:394
msgid ""
"Multiplies color values with alpha values. Resulting color values for a "
"pixel are [code](color * alpha)/256[/code]."
msgstr ""
-#: doc/classes/Image.xml:406
+#: doc/classes/Image.xml:407
msgid ""
"Resizes the image to the given [code]width[/code] and [code]height[/code]. "
"New pixels are calculated using [code]interpolation[/code]. See "
"[code]interpolation[/code] constants."
msgstr ""
-#: doc/classes/Image.xml:415
+#: doc/classes/Image.xml:416
msgid ""
"Resizes the image to the nearest power of 2 for the width and height. If "
"[code]square[/code] is [code]true[/code] then set width and height to be the "
"same."
msgstr ""
-#: doc/classes/Image.xml:422
+#: doc/classes/Image.xml:423
msgid ""
"Converts a standard RGBE (Red Green Blue Exponent) image to an sRGB image."
msgstr ""
-#: doc/classes/Image.xml:433
+#: doc/classes/Image.xml:434
msgid ""
"Saves the image as an EXR file to [code]path[/code]. If [code]grayscale[/"
"code] is [code]true[/code] and the image has only one channel, it will be "
@@ -24251,11 +24074,11 @@ msgid ""
"TinyEXR module."
msgstr ""
-#: doc/classes/Image.xml:442
+#: doc/classes/Image.xml:443
msgid "Saves the image as a PNG file to [code]path[/code]."
msgstr ""
-#: doc/classes/Image.xml:455
+#: doc/classes/Image.xml:456
msgid ""
"Sets the [Color] of the pixel at [code](x, y)[/code]. Example:\n"
"[codeblock]\n"
@@ -24265,7 +24088,7 @@ msgid ""
"[/codeblock]"
msgstr ""
-#: doc/classes/Image.xml:471
+#: doc/classes/Image.xml:472
msgid ""
"Sets the [Color] of the pixel at [code](dst.x, dst.y)[/code]. Note that the "
"[code]dst[/code] values must be integers. Example:\n"
@@ -24276,51 +24099,51 @@ msgid ""
"[/codeblock]"
msgstr ""
-#: doc/classes/Image.xml:483
+#: doc/classes/Image.xml:484
msgid "Shrinks the image by a factor of 2."
msgstr ""
-#: doc/classes/Image.xml:490
+#: doc/classes/Image.xml:491
msgid "Converts the raw data from the sRGB colorspace to a linear scale."
msgstr ""
-#: doc/classes/Image.xml:496
+#: doc/classes/Image.xml:497
msgid ""
"Holds all of the image's color data in a given format. See [enum Format] "
"constants."
msgstr ""
-#: doc/classes/Image.xml:501
+#: doc/classes/Image.xml:502
msgid "The maximal width allowed for [Image] resources."
msgstr ""
-#: doc/classes/Image.xml:504
+#: doc/classes/Image.xml:505
msgid "The maximal height allowed for [Image] resources."
msgstr ""
-#: doc/classes/Image.xml:507
+#: doc/classes/Image.xml:508
msgid "Texture format with a single 8-bit depth representing luminance."
msgstr ""
-#: doc/classes/Image.xml:510
+#: doc/classes/Image.xml:511
msgid ""
"OpenGL texture format with two values, luminance and alpha each stored with "
"8 bits."
msgstr ""
-#: doc/classes/Image.xml:513
+#: doc/classes/Image.xml:514
msgid ""
"OpenGL texture format [code]RED[/code] with a single component and a "
"bitdepth of 8."
msgstr ""
-#: doc/classes/Image.xml:516
+#: doc/classes/Image.xml:517
msgid ""
"OpenGL texture format [code]RG[/code] with two components and a bitdepth of "
"8 for each."
msgstr ""
-#: doc/classes/Image.xml:519
+#: doc/classes/Image.xml:520
msgid ""
"OpenGL texture format [code]RGB[/code] with three components, each with a "
"bitdepth of 8.\n"
@@ -24328,7 +24151,7 @@ msgid ""
"conversion is performed."
msgstr ""
-#: doc/classes/Image.xml:523
+#: doc/classes/Image.xml:524
msgid ""
"OpenGL texture format [code]RGBA[/code] with four components, each with a "
"bitdepth of 8.\n"
@@ -24336,67 +24159,67 @@ msgid ""
"conversion is performed."
msgstr ""
-#: doc/classes/Image.xml:527
+#: doc/classes/Image.xml:528
msgid ""
"OpenGL texture format [code]RGBA[/code] with four components, each with a "
"bitdepth of 4."
msgstr ""
-#: doc/classes/Image.xml:532
+#: doc/classes/Image.xml:533
msgid ""
"OpenGL texture format [code]GL_R32F[/code] where there's one component, a 32-"
"bit floating-point value."
msgstr ""
-#: doc/classes/Image.xml:535
+#: doc/classes/Image.xml:536
msgid ""
"OpenGL texture format [code]GL_RG32F[/code] where there are two components, "
"each a 32-bit floating-point values."
msgstr ""
-#: doc/classes/Image.xml:538
+#: doc/classes/Image.xml:539
msgid ""
"OpenGL texture format [code]GL_RGB32F[/code] where there are three "
"components, each a 32-bit floating-point values."
msgstr ""
-#: doc/classes/Image.xml:541
+#: doc/classes/Image.xml:542
msgid ""
"OpenGL texture format [code]GL_RGBA32F[/code] where there are four "
"components, each a 32-bit floating-point values."
msgstr ""
-#: doc/classes/Image.xml:544
+#: doc/classes/Image.xml:545
msgid ""
"OpenGL texture format [code]GL_R32F[/code] where there's one component, a 16-"
"bit \"half-precision\" floating-point value."
msgstr ""
-#: doc/classes/Image.xml:547
+#: doc/classes/Image.xml:548
msgid ""
"OpenGL texture format [code]GL_RG32F[/code] where there are two components, "
"each a 16-bit \"half-precision\" floating-point value."
msgstr ""
-#: doc/classes/Image.xml:550
+#: doc/classes/Image.xml:551
msgid ""
"OpenGL texture format [code]GL_RGB32F[/code] where there are three "
"components, each a 16-bit \"half-precision\" floating-point value."
msgstr ""
-#: doc/classes/Image.xml:553
+#: doc/classes/Image.xml:554
msgid ""
"OpenGL texture format [code]GL_RGBA32F[/code] where there are four "
"components, each a 16-bit \"half-precision\" floating-point value."
msgstr ""
-#: doc/classes/Image.xml:556
+#: doc/classes/Image.xml:557
msgid ""
"A special OpenGL texture format where the three color components have 9 bits "
"of precision and all three share a single 5-bit exponent."
msgstr ""
-#: doc/classes/Image.xml:559
+#: doc/classes/Image.xml:560
msgid ""
"The [url=https://en.wikipedia.org/wiki/S3_Texture_Compression]S3TC[/url] "
"texture format that uses Block Compression 1, and is the smallest variation "
@@ -24406,7 +24229,7 @@ msgid ""
"conversion is performed."
msgstr ""
-#: doc/classes/Image.xml:563
+#: doc/classes/Image.xml:564
msgid ""
"The [url=https://en.wikipedia.org/wiki/S3_Texture_Compression]S3TC[/url] "
"texture format that uses Block Compression 2, and color data is interpreted "
@@ -24416,7 +24239,7 @@ msgid ""
"conversion is performed."
msgstr ""
-#: doc/classes/Image.xml:567
+#: doc/classes/Image.xml:568
msgid ""
"The [url=https://en.wikipedia.org/wiki/S3_Texture_Compression]S3TC[/url] "
"texture format also known as Block Compression 3 or BC3 that contains 64 "
@@ -24427,7 +24250,7 @@ msgid ""
"conversion is performed."
msgstr ""
-#: doc/classes/Image.xml:571
+#: doc/classes/Image.xml:572
msgid ""
"Texture format that uses [url=https://www.khronos.org/opengl/wiki/"
"Red_Green_Texture_Compression]Red Green Texture Compression[/url], "
@@ -24435,7 +24258,7 @@ msgid ""
"DXT5 uses for the alpha channel."
msgstr ""
-#: doc/classes/Image.xml:574
+#: doc/classes/Image.xml:575
msgid ""
"Texture format that uses [url=https://www.khronos.org/opengl/wiki/"
"Red_Green_Texture_Compression]Red Green Texture Compression[/url], "
@@ -24443,7 +24266,7 @@ msgid ""
"algorithm that DXT5 uses for the alpha channel."
msgstr ""
-#: doc/classes/Image.xml:577
+#: doc/classes/Image.xml:578
msgid ""
"Texture format that uses [url=https://www.khronos.org/opengl/wiki/"
"BPTC_Texture_Compression]BPTC[/url] compression with unsigned normalized "
@@ -24452,21 +24275,21 @@ msgid ""
"conversion is performed."
msgstr ""
-#: doc/classes/Image.xml:581
+#: doc/classes/Image.xml:582
msgid ""
"Texture format that uses [url=https://www.khronos.org/opengl/wiki/"
"BPTC_Texture_Compression]BPTC[/url] compression with signed floating-point "
"RGB components."
msgstr ""
-#: doc/classes/Image.xml:584
+#: doc/classes/Image.xml:585
msgid ""
"Texture format that uses [url=https://www.khronos.org/opengl/wiki/"
"BPTC_Texture_Compression]BPTC[/url] compression with unsigned floating-point "
"RGB components."
msgstr ""
-#: doc/classes/Image.xml:587
+#: doc/classes/Image.xml:588
msgid ""
"Texture format used on PowerVR-supported mobile platforms, uses 2-bit color "
"depth with no alpha. More information can be found [url=https://en.wikipedia."
@@ -24475,25 +24298,25 @@ msgid ""
"conversion is performed."
msgstr ""
-#: doc/classes/Image.xml:591
+#: doc/classes/Image.xml:592
msgid ""
"Same as [url=https://en.wikipedia.org/wiki/PVRTC]PVRTC2[/url], but with an "
"alpha component."
msgstr ""
-#: doc/classes/Image.xml:594
+#: doc/classes/Image.xml:595
msgid ""
"Similar to [url=https://en.wikipedia.org/wiki/PVRTC]PVRTC2[/url], but with 4-"
"bit color depth and no alpha."
msgstr ""
-#: doc/classes/Image.xml:597
+#: doc/classes/Image.xml:598
msgid ""
"Same as [url=https://en.wikipedia.org/wiki/PVRTC]PVRTC4[/url], but with an "
"alpha component."
msgstr ""
-#: doc/classes/Image.xml:600
+#: doc/classes/Image.xml:601
msgid ""
"[url=https://en.wikipedia.org/wiki/"
"Ericsson_Texture_Compression#ETC1]Ericsson Texture Compression format 1[/"
@@ -24501,7 +24324,7 @@ msgid ""
"standard. This format cannot store an alpha channel."
msgstr ""
-#: doc/classes/Image.xml:603
+#: doc/classes/Image.xml:604
msgid ""
"[url=https://en.wikipedia.org/wiki/"
"Ericsson_Texture_Compression#ETC2_and_EAC]Ericsson Texture Compression "
@@ -24509,7 +24332,7 @@ msgid ""
"unsigned data."
msgstr ""
-#: doc/classes/Image.xml:606
+#: doc/classes/Image.xml:607
msgid ""
"[url=https://en.wikipedia.org/wiki/"
"Ericsson_Texture_Compression#ETC2_and_EAC]Ericsson Texture Compression "
@@ -24517,7 +24340,7 @@ msgid ""
"channel of signed data."
msgstr ""
-#: doc/classes/Image.xml:609
+#: doc/classes/Image.xml:610
msgid ""
"[url=https://en.wikipedia.org/wiki/"
"Ericsson_Texture_Compression#ETC2_and_EAC]Ericsson Texture Compression "
@@ -24525,7 +24348,7 @@ msgid ""
"of unsigned data."
msgstr ""
-#: doc/classes/Image.xml:612
+#: doc/classes/Image.xml:613
msgid ""
"[url=https://en.wikipedia.org/wiki/"
"Ericsson_Texture_Compression#ETC2_and_EAC]Ericsson Texture Compression "
@@ -24533,7 +24356,7 @@ msgid ""
"channels of signed data."
msgstr ""
-#: doc/classes/Image.xml:615
+#: doc/classes/Image.xml:616
msgid ""
"[url=https://en.wikipedia.org/wiki/"
"Ericsson_Texture_Compression#ETC2_and_EAC]Ericsson Texture Compression "
@@ -24543,7 +24366,7 @@ msgid ""
"conversion is performed."
msgstr ""
-#: doc/classes/Image.xml:619
+#: doc/classes/Image.xml:620
msgid ""
"[url=https://en.wikipedia.org/wiki/"
"Ericsson_Texture_Compression#ETC2_and_EAC]Ericsson Texture Compression "
@@ -24553,7 +24376,7 @@ msgid ""
"conversion is performed."
msgstr ""
-#: doc/classes/Image.xml:623
+#: doc/classes/Image.xml:624
msgid ""
"[url=https://en.wikipedia.org/wiki/"
"Ericsson_Texture_Compression#ETC2_and_EAC]Ericsson Texture Compression "
@@ -24564,31 +24387,31 @@ msgid ""
"conversion is performed."
msgstr ""
-#: doc/classes/Image.xml:631
+#: doc/classes/Image.xml:632
msgid "Represents the size of the [enum Format] enum."
msgstr ""
-#: doc/classes/Image.xml:634
+#: doc/classes/Image.xml:635
msgid ""
"Performs nearest-neighbor interpolation. If the image is resized, it will be "
"pixelated."
msgstr ""
-#: doc/classes/Image.xml:637
+#: doc/classes/Image.xml:638
msgid ""
"Performs bilinear interpolation. If the image is resized, it will be blurry. "
"This mode is faster than [constant INTERPOLATE_CUBIC], but it results in "
"lower quality."
msgstr ""
-#: doc/classes/Image.xml:640
+#: doc/classes/Image.xml:641
msgid ""
"Performs cubic interpolation. If the image is resized, it will be blurry. "
"This mode often gives better results compared to [constant "
"INTERPOLATE_BILINEAR], at the cost of being slower."
msgstr ""
-#: doc/classes/Image.xml:643
+#: doc/classes/Image.xml:644
msgid ""
"Performs bilinear separately on the two most-suited mipmap levels, then "
"linearly interpolates between them.\n"
@@ -24603,55 +24426,55 @@ msgid ""
"a new set will be generated for the resulting image."
msgstr ""
-#: doc/classes/Image.xml:650
+#: doc/classes/Image.xml:651
msgid ""
"Performs Lanczos interpolation. This is the slowest image resizing mode, but "
"it typically gives the best results, especially when downscalng images."
msgstr ""
-#: doc/classes/Image.xml:653
+#: doc/classes/Image.xml:654
msgid "Image does not have alpha."
msgstr ""
-#: doc/classes/Image.xml:656
+#: doc/classes/Image.xml:657
msgid "Image stores alpha in a single bit."
msgstr ""
-#: doc/classes/Image.xml:659
+#: doc/classes/Image.xml:660
msgid "Image uses alpha."
msgstr ""
-#: doc/classes/Image.xml:662
+#: doc/classes/Image.xml:663
msgid "Use S3TC compression."
msgstr ""
-#: doc/classes/Image.xml:665
+#: doc/classes/Image.xml:666
msgid "Use PVRTC2 compression."
msgstr ""
-#: doc/classes/Image.xml:668
+#: doc/classes/Image.xml:669
msgid "Use PVRTC4 compression."
msgstr ""
-#: doc/classes/Image.xml:671
+#: doc/classes/Image.xml:672
msgid "Use ETC compression."
msgstr ""
-#: doc/classes/Image.xml:674
+#: doc/classes/Image.xml:675
msgid "Use ETC2 compression."
msgstr ""
-#: doc/classes/Image.xml:689
+#: doc/classes/Image.xml:690
msgid ""
"Source texture (before compression) is a regular texture. Default for all "
"textures."
msgstr ""
-#: doc/classes/Image.xml:692
+#: doc/classes/Image.xml:693
msgid "Source texture (before compression) is in sRGB space."
msgstr ""
-#: doc/classes/Image.xml:695
+#: doc/classes/Image.xml:696
msgid ""
"Source texture (before compression) is a normal texture (e.g. it can be "
"compressed into two channels)."
@@ -24664,22 +24487,24 @@ msgstr ""
#: doc/classes/ImageTexture.xml:7
msgid ""
"A [Texture2D] based on an [Image]. Can be created from an [Image] with "
-"[method create_from_image]."
+"[method create_from_image].\n"
+"[b]Note:[/b] The maximum image size is 16384×16384 pixels due to graphics "
+"hardware limitations. Larger images will fail to import."
msgstr ""
-#: doc/classes/ImageTexture.xml:18
+#: doc/classes/ImageTexture.xml:19
msgid "Create a new [ImageTexture] from an [Image]."
msgstr ""
-#: doc/classes/ImageTexture.xml:25
+#: doc/classes/ImageTexture.xml:26
msgid "Returns the format of the [ImageTexture], one of [enum Image.Format]."
msgstr ""
-#: doc/classes/ImageTexture.xml:34
+#: doc/classes/ImageTexture.xml:35
msgid "Resizes the [ImageTexture] to the specified dimensions."
msgstr ""
-#: doc/classes/ImageTexture.xml:45
+#: doc/classes/ImageTexture.xml:46
msgid ""
"Replaces the texture's data with a new [code]image[/code]. If "
"[code]immediate[/code] is [code]true[/code], it will take effect immediately "
@@ -24692,20 +24517,29 @@ msgstr ""
#: doc/classes/ImmediateGeometry3D.xml:7
msgid ""
-"Draws simple geometry from code. Uses a drawing mode similar to OpenGL 1.x."
+"Draws simple geometry from code. Uses a drawing mode similar to OpenGL 1.x.\n"
+"See also [ArrayMesh], [MeshDataTool] and [SurfaceTool] for procedural "
+"geometry generation.\n"
+"[b]Note:[/b] ImmediateGeometry3D is best suited to small amounts of mesh "
+"data that change every frame. It will be slow when handling large amounts of "
+"mesh data. If mesh data doesn't change often, use [ArrayMesh], "
+"[MeshDataTool] or [SurfaceTool] instead.\n"
+"[b]Note:[/b] Godot uses clockwise [url=https://learnopengl.com/Advanced-"
+"OpenGL/Face-culling]winding order[/url] for front faces of triangle "
+"primitive modes."
msgstr ""
-#: doc/classes/ImmediateGeometry3D.xml:24
+#: doc/classes/ImmediateGeometry3D.xml:27
msgid ""
"Simple helper to draw an UV sphere with given latitude, longitude and radius."
msgstr ""
-#: doc/classes/ImmediateGeometry3D.xml:33
+#: doc/classes/ImmediateGeometry3D.xml:36
msgid ""
"Adds a vertex in local coordinate space with the currently set color/uv/etc."
msgstr ""
-#: doc/classes/ImmediateGeometry3D.xml:44
+#: doc/classes/ImmediateGeometry3D.xml:47
msgid ""
"Begin drawing (and optionally pass a texture override). When done call "
"[method end]. For more information on how this works, search for "
@@ -24713,34 +24547,454 @@ msgid ""
"For the type of primitive, see the [enum Mesh.PrimitiveType] enum."
msgstr ""
-#: doc/classes/ImmediateGeometry3D.xml:52
+#: doc/classes/ImmediateGeometry3D.xml:55
msgid "Clears everything that was drawn using begin/end."
msgstr ""
-#: doc/classes/ImmediateGeometry3D.xml:59
+#: doc/classes/ImmediateGeometry3D.xml:62
msgid "Ends a drawing context and displays the results."
msgstr ""
-#: doc/classes/ImmediateGeometry3D.xml:68
+#: doc/classes/ImmediateGeometry3D.xml:71
msgid "The current drawing color."
msgstr ""
-#: doc/classes/ImmediateGeometry3D.xml:77
+#: doc/classes/ImmediateGeometry3D.xml:80
msgid "The next vertex's normal."
msgstr ""
-#: doc/classes/ImmediateGeometry3D.xml:86
+#: doc/classes/ImmediateGeometry3D.xml:89
msgid "The next vertex's tangent (and binormal facing)."
msgstr ""
-#: doc/classes/ImmediateGeometry3D.xml:95
+#: doc/classes/ImmediateGeometry3D.xml:98
msgid "The next vertex's UV."
msgstr ""
-#: doc/classes/ImmediateGeometry3D.xml:104
+#: doc/classes/ImmediateGeometry3D.xml:107
msgid "The next vertex's second layer UV."
msgstr ""
+#: doc/classes/Input.xml:4
+msgid "A singleton that deals with inputs."
+msgstr ""
+
+#: doc/classes/Input.xml:7
+msgid ""
+"A singleton that deals with inputs. This includes key presses, mouse buttons "
+"and movement, joypads, and input actions. Actions and their events can be "
+"set in the [b]Input Map[/b] tab in the [b]Project > Project Settings[/b], or "
+"with the [InputMap] class."
+msgstr ""
+
+#: doc/classes/Input.xml:10
+msgid "https://docs.godotengine.org/en/latest/tutorials/inputs/index.html"
+msgstr ""
+
+#: doc/classes/Input.xml:21
+msgid ""
+"This will simulate pressing the specified action.\n"
+"The strength can be used for non-boolean actions, it's ranged between 0 and "
+"1 representing the intensity of the given action.\n"
+"[b]Note:[/b] This method will not cause any [method Node._input] calls. It "
+"is intended to be used with [method is_action_pressed] and [method "
+"is_action_just_pressed]. If you want to simulate [code]_input[/code], use "
+"[method parse_input_event] instead."
+msgstr ""
+
+#: doc/classes/Input.xml:32
+msgid "If the specified action is already pressed, this will release it."
+msgstr ""
+
+#: doc/classes/Input.xml:43
+msgid ""
+"Adds a new mapping entry (in SDL2 format) to the mapping database. "
+"Optionally update already connected devices."
+msgstr ""
+
+#: doc/classes/Input.xml:50
+msgid ""
+"If the device has an accelerometer, this will return the acceleration. "
+"Otherwise, it returns an empty [Vector3].\n"
+"Note this method returns an empty [Vector3] when running from the editor "
+"even when your device has an accelerometer. You must export your project to "
+"a supported device to read values from the accelerometer."
+msgstr ""
+
+#: doc/classes/Input.xml:60
+msgid ""
+"Returns a value between 0 and 1 representing the intensity of the given "
+"action. In a joypad, for example, the further away the axis (analog sticks "
+"or L2, R2 triggers) is from the dead zone, the closer the value will be to "
+"1. If the action is mapped to a control that has no axis as the keyboard, "
+"the value returned will be 0 or 1."
+msgstr ""
+
+#: doc/classes/Input.xml:67
+msgid ""
+"Returns an [Array] containing the device IDs of all currently connected "
+"joypads."
+msgstr ""
+
+#: doc/classes/Input.xml:74
+msgid "Returns the currently assigned cursor shape (see [enum CursorShape])."
+msgstr ""
+
+#: doc/classes/Input.xml:81
+msgid ""
+"If the device has an accelerometer, this will return the gravity. Otherwise, "
+"it returns an empty [Vector3]."
+msgstr ""
+
+#: doc/classes/Input.xml:88
+msgid ""
+"If the device has a gyroscope, this will return the rate of rotation in rad/"
+"s around a device's X, Y, and Z axes. Otherwise, it returns an empty "
+"[Vector3]."
+msgstr ""
+
+#: doc/classes/Input.xml:99
+msgid ""
+"Returns the current value of the joypad axis at given index (see [enum "
+"JoystickList])."
+msgstr ""
+
+#: doc/classes/Input.xml:108
+msgid "Returns the index of the provided axis name."
+msgstr ""
+
+#: doc/classes/Input.xml:117
+msgid ""
+"Receives a [enum JoystickList] axis and returns its equivalent name as a "
+"string."
+msgstr ""
+
+#: doc/classes/Input.xml:126
+msgid "Returns the index of the provided button name."
+msgstr ""
+
+#: doc/classes/Input.xml:135
+msgid ""
+"Receives a gamepad button from [enum JoystickList] and returns its "
+"equivalent name as a string."
+msgstr ""
+
+#: doc/classes/Input.xml:144
+msgid ""
+"Returns a SDL2-compatible device GUID on platforms that use gamepad "
+"remapping. Returns [code]\"Default Gamepad\"[/code] otherwise."
+msgstr ""
+
+#: doc/classes/Input.xml:153
+msgid "Returns the name of the joypad at the specified device index."
+msgstr ""
+
+#: doc/classes/Input.xml:162
+msgid "Returns the duration of the current vibration effect in seconds."
+msgstr ""
+
+#: doc/classes/Input.xml:171
+msgid ""
+"Returns the strength of the joypad vibration: x is the strength of the weak "
+"motor, and y is the strength of the strong motor."
+msgstr ""
+
+#: doc/classes/Input.xml:178
+msgid ""
+"Returns the mouse speed for the last time the cursor was moved, and this "
+"until the next frame where the mouse moves. This means that even if the "
+"mouse is not moving, this function will still return the value of the last "
+"motion."
+msgstr ""
+
+#: doc/classes/Input.xml:185
+msgid ""
+"If the device has a magnetometer, this will return the magnetic field "
+"strength in micro-Tesla for all axes."
+msgstr ""
+
+#: doc/classes/Input.xml:192
+msgid ""
+"Returns mouse buttons as a bitmask. If multiple mouse buttons are pressed at "
+"the same time, the bits are added together."
+msgstr ""
+
+#: doc/classes/Input.xml:199
+msgid "Returns the mouse mode. See the constants for more information."
+msgstr ""
+
+#: doc/classes/Input.xml:208
+msgid ""
+"Returns [code]true[/code] when the user starts pressing the action event, "
+"meaning it's [code]true[/code] only on the frame that the user pressed down "
+"the button.\n"
+"This is useful for code that needs to run only once when an action is "
+"pressed, instead of every frame while it's pressed."
+msgstr ""
+
+#: doc/classes/Input.xml:218
+msgid ""
+"Returns [code]true[/code] when the user stops pressing the action event, "
+"meaning it's [code]true[/code] only on the frame that the user released the "
+"button."
+msgstr ""
+
+#: doc/classes/Input.xml:227
+msgid ""
+"Returns [code]true[/code] if you are pressing the action event. Note that if "
+"an action has multiple buttons assigned and more than one of them is "
+"pressed, releasing one button will release the action, even if some other "
+"button assigned to this action is still pressed."
+msgstr ""
+
+#: doc/classes/Input.xml:238
+msgid ""
+"Returns [code]true[/code] if you are pressing the joypad button (see [enum "
+"JoystickList])."
+msgstr ""
+
+#: doc/classes/Input.xml:247
+msgid ""
+"Returns [code]true[/code] if the system knows the specified device. This "
+"means that it sets all button and axis indices exactly as defined in [enum "
+"JoystickList]. Unknown joypads are not expected to match these constants, "
+"but you can still retrieve events from them."
+msgstr ""
+
+#: doc/classes/Input.xml:256
+msgid ""
+"Returns [code]true[/code] if you are pressing the key in the current "
+"keyboard layout. You can pass a [enum KeyList] constant."
+msgstr ""
+
+#: doc/classes/Input.xml:265
+msgid ""
+"Returns [code]true[/code] if you are pressing the mouse button specified "
+"with [enum ButtonList]."
+msgstr ""
+
+#: doc/classes/Input.xml:280
+msgid ""
+"Notifies the [Input] singleton that a connection has changed, to update the "
+"state for the [code]device[/code] index.\n"
+"This is used internally and should not have to be called from user scripts. "
+"See [signal joy_connection_changed] for the signal emitted when this is "
+"triggered internally."
+msgstr ""
+
+#: doc/classes/Input.xml:290
+msgid ""
+"Feeds an [InputEvent] to the game. Can be used to artificially trigger input "
+"events from code. Also generates [method Node._input] calls.\n"
+"Example:\n"
+"[codeblock]\n"
+"var a = InputEventAction.new()\n"
+"a.action = \"ui_cancel\"\n"
+"a.pressed = true\n"
+"Input.parse_input_event(a)\n"
+"[/codeblock]"
+msgstr ""
+
+#: doc/classes/Input.xml:306
+msgid ""
+"Removes all mappings from the internal database that match the given GUID."
+msgstr ""
+
+#: doc/classes/Input.xml:319
+msgid ""
+"Sets a custom mouse cursor image, which is only visible inside the game "
+"window. The hotspot can also be specified. Passing [code]null[/code] to the "
+"image parameter resets to the system cursor. See [enum CursorShape] for the "
+"list of shapes.\n"
+"[code]image[/code]'s size must be lower than 256×256.\n"
+"[code]hotspot[/code] must be within [code]image[/code]'s size.\n"
+"[b]Note:[/b] [AnimatedTexture]s aren't supported as custom mouse cursors. If "
+"using an [AnimatedTexture], only the first frame will be displayed.\n"
+"[b]Note:[/b] Only images imported with the [b]Lossless[/b], [b]Lossy[/b] or "
+"[b]Uncompressed[/b] compression modes are supported. The [b]Video RAM[/b] "
+"compression mode can't be used for custom cursors."
+msgstr ""
+
+#: doc/classes/Input.xml:332
+msgid ""
+"Sets the default cursor shape to be used in the viewport instead of "
+"[constant CURSOR_ARROW].\n"
+"[b]Note:[/b] If you want to change the default cursor shape for [Control]'s "
+"nodes, use [member Control.mouse_default_cursor_shape] instead.\n"
+"[b]Note:[/b] This method generates an [InputEventMouseMotion] to update "
+"cursor immediately."
+msgstr ""
+
+#: doc/classes/Input.xml:343
+msgid "Sets the mouse mode. See the constants for more information."
+msgstr ""
+
+#: doc/classes/Input.xml:352
+msgid ""
+"Enables or disables the accumulation of similar input events sent by the "
+"operating system. When input accumulation is enabled, all input events "
+"generated during a frame will be merged and emitted when the frame is done "
+"rendering. Therefore, this limits the number of input method calls per "
+"second to the rendering FPS.\n"
+"Input accumulation is enabled by default. It can be disabled to get slightly "
+"more precise/reactive input at the cost of increased CPU usage. In "
+"applications where drawing freehand lines is required, input accumulation "
+"should generally be disabled while the user is drawing the line to get "
+"results that closely follow the actual input."
+msgstr ""
+
+#: doc/classes/Input.xml:368
+msgid ""
+"Starts to vibrate the joypad. Joypads usually come with two rumble motors, a "
+"strong and a weak one. [code]weak_magnitude[/code] is the strength of the "
+"weak motor (between 0 and 1) and [code]strong_magnitude[/code] is the "
+"strength of the strong motor (between 0 and 1). [code]duration[/code] is the "
+"duration of the effect in seconds (a duration of 0 will try to play the "
+"vibration indefinitely).\n"
+"[b]Note:[/b] Not every hardware is compatible with long effect durations; it "
+"is recommended to restart an effect if it has to be played for more than a "
+"few seconds."
+msgstr ""
+
+#: doc/classes/Input.xml:378
+msgid "Stops the vibration of the joypad."
+msgstr ""
+
+#: doc/classes/Input.xml:387
+msgid ""
+"Vibrate Android and iOS devices.\n"
+"[b]Note:[/b] It needs VIBRATE permission for Android at export settings. iOS "
+"does not support duration."
+msgstr ""
+
+#: doc/classes/Input.xml:397
+msgid "Sets the mouse position to the specified vector."
+msgstr ""
+
+#: doc/classes/Input.xml:408
+msgid "Emitted when a joypad device has been connected or disconnected."
+msgstr ""
+
+#: doc/classes/Input.xml:414
+msgid "Makes the mouse cursor visible if it is hidden."
+msgstr ""
+
+#: doc/classes/Input.xml:417
+msgid "Makes the mouse cursor hidden if it is visible."
+msgstr ""
+
+#: doc/classes/Input.xml:420
+msgid ""
+"Captures the mouse. The mouse will be hidden and unable to leave the game "
+"window, but it will still register movement and mouse button presses. On "
+"Windows and Linux, the mouse will use raw input mode, which means the "
+"reported movement will be unaffected by the OS' mouse acceleration settings."
+msgstr ""
+
+#: doc/classes/Input.xml:423
+msgid "Makes the mouse cursor visible but confines it to the game window."
+msgstr ""
+
+#: doc/classes/Input.xml:426
+msgid "Arrow cursor. Standard, default pointing cursor."
+msgstr ""
+
+#: doc/classes/Input.xml:429
+msgid ""
+"I-beam cursor. Usually used to show where the text cursor will appear when "
+"the mouse is clicked."
+msgstr ""
+
+#: doc/classes/Input.xml:432
+msgid ""
+"Pointing hand cursor. Usually used to indicate the pointer is over a link or "
+"other interactable item."
+msgstr ""
+
+#: doc/classes/Input.xml:435
+msgid ""
+"Cross cursor. Typically appears over regions in which a drawing operation "
+"can be performed or for selections."
+msgstr ""
+
+#: doc/classes/Input.xml:438
+msgid ""
+"Wait cursor. Indicates that the application is busy performing an operation. "
+"This cursor shape denotes that the application is still usable during the "
+"operation."
+msgstr ""
+
+#: doc/classes/Input.xml:441
+msgid ""
+"Busy cursor. Indicates that the application is busy performing an operation. "
+"This cursor shape denotes that the application isn't usable during the "
+"operation (e.g. something is blocking its main thread)."
+msgstr ""
+
+#: doc/classes/Input.xml:444
+msgid "Drag cursor. Usually displayed when dragging something."
+msgstr ""
+
+#: doc/classes/Input.xml:447
+msgid ""
+"Can drop cursor. Usually displayed when dragging something to indicate that "
+"it can be dropped at the current position."
+msgstr ""
+
+#: doc/classes/Input.xml:450
+msgid ""
+"Forbidden cursor. Indicates that the current action is forbidden (for "
+"example, when dragging something) or that the control at a position is "
+"disabled."
+msgstr ""
+
+#: doc/classes/Input.xml:453
+msgid ""
+"Vertical resize mouse cursor. A double-headed vertical arrow. It tells the "
+"user they can resize the window or the panel vertically."
+msgstr ""
+
+#: doc/classes/Input.xml:456
+msgid ""
+"Horizontal resize mouse cursor. A double-headed horizontal arrow. It tells "
+"the user they can resize the window or the panel horizontally."
+msgstr ""
+
+#: doc/classes/Input.xml:459
+msgid ""
+"Window resize mouse cursor. The cursor is a double-headed arrow that goes "
+"from the bottom left to the top right. It tells the user they can resize the "
+"window or the panel both horizontally and vertically."
+msgstr ""
+
+#: doc/classes/Input.xml:462
+msgid ""
+"Window resize mouse cursor. The cursor is a double-headed arrow that goes "
+"from the top left to the bottom right, the opposite of [constant "
+"CURSOR_BDIAGSIZE]. It tells the user they can resize the window or the panel "
+"both horizontally and vertically."
+msgstr ""
+
+#: doc/classes/Input.xml:465
+msgid "Move cursor. Indicates that something can be moved."
+msgstr ""
+
+#: doc/classes/Input.xml:468
+msgid ""
+"Vertical split mouse cursor. On Windows, it's the same as [constant "
+"CURSOR_VSIZE]."
+msgstr ""
+
+#: doc/classes/Input.xml:471
+msgid ""
+"Horizontal split mouse cursor. On Windows, it's the same as [constant "
+"CURSOR_HSIZE]."
+msgstr ""
+
+#: doc/classes/Input.xml:474
+msgid "Help cursor. Usually a question mark."
+msgstr ""
+
#: doc/classes/InputEvent.xml:4
msgid "Generic input event."
msgstr ""
@@ -24946,8 +25200,8 @@ msgstr ""
#: doc/classes/InputEventKey.xml:17
msgid ""
-"Returns the keycode combined with modifier keys such as [code]Shift[/code] "
-"or [code]Alt[/code]. See also [InputEventWithModifiers].\n"
+"Returns the keycode combined with modifier keys such as [kbd]Shift[/kbd] or "
+"[kbd]Alt[/kbd]. See also [InputEventWithModifiers].\n"
"To get a human-readable representation of the [InputEventKey] with "
"modifiers, use [code]OS.get_keycode_string(event."
"get_keycode_with_modifiers())[/code] where [code]event[/code] is the "
@@ -24956,8 +25210,8 @@ msgstr ""
#: doc/classes/InputEventKey.xml:25
msgid ""
-"Returns the physical keycode combined with modifier keys such as "
-"[code]Shift[/code] or [code]Alt[/code]. See also [InputEventWithModifiers].\n"
+"Returns the physical keycode combined with modifier keys such as [kbd]Shift[/"
+"kbd] or [kbd]Alt[/kbd]. See also [InputEventWithModifiers].\n"
"To get a human-readable representation of the [InputEventKey] with "
"modifiers, use [code]OS.get_keycode_string(event."
"get_physical_keycode_with_modifiers())[/code] where [code]event[/code] is "
@@ -25164,448 +25418,28 @@ msgstr ""
#: doc/classes/InputEventWithModifiers.xml:7
msgid ""
-"Contains keys events information with modifiers support like [code]Shift[/"
-"code] or [code]Alt[/code]. See [method Node._input]."
+"Contains keys events information with modifiers support like [kbd]Shift[/"
+"kbd] or [kbd]Alt[/kbd]. See [method Node._input]."
msgstr ""
#: doc/classes/InputEventWithModifiers.xml:16
-msgid "State of the [code]Alt[/code] modifier."
+msgid "State of the [kbd]Alt[/kbd] modifier."
msgstr ""
#: doc/classes/InputEventWithModifiers.xml:19
-msgid "State of the [code]Command[/code] modifier."
+msgid "State of the [kbd]Cmd[/kbd] modifier."
msgstr ""
#: doc/classes/InputEventWithModifiers.xml:22
-msgid "State of the [code]Ctrl[/code] modifier."
+msgid "State of the [kbd]Ctrl[/kbd] modifier."
msgstr ""
#: doc/classes/InputEventWithModifiers.xml:25
-msgid "State of the [code]Meta[/code] modifier."
+msgid "State of the [kbd]Meta[/kbd] modifier."
msgstr ""
#: doc/classes/InputEventWithModifiers.xml:28
-msgid "State of the [code]Shift[/code] modifier."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:4
-msgid "A singleton that deals with inputs."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:7
-msgid ""
-"A singleton that deals with inputs. This includes key presses, mouse buttons "
-"and movement, joypads, and input actions. Actions and their events can be "
-"set in the [b]Input Map[/b] tab in the [b]Project > Project Settings[/b], or "
-"with the [InputMap] class."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:10
-msgid "https://docs.godotengine.org/en/latest/tutorials/inputs/index.html"
-msgstr ""
-
-#: doc/classes/InputFilter.xml:21
-msgid ""
-"This will simulate pressing the specified action.\n"
-"The strength can be used for non-boolean actions, it's ranged between 0 and "
-"1 representing the intensity of the given action.\n"
-"[b]Note:[/b] This method will not cause any [method Node._input] calls. It "
-"is intended to be used with [method is_action_pressed] and [method "
-"is_action_just_pressed]. If you want to simulate [code]_input[/code], use "
-"[method parse_input_event] instead."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:32
-msgid "If the specified action is already pressed, this will release it."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:43
-msgid ""
-"Adds a new mapping entry (in SDL2 format) to the mapping database. "
-"Optionally update already connected devices."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:50
-msgid ""
-"If the device has an accelerometer, this will return the acceleration. "
-"Otherwise, it returns an empty [Vector3].\n"
-"Note this method returns an empty [Vector3] when running from the editor "
-"even when your device has an accelerometer. You must export your project to "
-"a supported device to read values from the accelerometer."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:60
-msgid ""
-"Returns a value between 0 and 1 representing the intensity of the given "
-"action. In a joypad, for example, the further away the axis (analog sticks "
-"or L2, R2 triggers) is from the dead zone, the closer the value will be to "
-"1. If the action is mapped to a control that has no axis as the keyboard, "
-"the value returned will be 0 or 1."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:67
-msgid ""
-"Returns an [Array] containing the device IDs of all currently connected "
-"joypads."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:74
-msgid "Returns the currently assigned cursor shape (see [enum CursorShape])."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:81
-msgid ""
-"If the device has an accelerometer, this will return the gravity. Otherwise, "
-"it returns an empty [Vector3]."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:88
-msgid ""
-"If the device has a gyroscope, this will return the rate of rotation in rad/"
-"s around a device's X, Y, and Z axes. Otherwise, it returns an empty "
-"[Vector3]."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:99
-msgid ""
-"Returns the current value of the joypad axis at given index (see [enum "
-"JoystickList])."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:108
-msgid "Returns the index of the provided axis name."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:117
-msgid ""
-"Receives a [enum JoystickList] axis and returns its equivalent name as a "
-"string."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:126
-msgid "Returns the index of the provided button name."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:135
-msgid ""
-"Receives a gamepad button from [enum JoystickList] and returns its "
-"equivalent name as a string."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:144
-msgid ""
-"Returns a SDL2-compatible device GUID on platforms that use gamepad "
-"remapping. Returns [code]\"Default Gamepad\"[/code] otherwise."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:153
-msgid "Returns the name of the joypad at the specified device index."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:162
-msgid "Returns the duration of the current vibration effect in seconds."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:171
-msgid ""
-"Returns the strength of the joypad vibration: x is the strength of the weak "
-"motor, and y is the strength of the strong motor."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:178
-msgid ""
-"Returns the mouse speed for the last time the cursor was moved, and this "
-"until the next frame where the mouse moves. This means that even if the "
-"mouse is not moving, this function will still return the value of the last "
-"motion."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:185
-msgid ""
-"If the device has a magnetometer, this will return the magnetic field "
-"strength in micro-Tesla for all axes."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:192
-msgid ""
-"Returns mouse buttons as a bitmask. If multiple mouse buttons are pressed at "
-"the same time, the bits are added together."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:199
-msgid "Returns the mouse mode. See the constants for more information."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:208
-msgid ""
-"Returns [code]true[/code] when the user starts pressing the action event, "
-"meaning it's [code]true[/code] only on the frame that the user pressed down "
-"the button.\n"
-"This is useful for code that needs to run only once when an action is "
-"pressed, instead of every frame while it's pressed."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:218
-msgid ""
-"Returns [code]true[/code] when the user stops pressing the action event, "
-"meaning it's [code]true[/code] only on the frame that the user released the "
-"button."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:227
-msgid ""
-"Returns [code]true[/code] if you are pressing the action event. Note that if "
-"an action has multiple buttons assigned and more than one of them is "
-"pressed, releasing one button will release the action, even if some other "
-"button assigned to this action is still pressed."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:238
-msgid ""
-"Returns [code]true[/code] if you are pressing the joypad button (see [enum "
-"JoystickList])."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:247
-msgid ""
-"Returns [code]true[/code] if the system knows the specified device. This "
-"means that it sets all button and axis indices exactly as defined in [enum "
-"JoystickList]. Unknown joypads are not expected to match these constants, "
-"but you can still retrieve events from them."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:256
-msgid ""
-"Returns [code]true[/code] if you are pressing the key in the current "
-"keyboard layout. You can pass a [enum KeyList] constant."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:265
-msgid ""
-"Returns [code]true[/code] if you are pressing the mouse button specified "
-"with [enum ButtonList]."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:280
-msgid ""
-"Notifies the [InputFilter] singleton that a connection has changed, to "
-"update the state for the [code]device[/code] index.\n"
-"This is used internally and should not have to be called from user scripts. "
-"See [signal joy_connection_changed] for the signal emitted when this is "
-"triggered internally."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:290
-msgid ""
-"Feeds an [InputEvent] to the game. Can be used to artificially trigger input "
-"events from code. Also generates [method Node._input] calls.\n"
-"Example:\n"
-"[codeblock]\n"
-"var a = InputEventAction.new()\n"
-"a.action = \"ui_cancel\"\n"
-"a.pressed = true\n"
-"InputFilter.parse_input_event(a)\n"
-"[/codeblock]"
-msgstr ""
-
-#: doc/classes/InputFilter.xml:306
-msgid ""
-"Removes all mappings from the internal database that match the given GUID."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:319
-msgid ""
-"Sets a custom mouse cursor image, which is only visible inside the game "
-"window. The hotspot can also be specified. Passing [code]null[/code] to the "
-"image parameter resets to the system cursor. See [enum CursorShape] for the "
-"list of shapes.\n"
-"[code]image[/code]'s size must be lower than 256×256.\n"
-"[code]hotspot[/code] must be within [code]image[/code]'s size.\n"
-"[b]Note:[/b] [AnimatedTexture]s aren't supported as custom mouse cursors. If "
-"using an [AnimatedTexture], only the first frame will be displayed.\n"
-"[b]Note:[/b] Only images imported with the [b]Lossless[/b], [b]Lossy[/b] or "
-"[b]Uncompressed[/b] compression modes are supported. The [b]Video RAM[/b] "
-"compression mode can't be used for custom cursors."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:332
-msgid ""
-"Sets the default cursor shape to be used in the viewport instead of "
-"[constant CURSOR_ARROW].\n"
-"[b]Note:[/b] If you want to change the default cursor shape for [Control]'s "
-"nodes, use [member Control.mouse_default_cursor_shape] instead.\n"
-"[b]Note:[/b] This method generates an [InputEventMouseMotion] to update "
-"cursor immediately."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:343
-msgid "Sets the mouse mode. See the constants for more information."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:352
-msgid ""
-"Enables or disables the accumulation of similar input events sent by the "
-"operating system. When input accumulation is enabled, all input events "
-"generated during a frame will be merged and emitted when the frame is done "
-"rendering. Therefore, this limits the number of input method calls per "
-"second to the rendering FPS.\n"
-"Input accumulation is enabled by default. It can be disabled to get slightly "
-"more precise/reactive input at the cost of increased CPU usage. In "
-"applications where drawing freehand lines is required, input accumulation "
-"should generally be disabled while the user is drawing the line to get "
-"results that closely follow the actual input."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:368
-msgid ""
-"Starts to vibrate the joypad. Joypads usually come with two rumble motors, a "
-"strong and a weak one. [code]weak_magnitude[/code] is the strength of the "
-"weak motor (between 0 and 1) and [code]strong_magnitude[/code] is the "
-"strength of the strong motor (between 0 and 1). [code]duration[/code] is the "
-"duration of the effect in seconds (a duration of 0 will try to play the "
-"vibration indefinitely).\n"
-"[b]Note:[/b] Not every hardware is compatible with long effect durations; it "
-"is recommended to restart an effect if it has to be played for more than a "
-"few seconds."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:378
-msgid "Stops the vibration of the joypad."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:387
-msgid ""
-"Vibrate Android and iOS devices.\n"
-"[b]Note:[/b] It needs VIBRATE permission for Android at export settings. iOS "
-"does not support duration."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:397
-msgid "Sets the mouse position to the specified vector."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:408
-msgid "Emitted when a joypad device has been connected or disconnected."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:414
-msgid "Makes the mouse cursor visible if it is hidden."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:417
-msgid "Makes the mouse cursor hidden if it is visible."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:420
-msgid ""
-"Captures the mouse. The mouse will be hidden and unable to leave the game "
-"window, but it will still register movement and mouse button presses. On "
-"Windows and Linux, the mouse will use raw input mode, which means the "
-"reported movement will be unaffected by the OS' mouse acceleration settings."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:423
-msgid "Makes the mouse cursor visible but confines it to the game window."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:426
-msgid "Arrow cursor. Standard, default pointing cursor."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:429
-msgid ""
-"I-beam cursor. Usually used to show where the text cursor will appear when "
-"the mouse is clicked."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:432
-msgid ""
-"Pointing hand cursor. Usually used to indicate the pointer is over a link or "
-"other interactable item."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:435
-msgid ""
-"Cross cursor. Typically appears over regions in which a drawing operation "
-"can be performed or for selections."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:438
-msgid ""
-"Wait cursor. Indicates that the application is busy performing an operation. "
-"This cursor shape denotes that the application is still usable during the "
-"operation."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:441
-msgid ""
-"Busy cursor. Indicates that the application is busy performing an operation. "
-"This cursor shape denotes that the application isn't usable during the "
-"operation (e.g. something is blocking its main thread)."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:444
-msgid "Drag cursor. Usually displayed when dragging something."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:447
-msgid ""
-"Can drop cursor. Usually displayed when dragging something to indicate that "
-"it can be dropped at the current position."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:450
-msgid ""
-"Forbidden cursor. Indicates that the current action is forbidden (for "
-"example, when dragging something) or that the control at a position is "
-"disabled."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:453
-msgid ""
-"Vertical resize mouse cursor. A double-headed vertical arrow. It tells the "
-"user they can resize the window or the panel vertically."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:456
-msgid ""
-"Horizontal resize mouse cursor. A double-headed horizontal arrow. It tells "
-"the user they can resize the window or the panel horizontally."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:459
-msgid ""
-"Window resize mouse cursor. The cursor is a double-headed arrow that goes "
-"from the bottom left to the top right. It tells the user they can resize the "
-"window or the panel both horizontally and vertically."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:462
-msgid ""
-"Window resize mouse cursor. The cursor is a double-headed arrow that goes "
-"from the top left to the bottom right, the opposite of [constant "
-"CURSOR_BDIAGSIZE]. It tells the user they can resize the window or the panel "
-"both horizontally and vertically."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:465
-msgid "Move cursor. Indicates that something can be moved."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:468
-msgid ""
-"Vertical split mouse cursor. On Windows, it's the same as [constant "
-"CURSOR_VSIZE]."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:471
-msgid ""
-"Horizontal split mouse cursor. On Windows, it's the same as [constant "
-"CURSOR_HSIZE]."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:474
-msgid "Help cursor. Usually a question mark."
+msgid "State of the [kbd]Shift[/kbd] modifier."
msgstr ""
#: doc/classes/InputMap.xml:4
@@ -25876,14 +25710,6 @@ msgstr ""
msgid "Address type: Any."
msgstr ""
-#: doc/classes/IP_Unix.xml:4
-msgid "UNIX IP support. See [IP]."
-msgstr ""
-
-#: doc/classes/IP_Unix.xml:7
-msgid "UNIX-specific implementation of IP support functions. See [IP]."
-msgstr ""
-
#: doc/classes/ItemList.xml:4
msgid ""
"Control that provides a list of selectable items (and/or icons) in a single "
@@ -25898,7 +25724,7 @@ msgid ""
"Selectable items in the list may be selected or deselected and multiple "
"selection may be enabled. Selection with right mouse button may also be "
"enabled to allow use of popup context menus. Items may also be \"activated\" "
-"by double-clicking them or by pressing Enter.\n"
+"by double-clicking them or by pressing [kbd]Enter[/kbd].\n"
"Item text only supports single-line strings, newline characters (e.g. "
"[code]\\n[/code]) in the string won't produce a newline. Text wrapping is "
"enabled in [constant ICON_MODE_TOP] mode, but column's width is adjusted to "
@@ -26057,7 +25883,7 @@ msgstr ""
msgid ""
"Disables (or enables) the item at the specified index.\n"
"Disabled items cannot be selected and do not trigger activation signals "
-"(when double-clicking or pressing Enter)."
+"(when double-clicking or pressing [kbd]Enter[/kbd])."
msgstr ""
#: doc/classes/ItemList.xml:292
@@ -26192,7 +26018,7 @@ msgstr ""
#: doc/classes/ItemList.xml:455
msgid ""
"Triggered when specified list item is activated via double-clicking or by "
-"pressing Enter."
+"pressing [kbd]Enter[/kbd]."
msgstr ""
#: doc/classes/ItemList.xml:464
@@ -26242,7 +26068,9 @@ msgid "Only allow selecting a single item."
msgstr ""
#: doc/classes/ItemList.xml:511
-msgid "Allows selecting multiple items by holding Ctrl or Shift."
+msgid ""
+"Allows selecting multiple items by holding [kbd]Ctrl[/kbd] or [kbd]Shift[/"
+"kbd]."
msgstr ""
#: doc/classes/ItemList.xml:516
@@ -27233,59 +27061,91 @@ msgid ""
msgstr ""
#: doc/classes/Light3D.xml:39
-msgid "The light's bake mode. See [enum BakeMode]."
+msgid ""
+"Angular size of the light in degrees. Only available for "
+"[DirectionalLight3D]s. For reference, the sun from earth is approximately "
+"[code]0.5[/code]."
msgstr ""
#: doc/classes/Light3D.xml:42
-msgid "The light's color."
+msgid "The light's bake mode. See [enum BakeMode]."
msgstr ""
#: doc/classes/Light3D.xml:45
-msgid "The light will affect objects in the selected layers."
+msgid "The light's color."
msgstr ""
#: doc/classes/Light3D.xml:48
-msgid "The light's strength multiplier."
+msgid "The light will affect objects in the selected layers."
msgstr ""
#: doc/classes/Light3D.xml:51
+msgid "The light's strength multiplier."
+msgstr ""
+
+#: doc/classes/Light3D.xml:54
msgid ""
"Secondary multiplier used with indirect light (light bounces). Used with "
"[GIProbe]."
msgstr ""
-#: doc/classes/Light3D.xml:54
+#: doc/classes/Light3D.xml:57
msgid ""
"If [code]true[/code], the light's effect is reversed, darkening areas and "
"casting bright shadows."
msgstr ""
-#: doc/classes/Light3D.xml:57
+#: doc/classes/Light3D.xml:60
+msgid ""
+"[Texture2D] projected by light. [member shadow_enabled] must be on for the "
+"projector to work. Light projectors make the light appear as if it is "
+"shining through a colored but transparent object, almost like light shining "
+"through stained glass."
+msgstr ""
+
+#: doc/classes/Light3D.xml:63
+msgid ""
+"The size of the light in Godot units. Only available for [OmniLight3D]s and "
+"[SpotLight3D]s."
+msgstr ""
+
+#: doc/classes/Light3D.xml:66
msgid ""
"The intensity of the specular blob in objects affected by the light. At "
"[code]0[/code] the light becomes a pure diffuse light."
msgstr ""
-#: doc/classes/Light3D.xml:60
+#: doc/classes/Light3D.xml:69
msgid ""
"Used to adjust shadow appearance. Too small a value results in self-"
"shadowing, while too large a value causes shadows to separate from casters. "
"Adjust as needed."
msgstr ""
-#: doc/classes/Light3D.xml:63
-msgid "The color of shadows cast by this light."
+#: doc/classes/Light3D.xml:72 doc/classes/RenderingServer.xml:3374
+msgid ""
+"Blurs the edges of the shadow. Can be used to hide pixel artifacts in low "
+"resolution shadow maps. A high value can make shadows appear grainy and can "
+"cause other unwanted artifacts. Try to keep as near default as possible."
msgstr ""
-#: doc/classes/Light3D.xml:66
-msgid "Attempts to reduce [member shadow_bias] gap."
+#: doc/classes/Light3D.xml:75
+msgid "The color of shadows cast by this light."
msgstr ""
-#: doc/classes/Light3D.xml:69
+#: doc/classes/Light3D.xml:78
msgid "If [code]true[/code], the light will cast shadows."
msgstr ""
-#: doc/classes/Light3D.xml:72
+#: doc/classes/Light3D.xml:81
+msgid ""
+"Offsets the lookup into the shadow map by the objects normal. This can be "
+"used reduce self-shadowing artifacts without using [member shadow_bias]. In "
+"practice, this value should be tweaked along with [member shadow_bias] to "
+"reduce artifacts as much as possible."
+msgstr ""
+
+#: doc/classes/Light3D.xml:84
msgid ""
"If [code]true[/code], reverses the backface culling of the mesh. This can be "
"useful when you have a flat mesh that has a light behind it. If you need to "
@@ -27294,93 +27154,105 @@ msgid ""
"SHADOW_CASTING_SETTING_DOUBLE_SIDED]."
msgstr ""
-#: doc/classes/Light3D.xml:77
+#: doc/classes/Light3D.xml:91
msgid "Constant for accessing [member light_energy]."
msgstr ""
-#: doc/classes/Light3D.xml:80
+#: doc/classes/Light3D.xml:94
msgid "Constant for accessing [member light_indirect_energy]."
msgstr ""
-#: doc/classes/Light3D.xml:83
+#: doc/classes/Light3D.xml:97
msgid "Constant for accessing [member light_specular]."
msgstr ""
-#: doc/classes/Light3D.xml:86
+#: doc/classes/Light3D.xml:100
msgid ""
"Constant for accessing [member OmniLight3D.omni_range] or [member "
"SpotLight3D.spot_range]."
msgstr ""
-#: doc/classes/Light3D.xml:89
+#: doc/classes/Light3D.xml:103
+msgid "Constant for accessing [member light_size]."
+msgstr ""
+
+#: doc/classes/Light3D.xml:106
msgid ""
"Constant for accessing [member OmniLight3D.omni_attenuation] or [member "
"SpotLight3D.spot_attenuation]."
msgstr ""
-#: doc/classes/Light3D.xml:92
+#: doc/classes/Light3D.xml:109
msgid "Constant for accessing [member SpotLight3D.spot_angle]."
msgstr ""
-#: doc/classes/Light3D.xml:95
+#: doc/classes/Light3D.xml:112
msgid "Constant for accessing [member SpotLight3D.spot_angle_attenuation]."
msgstr ""
-#: doc/classes/Light3D.xml:98
-msgid "Constant for accessing [member shadow_contact]."
-msgstr ""
-
-#: doc/classes/Light3D.xml:101
+#: doc/classes/Light3D.xml:115
msgid ""
"Constant for accessing [member DirectionalLight3D."
"directional_shadow_max_distance]."
msgstr ""
-#: doc/classes/Light3D.xml:104
+#: doc/classes/Light3D.xml:118
msgid ""
"Constant for accessing [member DirectionalLight3D."
"directional_shadow_split_1]."
msgstr ""
-#: doc/classes/Light3D.xml:107
+#: doc/classes/Light3D.xml:121
msgid ""
"Constant for accessing [member DirectionalLight3D."
"directional_shadow_split_2]."
msgstr ""
-#: doc/classes/Light3D.xml:110
+#: doc/classes/Light3D.xml:124
msgid ""
"Constant for accessing [member DirectionalLight3D."
"directional_shadow_split_3]."
msgstr ""
-#: doc/classes/Light3D.xml:115
+#: doc/classes/Light3D.xml:127
msgid ""
"Constant for accessing [member DirectionalLight3D."
-"directional_shadow_normal_bias]."
+"directional_shadow_fade_start]."
msgstr ""
-#: doc/classes/Light3D.xml:118
+#: doc/classes/Light3D.xml:130
+msgid "Constant for accessing [member shadow_normal_bias]."
+msgstr ""
+
+#: doc/classes/Light3D.xml:133
msgid "Constant for accessing [member shadow_bias]."
msgstr ""
-#: doc/classes/Light3D.xml:121
+#: doc/classes/Light3D.xml:136
msgid ""
"Constant for accessing [member DirectionalLight3D."
-"directional_shadow_bias_split_scale]."
+"directional_shadow_pancake_size]."
msgstr ""
-#: doc/classes/Light3D.xml:127
+#: doc/classes/Light3D.xml:139
+msgid "Constant for accessing [member shadow_blur]."
+msgstr ""
+
+#: doc/classes/Light3D.xml:142
+msgid "Constant for accessing [member shadow_transmittance_bias]."
+msgstr ""
+
+#: doc/classes/Light3D.xml:148
msgid ""
"Light is ignored when baking.\n"
"[b]Note:[/b] Hiding a light does [i]not[/i] affect baking."
msgstr ""
-#: doc/classes/Light3D.xml:131
+#: doc/classes/Light3D.xml:152
msgid "Only indirect lighting will be baked (default)."
msgstr ""
-#: doc/classes/Light3D.xml:134
+#: doc/classes/Light3D.xml:155
msgid ""
"Both direct and indirect light will be baked.\n"
"[b]Note:[/b] You should hide the light if you don't want it to appear twice "
@@ -27571,32 +27443,40 @@ msgstr ""
msgid ""
"LineEdit provides a single-line string editor, used for text fields.\n"
"It features many built-in shortcuts which will always be available "
-"([code]Ctrl[/code] here maps to [code]Command[/code] on macOS):\n"
-"- Ctrl + C: Copy\n"
-"- Ctrl + X: Cut\n"
-"- Ctrl + V or Ctrl + Y: Paste/\"yank\"\n"
-"- Ctrl + Z: Undo\n"
-"- Ctrl + Shift + Z: Redo\n"
-"- Ctrl + U: Delete text from the cursor position to the beginning of the "
-"line\n"
-"- Ctrl + K: Delete text from the cursor position to the end of the line\n"
-"- Ctrl + A: Select all text\n"
-"- Up/Down arrow: Move the cursor to the beginning/end of the line\n"
-"On macOS, some extra keyboard shortcuts are available:\n"
-"- Ctrl + F: Like the right arrow key, move the cursor one character right\n"
-"- Ctrl + B: Like the left arrow key, move the cursor one character left\n"
-"- Ctrl + P: Like the up arrow key, move the cursor to the previous line\n"
-"- Ctrl + N: Like the down arrow key, move the cursor to the next line\n"
-"- Ctrl + D: Like the Delete key, delete the character on the right side of "
-"cursor\n"
-"- Ctrl + H: Like the Backspace key, delete the character on the left side of "
-"the cursor\n"
-"- Ctrl + A: Like the Home key, move the cursor to the beginning of the line\n"
-"- Ctrl + E: Like the End key, move the cursor to the end of the line\n"
-"- Command + Left arrow: Like the Home key, move the cursor to the beginning "
+"([kbd]Ctrl[/kbd] here maps to [kbd]Cmd[/kbd] on macOS):\n"
+"- [kbd]Ctrl + C[/kbd]: Copy\n"
+"- [kbd]Ctrl + X[/kbd]: Cut\n"
+"- [kbd]Ctrl + V[/kbd] or [kbd]Ctrl + Y[/kbd]: Paste/\"yank\"\n"
+"- [kbd]Ctrl + Z[/kbd]: Undo\n"
+"- [kbd]Ctrl + Shift + Z[/kbd]: Redo\n"
+"- [kbd]Ctrl + U[/kbd]: Delete text from the cursor position to the beginning "
"of the line\n"
-"- Command + Right arrow: Like the End key, move the cursor to the end of the "
-"line"
+"- [kbd]Ctrl + K[/kbd]: Delete text from the cursor position to the end of "
+"the line\n"
+"- [kbd]Ctrl + A[/kbd]: Select all text\n"
+"- [kbd]Up Arrow[/kbd]/[kbd]Down Arrow[/kbd]: Move the cursor to the "
+"beginning/end of the line\n"
+"On macOS, some extra keyboard shortcuts are available:\n"
+"- [kbd]Ctrl + F[/kbd]: Same as [kbd]Right Arrow[/kbd], move the cursor one "
+"character right\n"
+"- [kbd]Ctrl + B[/kbd]: Same as [kbd]Left Arrow[/kbd], move the cursor one "
+"character left\n"
+"- [kbd]Ctrl + P[/kbd]: Same as [kbd]Up Arrow[/kbd], move the cursor to the "
+"previous line\n"
+"- [kbd]Ctrl + N[/kbd]: Same as [kbd]Down Arrow[/kbd], move the cursor to the "
+"next line\n"
+"- [kbd]Ctrl + D[/kbd]: Same as [kbd]Delete[/kbd], delete the character on "
+"the right side of cursor\n"
+"- [kbd]Ctrl + H[/kbd]: Same as [kbd]Backspace[/kbd], delete the character on "
+"the left side of the cursor\n"
+"- [kbd]Ctrl + A[/kbd]: Same as [kbd]Home[/kbd], move the cursor to the "
+"beginning of the line\n"
+"- [kbd]Ctrl + E[/kbd]: Same as [kbd]End[/kbd], move the cursor to the end of "
+"the line\n"
+"- [kbd]Cmd + Left Arrow[/kbd]: Same as [kbd]Home[/kbd], move the cursor to "
+"the beginning of the line\n"
+"- [kbd]Cmd + Right Arrow[/kbd]: Same as [kbd]End[/kbd], move the cursor to "
+"the end of the line"
msgstr ""
#: doc/classes/LineEdit.xml:39
@@ -27741,7 +27621,7 @@ msgid ""
"max_length]."
msgstr ""
-#: doc/classes/LineEdit.xml:163 doc/classes/TextEdit.xml:513
+#: doc/classes/LineEdit.xml:163 doc/classes/TextEdit.xml:514
msgid "Emitted when the text changes."
msgstr ""
@@ -27765,11 +27645,11 @@ msgstr ""
msgid "Stretches whitespaces to fit the [LineEdit]'s width."
msgstr ""
-#: doc/classes/LineEdit.xml:188 doc/classes/TextEdit.xml:534
+#: doc/classes/LineEdit.xml:188 doc/classes/TextEdit.xml:535
msgid "Cuts (copies and clears) the selected text."
msgstr ""
-#: doc/classes/LineEdit.xml:191 doc/classes/TextEdit.xml:537
+#: doc/classes/LineEdit.xml:191 doc/classes/TextEdit.xml:538
msgid "Copies the selected text."
msgstr ""
@@ -27789,7 +27669,7 @@ msgstr ""
msgid "Selects the whole [LineEdit] text."
msgstr ""
-#: doc/classes/LineEdit.xml:204 doc/classes/TextEdit.xml:549
+#: doc/classes/LineEdit.xml:204 doc/classes/TextEdit.xml:550
msgid "Undoes the previous action."
msgstr ""
@@ -27797,7 +27677,7 @@ msgstr ""
msgid "Reverse the last undo action."
msgstr ""
-#: doc/classes/LineEdit.xml:210 doc/classes/TextEdit.xml:555
+#: doc/classes/LineEdit.xml:210 doc/classes/TextEdit.xml:556
msgid "Represents the size of the [enum MenuItems] enum."
msgstr ""
@@ -28427,11 +28307,11 @@ msgstr ""
msgid "Render array as triangle strips."
msgstr ""
-#: doc/classes/Mesh.xml:126 doc/classes/RenderingServer.xml:3254
+#: doc/classes/Mesh.xml:126 doc/classes/RenderingServer.xml:3306
msgid "Blend shapes are normalized."
msgstr ""
-#: doc/classes/Mesh.xml:129 doc/classes/RenderingServer.xml:3257
+#: doc/classes/Mesh.xml:129 doc/classes/RenderingServer.xml:3309
msgid "Blend shapes are relative to base weight."
msgstr ""
@@ -28473,37 +28353,37 @@ msgstr ""
msgid "Mesh array uses indices."
msgstr ""
-#: doc/classes/Mesh.xml:159 doc/classes/RenderingServer.xml:3210
+#: doc/classes/Mesh.xml:159 doc/classes/RenderingServer.xml:3262
msgid "Flag used to mark a compressed (half float) normal array."
msgstr ""
-#: doc/classes/Mesh.xml:162 doc/classes/RenderingServer.xml:3213
+#: doc/classes/Mesh.xml:162 doc/classes/RenderingServer.xml:3265
msgid "Flag used to mark a compressed (half float) tangent array."
msgstr ""
-#: doc/classes/Mesh.xml:165 doc/classes/RenderingServer.xml:3216
+#: doc/classes/Mesh.xml:165 doc/classes/RenderingServer.xml:3268
msgid "Flag used to mark a compressed (half float) color array."
msgstr ""
-#: doc/classes/Mesh.xml:168 doc/classes/RenderingServer.xml:3219
+#: doc/classes/Mesh.xml:168 doc/classes/RenderingServer.xml:3271
msgid "Flag used to mark a compressed (half float) UV coordinates array."
msgstr ""
-#: doc/classes/Mesh.xml:171 doc/classes/RenderingServer.xml:3222
+#: doc/classes/Mesh.xml:171 doc/classes/RenderingServer.xml:3274
msgid ""
"Flag used to mark a compressed (half float) UV coordinates array for the "
"second UV coordinates."
msgstr ""
-#: doc/classes/Mesh.xml:174 doc/classes/RenderingServer.xml:3225
+#: doc/classes/Mesh.xml:174 doc/classes/RenderingServer.xml:3277
msgid "Flag used to mark a compressed index array."
msgstr ""
-#: doc/classes/Mesh.xml:177 doc/classes/RenderingServer.xml:3228
+#: doc/classes/Mesh.xml:177 doc/classes/RenderingServer.xml:3283
msgid "Flag used to mark that the array contains 2D vertices."
msgstr ""
-#: doc/classes/Mesh.xml:180 doc/classes/RenderingServer.xml:3233
+#: doc/classes/Mesh.xml:180 doc/classes/RenderingServer.xml:3280
msgid ""
"Used to set flags [constant ARRAY_COMPRESS_NORMAL], [constant "
"ARRAY_COMPRESS_TANGENT], [constant ARRAY_COMPRESS_COLOR], [constant "
@@ -28568,67 +28448,72 @@ msgid ""
" mdt.set_vertex(i, vertex)\n"
"mesh.surface_remove(0)\n"
"mdt.commit_to_surface(mesh)\n"
-"[/codeblock]"
+"[/codeblock]\n"
+"See also [ArrayMesh], [ImmediateGeometry3D] and [SurfaceTool] for procedural "
+"geometry generation.\n"
+"[b]Note:[/b] Godot uses clockwise [url=https://learnopengl.com/Advanced-"
+"OpenGL/Face-culling]winding order[/url] for front faces of triangle "
+"primitive modes."
msgstr ""
-#: doc/classes/MeshDataTool.xml:28
+#: doc/classes/MeshDataTool.xml:30
msgid "Clears all data currently in MeshDataTool."
msgstr ""
-#: doc/classes/MeshDataTool.xml:37
+#: doc/classes/MeshDataTool.xml:39
msgid "Adds a new surface to specified [Mesh] with edited data."
msgstr ""
-#: doc/classes/MeshDataTool.xml:48
+#: doc/classes/MeshDataTool.xml:50
msgid ""
"Uses specified surface of given [Mesh] to populate data for MeshDataTool.\n"
"Requires [Mesh] with primitive type [constant Mesh.PRIMITIVE_TRIANGLES]."
msgstr ""
-#: doc/classes/MeshDataTool.xml:56
+#: doc/classes/MeshDataTool.xml:58
msgid "Returns the number of edges in this [Mesh]."
msgstr ""
-#: doc/classes/MeshDataTool.xml:65
+#: doc/classes/MeshDataTool.xml:67
msgid "Returns array of faces that touch given edge."
msgstr ""
-#: doc/classes/MeshDataTool.xml:74
+#: doc/classes/MeshDataTool.xml:76
msgid "Returns meta information assigned to given edge."
msgstr ""
-#: doc/classes/MeshDataTool.xml:85
+#: doc/classes/MeshDataTool.xml:87
msgid ""
"Returns index of specified vertex connected to given edge.\n"
"Vertex argument can only be 0 or 1 because edges are comprised of two "
"vertices."
msgstr ""
-#: doc/classes/MeshDataTool.xml:93
+#: doc/classes/MeshDataTool.xml:95
msgid "Returns the number of faces in this [Mesh]."
msgstr ""
-#: doc/classes/MeshDataTool.xml:104
+#: doc/classes/MeshDataTool.xml:106
msgid ""
"Returns specified edge associated with given face.\n"
"Edge argument must 2 or less because a face only has three edges."
msgstr ""
-#: doc/classes/MeshDataTool.xml:114
+#: doc/classes/MeshDataTool.xml:116
msgid "Returns the metadata associated with the given face."
msgstr ""
-#: doc/classes/MeshDataTool.xml:123
+#: doc/classes/MeshDataTool.xml:125
msgid "Calculates and returns the face normal of the given face."
msgstr ""
-#: doc/classes/MeshDataTool.xml:134
+#: doc/classes/MeshDataTool.xml:136
msgid ""
"Returns the specified vertex of the given face.\n"
"Vertex argument must be 2 or less because faces contain three vertices."
msgstr ""
-#: doc/classes/MeshDataTool.xml:142
+#: doc/classes/MeshDataTool.xml:144
msgid ""
"Returns the [Mesh]'s format. Format is an integer made up of [Mesh] format "
"flags combined together. For example, a mesh containing both vertices and "
@@ -28638,103 +28523,103 @@ msgid ""
"See [enum ArrayMesh.ArrayFormat] for a list of format flags."
msgstr ""
-#: doc/classes/MeshDataTool.xml:150
+#: doc/classes/MeshDataTool.xml:152
msgid "Returns the material assigned to the [Mesh]."
msgstr ""
-#: doc/classes/MeshDataTool.xml:159
+#: doc/classes/MeshDataTool.xml:161
msgid "Returns the vertex at given index."
msgstr ""
-#: doc/classes/MeshDataTool.xml:168
+#: doc/classes/MeshDataTool.xml:170
msgid "Returns the bones of the given vertex."
msgstr ""
-#: doc/classes/MeshDataTool.xml:177
+#: doc/classes/MeshDataTool.xml:179
msgid "Returns the color of the given vertex."
msgstr ""
-#: doc/classes/MeshDataTool.xml:184
+#: doc/classes/MeshDataTool.xml:186
msgid "Returns the total number of vertices in [Mesh]."
msgstr ""
-#: doc/classes/MeshDataTool.xml:193
+#: doc/classes/MeshDataTool.xml:195
msgid "Returns an array of edges that share the given vertex."
msgstr ""
-#: doc/classes/MeshDataTool.xml:202
+#: doc/classes/MeshDataTool.xml:204
msgid "Returns an array of faces that share the given vertex."
msgstr ""
-#: doc/classes/MeshDataTool.xml:211
+#: doc/classes/MeshDataTool.xml:213
msgid "Returns the metadata associated with the given vertex."
msgstr ""
-#: doc/classes/MeshDataTool.xml:220
+#: doc/classes/MeshDataTool.xml:222
msgid "Returns the normal of the given vertex."
msgstr ""
-#: doc/classes/MeshDataTool.xml:229
+#: doc/classes/MeshDataTool.xml:231
msgid "Returns the tangent of the given vertex."
msgstr ""
-#: doc/classes/MeshDataTool.xml:238
+#: doc/classes/MeshDataTool.xml:240
msgid "Returns the UV of the given vertex."
msgstr ""
-#: doc/classes/MeshDataTool.xml:247
+#: doc/classes/MeshDataTool.xml:249
msgid "Returns the UV2 of the given vertex."
msgstr ""
-#: doc/classes/MeshDataTool.xml:256
+#: doc/classes/MeshDataTool.xml:258
msgid "Returns bone weights of the given vertex."
msgstr ""
-#: doc/classes/MeshDataTool.xml:267
+#: doc/classes/MeshDataTool.xml:269
msgid "Sets the metadata of the given edge."
msgstr ""
-#: doc/classes/MeshDataTool.xml:278
+#: doc/classes/MeshDataTool.xml:280
msgid "Sets the metadata of the given face."
msgstr ""
-#: doc/classes/MeshDataTool.xml:287
+#: doc/classes/MeshDataTool.xml:289
msgid "Sets the material to be used by newly-constructed [Mesh]."
msgstr ""
-#: doc/classes/MeshDataTool.xml:298
+#: doc/classes/MeshDataTool.xml:300
msgid "Sets the position of the given vertex."
msgstr ""
-#: doc/classes/MeshDataTool.xml:309
+#: doc/classes/MeshDataTool.xml:311
msgid "Sets the bones of the given vertex."
msgstr ""
-#: doc/classes/MeshDataTool.xml:320
+#: doc/classes/MeshDataTool.xml:322
msgid "Sets the color of the given vertex."
msgstr ""
-#: doc/classes/MeshDataTool.xml:331
+#: doc/classes/MeshDataTool.xml:333
msgid "Sets the metadata associated with the given vertex."
msgstr ""
-#: doc/classes/MeshDataTool.xml:342
+#: doc/classes/MeshDataTool.xml:344
msgid "Sets the normal of the given vertex."
msgstr ""
-#: doc/classes/MeshDataTool.xml:353
+#: doc/classes/MeshDataTool.xml:355
msgid "Sets the tangent of the given vertex."
msgstr ""
-#: doc/classes/MeshDataTool.xml:364
+#: doc/classes/MeshDataTool.xml:366
msgid "Sets the UV of the given vertex."
msgstr ""
-#: doc/classes/MeshDataTool.xml:375
+#: doc/classes/MeshDataTool.xml:377
msgid "Sets the UV2 of the given vertex."
msgstr ""
-#: doc/classes/MeshDataTool.xml:386
+#: doc/classes/MeshDataTool.xml:388
msgid "Sets the bone weights of the given vertex."
msgstr ""
@@ -28980,9 +28865,9 @@ msgid ""
"setting [member eye_height].\n"
"You can initialise this interface as follows:\n"
"[codeblock]\n"
-"var interface = ARVRServer.find_interface(\"Native mobile\")\n"
+"var interface = XRServer.find_interface(\"Native mobile\")\n"
"if interface and interface.initialize():\n"
-" get_viewport().arvr = true\n"
+" get_viewport().xr = true\n"
"[/codeblock]"
msgstr ""
@@ -28999,7 +28884,7 @@ msgstr ""
#: modules/mobile_vr/doc_classes/MobileVRInterface.xml:28
msgid ""
"The height at which the camera is placed in relation to the ground (i.e. "
-"[ARVROrigin] node)."
+"[XROrigin3D] node)."
msgstr ""
#: modules/mobile_vr/doc_classes/MobileVRInterface.xml:31
@@ -31479,7 +31364,7 @@ msgstr ""
#: doc/classes/Node.xml:935
msgid ""
"Notification received from the OS when a close request is sent (e.g. closing "
-"the window with a \"Close\" button or Alt+F4).\n"
+"the window with a \"Close\" button or [kbd]Alt + F4[/kbd]).\n"
"Implemented on desktop platforms."
msgstr ""
@@ -31581,11 +31466,21 @@ msgid ""
msgstr ""
#: doc/classes/Node2D.xml:95
-msgid "Converts a local point's coordinates to global coordinates."
+msgid ""
+"Transforms the provided local position into a position in global coordinate "
+"space. The input is expected to be local relative to the [Node2D] it is "
+"called on. e.g. Applying this method to the positions of child nodes will "
+"correctly transform their positions into the global coordinate space, but "
+"applying it to a node's own position will give an incorrect result, as it "
+"will incorporate the node's own transformation into its global position."
msgstr ""
#: doc/classes/Node2D.xml:104
-msgid "Converts a global point's coordinates to local coordinates."
+msgid ""
+"Transforms the provided global position into a position in local coordinate "
+"space. The output will be local relative to the [Node2D] it is called on. e."
+"g. It is appropriate for determining the positions of child nodes, but it is "
+"not appropriate for determining its own position relative to its parent."
msgstr ""
#: doc/classes/Node2D.xml:113
@@ -31660,80 +31555,83 @@ msgid ""
"operations in this coordinate system correspond to direct affine operations "
"on the [Node3D]'s transform. The word local below refers to this coordinate "
"system. The coordinate system that is attached to the [Node3D] object itself "
-"is referred to as object-local coordinate system."
+"is referred to as object-local coordinate system.\n"
+"[b]Note:[/b] Unless otherwise specified, all methods that have angle "
+"parameters must have angles specified as [i]radians[/i]. To convert degrees "
+"to radians, use [method @GDScript.deg2rad]."
msgstr ""
-#: doc/classes/Node3D.xml:11
+#: doc/classes/Node3D.xml:12
msgid ""
"https://docs.godotengine.org/en/latest/tutorials/3d/introduction_to_3d.html"
msgstr ""
-#: doc/classes/Node3D.xml:25
+#: doc/classes/Node3D.xml:26
msgid ""
"Returns the parent [Node3D], or an empty [Object] if no parent exists or "
"parent is not of type [Node3D]."
msgstr ""
-#: doc/classes/Node3D.xml:32
+#: doc/classes/Node3D.xml:33
msgid ""
"Returns the current [World3D] resource this [Node3D] node is registered to."
msgstr ""
-#: doc/classes/Node3D.xml:43
+#: doc/classes/Node3D.xml:44
msgid ""
"Rotates the global (world) transformation around axis, a unit [Vector3], by "
"specified angle in radians. The rotation axis is in global coordinate system."
msgstr ""
-#: doc/classes/Node3D.xml:52
+#: doc/classes/Node3D.xml:53
msgid ""
"Scales the global (world) transformation by the given [Vector3] scale "
"factors."
msgstr ""
-#: doc/classes/Node3D.xml:61
+#: doc/classes/Node3D.xml:62
msgid ""
"Moves the global (world) transformation by [Vector3] offset. The offset is "
"in global coordinate system."
msgstr ""
-#: doc/classes/Node3D.xml:68
+#: doc/classes/Node3D.xml:69
msgid ""
"Disables rendering of this node. Changes [member visible] to [code]false[/"
"code]."
msgstr ""
-#: doc/classes/Node3D.xml:75
+#: doc/classes/Node3D.xml:76
msgid ""
"Returns whether node notifies about its local transformation changes. "
"[Node3D] will not propagate this by default."
msgstr ""
-#: doc/classes/Node3D.xml:82
+#: doc/classes/Node3D.xml:83
msgid ""
"Returns whether this node uses a scale of [code](1, 1, 1)[/code] or its "
"local transformation scale."
msgstr ""
-#: doc/classes/Node3D.xml:89
+#: doc/classes/Node3D.xml:90
msgid ""
"Returns whether this node is set as Toplevel, that is whether it ignores its "
"parent nodes transformations."
msgstr ""
-#: doc/classes/Node3D.xml:96
+#: doc/classes/Node3D.xml:97
msgid ""
"Returns whether the node notifies about its global and local transformation "
"changes. [Node3D] will not propagate this by default."
msgstr ""
-#: doc/classes/Node3D.xml:103
+#: doc/classes/Node3D.xml:104
msgid ""
"Returns whether the node is visible, taking into consideration that its "
"parents visibility."
msgstr ""
-#: doc/classes/Node3D.xml:114
+#: doc/classes/Node3D.xml:115
msgid ""
"Rotates itself so that the local -Z axis points towards the [code]target[/"
"code] position.\n"
@@ -31743,106 +31641,106 @@ msgid ""
"Operations take place in global space."
msgstr ""
-#: doc/classes/Node3D.xml:129
+#: doc/classes/Node3D.xml:130
msgid ""
"Moves the node to the specified [code]position[/code], and then rotates "
"itself to point toward the [code]target[/code] as per [method look_at]. "
"Operations take place in global space."
msgstr ""
-#: doc/classes/Node3D.xml:136
+#: doc/classes/Node3D.xml:137
msgid ""
"Resets this node's transformations (like scale, skew and taper) preserving "
"its rotation and translation by performing Gram-Schmidt orthonormalization "
"on this node's [Transform]."
msgstr ""
-#: doc/classes/Node3D.xml:147
+#: doc/classes/Node3D.xml:148
msgid ""
"Rotates the local transformation around axis, a unit [Vector3], by specified "
"angle in radians."
msgstr ""
-#: doc/classes/Node3D.xml:158
+#: doc/classes/Node3D.xml:159
msgid ""
"Rotates the local transformation around axis, a unit [Vector3], by specified "
"angle in radians. The rotation axis is in object-local coordinate system."
msgstr ""
-#: doc/classes/Node3D.xml:167
+#: doc/classes/Node3D.xml:168
msgid "Rotates the local transformation around the X axis by angle in radians."
msgstr ""
-#: doc/classes/Node3D.xml:176
+#: doc/classes/Node3D.xml:177
msgid "Rotates the local transformation around the Y axis by angle in radians."
msgstr ""
-#: doc/classes/Node3D.xml:185
+#: doc/classes/Node3D.xml:186
msgid "Rotates the local transformation around the Z axis by angle in radians."
msgstr ""
-#: doc/classes/Node3D.xml:194
+#: doc/classes/Node3D.xml:195
msgid ""
"Scales the local transformation by given 3D scale factors in object-local "
"coordinate system."
msgstr ""
-#: doc/classes/Node3D.xml:203
+#: doc/classes/Node3D.xml:204
msgid ""
"Makes the node ignore its parents transformations. Node transformations are "
"only in global space."
msgstr ""
-#: doc/classes/Node3D.xml:212
+#: doc/classes/Node3D.xml:213
msgid ""
"Sets whether the node uses a scale of [code](1, 1, 1)[/code] or its local "
"transformation scale. Changes to the local transformation scale are "
"preserved."
msgstr ""
-#: doc/classes/Node3D.xml:219
+#: doc/classes/Node3D.xml:220
msgid ""
"Reset all transformations for this node (sets its [Transform] to the "
"identity matrix)."
msgstr ""
-#: doc/classes/Node3D.xml:228
+#: doc/classes/Node3D.xml:229
msgid ""
"Sets whether the node ignores notification that its transformation (global "
"or local) changed."
msgstr ""
-#: doc/classes/Node3D.xml:237
+#: doc/classes/Node3D.xml:238
msgid ""
"Sets whether the node notifies about its local transformation changes. "
"[Node3D] will not propagate this by default."
msgstr ""
-#: doc/classes/Node3D.xml:246
+#: doc/classes/Node3D.xml:247
msgid ""
"Sets whether the node notifies about its global and local transformation "
"changes. [Node3D] will not propagate this by default."
msgstr ""
-#: doc/classes/Node3D.xml:253
+#: doc/classes/Node3D.xml:254
msgid ""
"Enables rendering of this node. Changes [member visible] to [code]true[/"
"code]."
msgstr ""
-#: doc/classes/Node3D.xml:262
+#: doc/classes/Node3D.xml:263
msgid ""
"Transforms [code]local_point[/code] from this node's local space to world "
"space."
msgstr ""
-#: doc/classes/Node3D.xml:271
+#: doc/classes/Node3D.xml:272
msgid ""
"Transforms [code]global_point[/code] from world space to this node's local "
"space."
msgstr ""
-#: doc/classes/Node3D.xml:280
+#: doc/classes/Node3D.xml:281
msgid ""
"Changes the node's position by the given offset [Vector3].\n"
"Note that the translation [code]offset[/code] is affected by the node's "
@@ -31851,26 +31749,26 @@ msgid ""
"to the X coordinate."
msgstr ""
-#: doc/classes/Node3D.xml:290
+#: doc/classes/Node3D.xml:291
msgid ""
"Changes the node's position by the given offset [Vector3] in local space."
msgstr ""
-#: doc/classes/Node3D.xml:297
+#: doc/classes/Node3D.xml:298
msgid "Updates the [Node3DGizmo] of this node."
msgstr ""
-#: doc/classes/Node3D.xml:303
+#: doc/classes/Node3D.xml:304
msgid ""
"The [Node3DGizmo] for this node. Used for example in [EditorNode3DGizmo] as "
"custom visualization and editing handles in Editor."
msgstr ""
-#: doc/classes/Node3D.xml:306
+#: doc/classes/Node3D.xml:307
msgid "World3D space (global) [Transform] of this node."
msgstr ""
-#: doc/classes/Node3D.xml:309
+#: doc/classes/Node3D.xml:310
msgid ""
"Rotation part of the local transformation in radians, specified in terms of "
"YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n"
@@ -31883,33 +31781,33 @@ msgid ""
"\" is not meaningful."
msgstr ""
-#: doc/classes/Node3D.xml:313
+#: doc/classes/Node3D.xml:314
msgid ""
"Rotation part of the local transformation in degrees, specified in terms of "
"YXZ-Euler angles in the format (X angle, Y angle, Z angle)."
msgstr ""
-#: doc/classes/Node3D.xml:316
+#: doc/classes/Node3D.xml:317
msgid "Scale part of the local transformation."
msgstr ""
-#: doc/classes/Node3D.xml:319
+#: doc/classes/Node3D.xml:320
msgid "Local space [Transform] of this node, with respect to the parent node."
msgstr ""
-#: doc/classes/Node3D.xml:322
+#: doc/classes/Node3D.xml:323
msgid "Local translation of this node."
msgstr ""
-#: doc/classes/Node3D.xml:325
+#: doc/classes/Node3D.xml:326
msgid "If [code]true[/code], this node is drawn."
msgstr ""
-#: doc/classes/Node3D.xml:331
+#: doc/classes/Node3D.xml:332
msgid "Emitted when node visibility changes."
msgstr ""
-#: doc/classes/Node3D.xml:337
+#: doc/classes/Node3D.xml:338
msgid ""
"Node3D nodes receives this notification when their global transform changes. "
"This means that either the current or a parent node changed its transform.\n"
@@ -31917,19 +31815,19 @@ msgid ""
"need to ask for it, with [method set_notify_transform]."
msgstr ""
-#: doc/classes/Node3D.xml:341
+#: doc/classes/Node3D.xml:342
msgid ""
"Node3D nodes receives this notification when they are registered to new "
"[World3D] resource."
msgstr ""
-#: doc/classes/Node3D.xml:344
+#: doc/classes/Node3D.xml:345
msgid ""
"Node3D nodes receives this notification when they are unregistered from "
"current [World3D] resource."
msgstr ""
-#: doc/classes/Node3D.xml:347
+#: doc/classes/Node3D.xml:348
msgid "Node3D nodes receives this notification when their visibility changes."
msgstr ""
@@ -33305,11 +33203,13 @@ msgid ""
"code]. See [url=https://blog.escapecreative.com/customizing-mailto-"
"links/]Customizing [code]mailto:[/code] Links[/url] for a list of fields "
"that can be added.\n"
+"Use [method ProjectSettings.globalize_path] to convert a [code]res://[/code] "
+"or [code]user://[/code] path into a system path for use with this method.\n"
"[b]Note:[/b] This method is implemented on Android, iOS, HTML5, Linux, macOS "
"and Windows."
msgstr ""
-#: doc/classes/OS.xml:493
+#: doc/classes/OS.xml:494
msgid ""
"The exit code passed to the OS when the main loop exits. By convention, an "
"exit code of [code]0[/code] indicates success whereas a non-zero exit code "
@@ -33319,133 +33219,133 @@ msgid ""
"with an [code]exit_code[/code] argument passed."
msgstr ""
-#: doc/classes/OS.xml:497
+#: doc/classes/OS.xml:498
msgid ""
"If [code]true[/code], the engine optimizes for low processor usage by only "
"refreshing the screen if needed. Can improve battery consumption on mobile."
msgstr ""
-#: doc/classes/OS.xml:500
+#: doc/classes/OS.xml:501
msgid ""
"The amount of sleeping between frames when the low-processor usage mode is "
"enabled (in microseconds). Higher values will result in lower CPU usage."
msgstr ""
-#: doc/classes/OS.xml:505
+#: doc/classes/OS.xml:506
msgid ""
"The GLES2 rendering backend. It uses OpenGL ES 2.0 on mobile devices, OpenGL "
"2.1 on desktop platforms and WebGL 1.0 on the web."
msgstr ""
-#: doc/classes/OS.xml:508
+#: doc/classes/OS.xml:509
msgid "The Vulkan rendering backend."
msgstr ""
-#: doc/classes/OS.xml:511
+#: doc/classes/OS.xml:512
msgid "Sunday."
msgstr ""
-#: doc/classes/OS.xml:514
+#: doc/classes/OS.xml:515
msgid "Monday."
msgstr ""
-#: doc/classes/OS.xml:517
+#: doc/classes/OS.xml:518
msgid "Tuesday."
msgstr ""
-#: doc/classes/OS.xml:520
+#: doc/classes/OS.xml:521
msgid "Wednesday."
msgstr ""
-#: doc/classes/OS.xml:523
+#: doc/classes/OS.xml:524
msgid "Thursday."
msgstr ""
-#: doc/classes/OS.xml:526
+#: doc/classes/OS.xml:527
msgid "Friday."
msgstr ""
-#: doc/classes/OS.xml:529
+#: doc/classes/OS.xml:530
msgid "Saturday."
msgstr ""
-#: doc/classes/OS.xml:532
+#: doc/classes/OS.xml:533
msgid "January."
msgstr ""
-#: doc/classes/OS.xml:535
+#: doc/classes/OS.xml:536
msgid "February."
msgstr ""
-#: doc/classes/OS.xml:538
+#: doc/classes/OS.xml:539
msgid "March."
msgstr ""
-#: doc/classes/OS.xml:541
+#: doc/classes/OS.xml:542
msgid "April."
msgstr ""
-#: doc/classes/OS.xml:544
+#: doc/classes/OS.xml:545
msgid "May."
msgstr ""
-#: doc/classes/OS.xml:547
+#: doc/classes/OS.xml:548
msgid "June."
msgstr ""
-#: doc/classes/OS.xml:550
+#: doc/classes/OS.xml:551
msgid "July."
msgstr ""
-#: doc/classes/OS.xml:553
+#: doc/classes/OS.xml:554
msgid "August."
msgstr ""
-#: doc/classes/OS.xml:556
+#: doc/classes/OS.xml:557
msgid "September."
msgstr ""
-#: doc/classes/OS.xml:559
+#: doc/classes/OS.xml:560
msgid "October."
msgstr ""
-#: doc/classes/OS.xml:562
+#: doc/classes/OS.xml:563
msgid "November."
msgstr ""
-#: doc/classes/OS.xml:565
+#: doc/classes/OS.xml:566
msgid "December."
msgstr ""
-#: doc/classes/OS.xml:568
+#: doc/classes/OS.xml:569
msgid "Desktop directory path."
msgstr ""
-#: doc/classes/OS.xml:571
+#: doc/classes/OS.xml:572
msgid "DCIM (Digital Camera Images) directory path."
msgstr ""
-#: doc/classes/OS.xml:574
+#: doc/classes/OS.xml:575
msgid "Documents directory path."
msgstr ""
-#: doc/classes/OS.xml:577
+#: doc/classes/OS.xml:578
msgid "Downloads directory path."
msgstr ""
-#: doc/classes/OS.xml:580
+#: doc/classes/OS.xml:581
msgid "Movies directory path."
msgstr ""
-#: doc/classes/OS.xml:583
+#: doc/classes/OS.xml:584
msgid "Music directory path."
msgstr ""
-#: doc/classes/OS.xml:586
+#: doc/classes/OS.xml:587
msgid "Pictures directory path."
msgstr ""
-#: doc/classes/OS.xml:589
+#: doc/classes/OS.xml:590
msgid "Ringtones directory path."
msgstr ""
@@ -33717,49 +33617,52 @@ msgid ""
"code] is owned by [code]node[/code] and [code]pack[/code] will therefore "
"only save those two nodes, but not [code]collision[/code].\n"
"[codeblock]\n"
-"# Create the objects\n"
+"# Create the objects.\n"
"var node = Node2D.new()\n"
"var rigid = RigidBody2D.new()\n"
"var collision = CollisionShape2D.new()\n"
"\n"
-"# Create the object hierarchy\n"
+"# Create the object hierarchy.\n"
"rigid.add_child(collision)\n"
"node.add_child(rigid)\n"
"\n"
-"# Change owner of rigid, but not of collision\n"
+"# Change owner of `rigid`, but not of `collision`.\n"
"rigid.owner = node\n"
"\n"
"var scene = PackedScene.new()\n"
-"# Only node and rigid are now packed\n"
+"# Only `node` and `rigid` are now packed.\n"
"var result = scene.pack(node)\n"
"if result == OK:\n"
-" ResourceSaver.save(\"res://path/name.scn\", scene) # Or \"user://...\"\n"
+" var error = ResourceSaver.save(\"res://path/name.scn\", scene) # Or "
+"\"user://...\"\n"
+" if error != OK:\n"
+" push_error(\"An error occurred while saving the scene to disk.\")\n"
"[/codeblock]"
msgstr ""
-#: doc/classes/PackedScene.xml:38
+#: doc/classes/PackedScene.xml:40
msgid "Returns [code]true[/code] if the scene file has nodes."
msgstr ""
-#: doc/classes/PackedScene.xml:45
+#: doc/classes/PackedScene.xml:47
msgid ""
"Returns the [code]SceneState[/code] representing the scene file contents."
msgstr ""
-#: doc/classes/PackedScene.xml:54
+#: doc/classes/PackedScene.xml:56
msgid ""
"Instantiates the scene's node hierarchy. Triggers child scene "
"instantiation(s). Triggers a [constant Node.NOTIFICATION_INSTANCED] "
"notification on the root node."
msgstr ""
-#: doc/classes/PackedScene.xml:63
+#: doc/classes/PackedScene.xml:65
msgid ""
"Pack will ignore any sub-nodes not owned by given node. See [member Node."
"owner]."
msgstr ""
-#: doc/classes/PackedScene.xml:69
+#: doc/classes/PackedScene.xml:71
msgid ""
"A dictionary representation of the scene contents.\n"
"Available keys include \"rnames\" and \"variants\" for resources, "
@@ -33768,18 +33671,18 @@ msgid ""
"connections, and \"version\" for the format style of the PackedScene."
msgstr ""
-#: doc/classes/PackedScene.xml:75
+#: doc/classes/PackedScene.xml:77
msgid "If passed to [method instance], blocks edits to the scene state."
msgstr ""
-#: doc/classes/PackedScene.xml:78
+#: doc/classes/PackedScene.xml:80
msgid ""
"If passed to [method instance], provides local scene resources to the local "
"scene.\n"
"[b]Note:[/b] Only available in editor builds."
msgstr ""
-#: doc/classes/PackedScene.xml:82
+#: doc/classes/PackedScene.xml:84
msgid ""
"If passed to [method instance], provides local scene resources to the local "
"scene. Only the main scene should receive the main edit state.\n"
@@ -34847,20 +34750,20 @@ msgstr ""
msgid "Draw calls per frame. 3D only."
msgstr ""
-#: doc/classes/Performance.xml:77 doc/classes/RenderingServer.xml:3711
+#: doc/classes/Performance.xml:77 doc/classes/RenderingServer.xml:3922
msgid ""
"The amount of video memory used, i.e. texture and vertex memory combined."
msgstr ""
-#: doc/classes/Performance.xml:80 doc/classes/RenderingServer.xml:3714
+#: doc/classes/Performance.xml:80 doc/classes/RenderingServer.xml:3925
msgid "The amount of texture memory used."
msgstr ""
-#: doc/classes/Performance.xml:83 doc/classes/RenderingServer.xml:3717
+#: doc/classes/Performance.xml:83 doc/classes/RenderingServer.xml:3928
msgid "The amount of vertex memory used."
msgstr ""
-#: doc/classes/Performance.xml:86 doc/classes/RenderingServer.xml:3708
+#: doc/classes/Performance.xml:86 doc/classes/RenderingServer.xml:3919
msgid "Unimplemented in the GLES2 rendering backend, always returns 0."
msgstr ""
@@ -34912,6 +34815,96 @@ msgid ""
"resource."
msgstr ""
+#: doc/classes/PhysicalBone3D.xml:67
+msgid "Damps the body's rotation if greater than [code]0[/code]."
+msgstr ""
+
+#: doc/classes/PhysicalBone3D.xml:70 doc/classes/RigidBody3D.xml:132
+msgid "Lock the body's rotation in the X axis."
+msgstr ""
+
+#: doc/classes/PhysicalBone3D.xml:73 doc/classes/RigidBody3D.xml:135
+msgid "Lock the body's rotation in the Y axis."
+msgstr ""
+
+#: doc/classes/PhysicalBone3D.xml:76 doc/classes/RigidBody3D.xml:138
+msgid "Lock the body's rotation in the Z axis."
+msgstr ""
+
+#: doc/classes/PhysicalBone3D.xml:79 doc/classes/RigidBody3D.xml:141
+msgid "Lock the body's movement in the X axis."
+msgstr ""
+
+#: doc/classes/PhysicalBone3D.xml:82 doc/classes/RigidBody3D.xml:144
+msgid "Lock the body's movement in the Y axis."
+msgstr ""
+
+#: doc/classes/PhysicalBone3D.xml:85 doc/classes/RigidBody3D.xml:147
+msgid "Lock the body's movement in the Z axis."
+msgstr ""
+
+#: doc/classes/PhysicalBone3D.xml:88
+msgid "Sets the body's transform."
+msgstr ""
+
+#: doc/classes/PhysicalBone3D.xml:91 doc/classes/PhysicsMaterial.xml:17
+msgid ""
+"The body's bounciness. Values range from [code]0[/code] (no bounce) to "
+"[code]1[/code] (full bounciness)."
+msgstr ""
+
+#: doc/classes/PhysicalBone3D.xml:94 doc/classes/RigidBody3D.xml:150
+msgid ""
+"If [code]true[/code], the body is deactivated when there is no movement, so "
+"it will not take part in the simulation until it is awaken by an external "
+"force."
+msgstr ""
+
+#: doc/classes/PhysicalBone3D.xml:97
+msgid ""
+"The body's friction, from [code]0[/code] (frictionless) to [code]1[/code] "
+"(max friction)."
+msgstr ""
+
+#: doc/classes/PhysicalBone3D.xml:100
+msgid ""
+"This is multiplied by the global 3D gravity setting found in [b]Project > "
+"Project Settings > Physics > 3d[/b] to produce the body's gravity. For "
+"example, a value of 1 will be normal gravity, 2 will apply double gravity, "
+"and 0.5 will apply half gravity to this object."
+msgstr ""
+
+#: doc/classes/PhysicalBone3D.xml:103
+msgid "Sets the joint's transform."
+msgstr ""
+
+#: doc/classes/PhysicalBone3D.xml:106
+msgid "Sets the joint's rotation in radians."
+msgstr ""
+
+#: doc/classes/PhysicalBone3D.xml:109
+msgid "Sets the joint's rotation in degrees."
+msgstr ""
+
+#: doc/classes/PhysicalBone3D.xml:112
+msgid "Sets the joint type. See [enum JointType] for possible values."
+msgstr ""
+
+#: doc/classes/PhysicalBone3D.xml:115
+msgid "Damps the body's movement if greater than [code]0[/code]."
+msgstr ""
+
+#: doc/classes/PhysicalBone3D.xml:118 doc/classes/RigidBody2D.xml:158
+#: doc/classes/RigidBody3D.xml:175
+msgid "The body's mass."
+msgstr ""
+
+#: doc/classes/PhysicalBone3D.xml:121 doc/classes/RigidBody3D.xml:188
+msgid ""
+"The body's weight based on its mass and the global 3D gravity. Global values "
+"are set in [b]Project > Project Settings > Physics > 3d[/b]."
+msgstr ""
+
#: doc/classes/PhysicalSkyMaterial.xml:4
msgid "[Sky] [Material] used for a physically based sky."
msgstr ""
@@ -35245,17 +35238,6 @@ msgstr ""
msgid "The body's transformation matrix."
msgstr ""
-#: doc/classes/PhysicsDirectBodyState2DSW.xml:4
-msgid "Software implementation of [PhysicsDirectBodyState2D]."
-msgstr ""
-
-#: doc/classes/PhysicsDirectBodyState2DSW.xml:7
-msgid ""
-"Software implementation of [PhysicsDirectBodyState2D]. This object exposes "
-"no new methods or properties and should not be used, as "
-"[PhysicsDirectBodyState2D] selects the best implementation available."
-msgstr ""
-
#: doc/classes/PhysicsDirectBodyState3D.xml:4
msgid "Direct access object to a physics body in the [PhysicsServer3D]."
msgstr ""
@@ -35268,7 +35250,7 @@ msgid ""
"direct state of that body. See [method RigidBody3D._integrate_forces]."
msgstr ""
-#: doc/classes/PhysicsDirectBodyState3D.xml:18 doc/classes/RigidBody3D.xml:31
+#: doc/classes/PhysicsDirectBodyState3D.xml:18
msgid ""
"Adds a constant directional force without affecting rotation.\n"
"This is equivalent to [code]add_force(force, Vector3(0,0,0))[/code]."
@@ -35445,7 +35427,7 @@ msgid ""
"will occur. If no collision is detected, the returned array will be [code]"
"[1, 1][/code].\n"
"If the shape can not move, the returned array will be [code][0, 0][/code] "
-"under Bullet, and empty under GodotPhysics."
+"under Bullet, and empty under GodotPhysics3D."
msgstr ""
#: doc/classes/PhysicsDirectSpaceState3D.xml:33
@@ -35516,12 +35498,6 @@ msgid ""
"Provides a means of modifying the collision properties of a [PhysicsBody3D]."
msgstr ""
-#: doc/classes/PhysicsMaterial.xml:17
-msgid ""
-"The body's bounciness. Values range from [code]0[/code] (no bounce) to "
-"[code]1[/code] (full bounciness)."
-msgstr ""
-
#: doc/classes/PhysicsMaterial.xml:20
msgid ""
"The body's friction. Values range from [code]0[/code] (frictionless) to "
@@ -35762,7 +35738,7 @@ msgid ""
msgstr ""
#: doc/classes/PhysicsServer2D.xml:620 doc/classes/PhysicsServer3D.xml:637
-#: doc/classes/RigidBody3D.xml:119
+#: doc/classes/RigidBody3D.xml:120
msgid ""
"Sets an axis velocity. The velocity in the given vector axis will be set as "
"the given vector length. This is useful for jumping behavior."
@@ -36278,16 +36254,6 @@ msgid ""
"Constant to get the number of space regions where a collision could occur."
msgstr ""
-#: doc/classes/PhysicsServer2DSW.xml:4
-msgid "Software implementation of [PhysicsServer2D]."
-msgstr ""
-
-#: doc/classes/PhysicsServer2DSW.xml:7
-msgid ""
-"This class exposes no new methods or properties and should not be used, as "
-"[PhysicsServer2D] automatically selects the best implementation available."
-msgstr ""
-
#: doc/classes/PhysicsServer3D.xml:4
msgid "Server interface for low-level physics access."
msgstr ""
@@ -37949,12 +37915,8 @@ msgid "Distance from center of sun where it fades out completely."
msgstr ""
#: doc/classes/ProceduralSkyMaterial.xml:44
-msgid "Distance from sun where it goes from solid to starting to fade."
-msgstr ""
-
-#: doc/classes/ProceduralSkyMaterial.xml:47
msgid ""
-"How quickly the sun fades away between [member sun_angle_min] and [member "
+"How quickly the sun fades away between the edge of the sun disk and [member "
"sun_angle_max]."
msgstr ""
@@ -38289,28 +38251,42 @@ msgstr ""
#: doc/classes/ProjectSettings.xml:263
msgid ""
-"Default compression level for gzip. Affects compressed scenes and resources."
+"The default compression level for gzip. Affects compressed scenes and "
+"resources. Higher levels result in smaller files at the cost of compression "
+"speed. Decompression speed is mostly unaffected by the compression level. "
+"[code]-1[/code] uses the default gzip compression level, which is identical "
+"to [code]6[/code] but could change in the future due to underlying zlib "
+"updates."
msgstr ""
#: doc/classes/ProjectSettings.xml:266
msgid ""
-"Default compression level for Zlib. Affects compressed scenes and resources."
+"The default compression level for Zlib. Affects compressed scenes and "
+"resources. Higher levels result in smaller files at the cost of compression "
+"speed. Decompression speed is mostly unaffected by the compression level. "
+"[code]-1[/code] uses the default gzip compression level, which is identical "
+"to [code]6[/code] but could change in the future due to underlying zlib "
+"updates."
msgstr ""
#: doc/classes/ProjectSettings.xml:269
msgid ""
-"Default compression level for Zstandard. Affects compressed scenes and "
-"resources."
+"The default compression level for Zstandard. Affects compressed scenes and "
+"resources. Higher levels result in smaller files at the cost of compression "
+"speed. Decompression speed is mostly unaffected by the compression level."
msgstr ""
#: doc/classes/ProjectSettings.xml:272
-msgid "Enables long-distance matching in Zstandard."
+msgid ""
+"Enables [url=https://github.com/facebook/zstd/releases/tag/v1.3.2]long-"
+"distance matching[/url] in Zstandard."
msgstr ""
#: doc/classes/ProjectSettings.xml:275
msgid ""
"Largest size limit (in power of 2) allowed when compressing using long-"
-"distance matching with Zstandard."
+"distance matching with Zstandard. Higher values can result in better "
+"compression, but will require more memory when compressing and decompressing."
msgstr ""
#: doc/classes/ProjectSettings.xml:278
@@ -38691,37 +38667,37 @@ msgid ""
"UWP to follow interface conventions."
msgstr ""
-#: doc/classes/ProjectSettings.xml:473
+#: doc/classes/ProjectSettings.xml:475
msgid ""
"Path to a custom [Theme] resource file to use for the project ([code]theme[/"
"code] or generic [code]tres[/code]/[code]res[/code] extension)."
msgstr ""
-#: doc/classes/ProjectSettings.xml:476
+#: doc/classes/ProjectSettings.xml:478
msgid ""
"Path to a custom [Font] resource to use as default for all GUI elements of "
"the project."
msgstr ""
-#: doc/classes/ProjectSettings.xml:479
+#: doc/classes/ProjectSettings.xml:481
msgid "If [code]true[/code], makes sure the theme used works with HiDPI."
msgstr ""
-#: doc/classes/ProjectSettings.xml:482
+#: doc/classes/ProjectSettings.xml:484
msgid ""
"Timer setting for incremental search in [Tree], [ItemList], etc. controls "
"(in milliseconds)."
msgstr ""
-#: doc/classes/ProjectSettings.xml:485
+#: doc/classes/ProjectSettings.xml:487
msgid "Timer for detecting idle in [TextEdit] (in seconds)."
msgstr ""
-#: doc/classes/ProjectSettings.xml:488
+#: doc/classes/ProjectSettings.xml:490
msgid "Default delay for tooltips (in seconds)."
msgstr ""
-#: doc/classes/ProjectSettings.xml:491
+#: doc/classes/ProjectSettings.xml:493
msgid ""
"Default [InputEventAction] to confirm a focused button, menu or list item, "
"or validate input.\n"
@@ -38730,7 +38706,7 @@ msgid ""
"to the action can however be modified."
msgstr ""
-#: doc/classes/ProjectSettings.xml:495
+#: doc/classes/ProjectSettings.xml:497
msgid ""
"Default [InputEventAction] to discard a modal or pending input.\n"
"[b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are "
@@ -38738,7 +38714,7 @@ msgid ""
"to the action can however be modified."
msgstr ""
-#: doc/classes/ProjectSettings.xml:499
+#: doc/classes/ProjectSettings.xml:501
msgid ""
"Default [InputEventAction] to move down in the UI.\n"
"[b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are "
@@ -38746,7 +38722,7 @@ msgid ""
"to the action can however be modified."
msgstr ""
-#: doc/classes/ProjectSettings.xml:503
+#: doc/classes/ProjectSettings.xml:505
msgid ""
"Default [InputEventAction] to go to the end position of a [Control] (e.g. "
"last item in an [ItemList] or a [Tree]), matching the behavior of [constant "
@@ -38756,7 +38732,7 @@ msgid ""
"to the action can however be modified."
msgstr ""
-#: doc/classes/ProjectSettings.xml:507
+#: doc/classes/ProjectSettings.xml:509
msgid ""
"Default [InputEventAction] to focus the next [Control] in the scene. The "
"focus behavior can be configured via [member Control.focus_next].\n"
@@ -38765,7 +38741,7 @@ msgid ""
"to the action can however be modified."
msgstr ""
-#: doc/classes/ProjectSettings.xml:511
+#: doc/classes/ProjectSettings.xml:513
msgid ""
"Default [InputEventAction] to focus the previous [Control] in the scene. The "
"focus behavior can be configured via [member Control.focus_previous].\n"
@@ -38774,7 +38750,7 @@ msgid ""
"to the action can however be modified."
msgstr ""
-#: doc/classes/ProjectSettings.xml:515
+#: doc/classes/ProjectSettings.xml:517
msgid ""
"Default [InputEventAction] to go to the start position of a [Control] (e.g. "
"first item in an [ItemList] or a [Tree]), matching the behavior of [constant "
@@ -38784,7 +38760,7 @@ msgid ""
"to the action can however be modified."
msgstr ""
-#: doc/classes/ProjectSettings.xml:519
+#: doc/classes/ProjectSettings.xml:521
msgid ""
"Default [InputEventAction] to move left in the UI.\n"
"[b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are "
@@ -38792,7 +38768,7 @@ msgid ""
"to the action can however be modified."
msgstr ""
-#: doc/classes/ProjectSettings.xml:523
+#: doc/classes/ProjectSettings.xml:525
msgid ""
"Default [InputEventAction] to go down a page in a [Control] (e.g. in an "
"[ItemList] or a [Tree]), matching the behavior of [constant KEY_PAGEDOWN] on "
@@ -38802,7 +38778,7 @@ msgid ""
"to the action can however be modified."
msgstr ""
-#: doc/classes/ProjectSettings.xml:527
+#: doc/classes/ProjectSettings.xml:529
msgid ""
"Default [InputEventAction] to go up a page in a [Control] (e.g. in an "
"[ItemList] or a [Tree]), matching the behavior of [constant KEY_PAGEUP] on "
@@ -38812,7 +38788,7 @@ msgid ""
"to the action can however be modified."
msgstr ""
-#: doc/classes/ProjectSettings.xml:531
+#: doc/classes/ProjectSettings.xml:533
msgid ""
"Default [InputEventAction] to move right in the UI.\n"
"[b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are "
@@ -38820,7 +38796,7 @@ msgid ""
"to the action can however be modified."
msgstr ""
-#: doc/classes/ProjectSettings.xml:535
+#: doc/classes/ProjectSettings.xml:537
msgid ""
"Default [InputEventAction] to select an item in a [Control] (e.g. in an "
"[ItemList] or a [Tree]).\n"
@@ -38829,7 +38805,7 @@ msgid ""
"to the action can however be modified."
msgstr ""
-#: doc/classes/ProjectSettings.xml:539
+#: doc/classes/ProjectSettings.xml:541
msgid ""
"Default [InputEventAction] to move up in the UI.\n"
"[b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are "
@@ -38837,371 +38813,371 @@ msgid ""
"to the action can however be modified."
msgstr ""
-#: doc/classes/ProjectSettings.xml:543
+#: doc/classes/ProjectSettings.xml:545
msgid ""
"If [code]true[/code], sends mouse input events when tapping or swiping on "
"the touchscreen."
msgstr ""
-#: doc/classes/ProjectSettings.xml:546
+#: doc/classes/ProjectSettings.xml:548
msgid ""
"If [code]true[/code], sends touch input events when clicking or dragging the "
"mouse."
msgstr ""
-#: doc/classes/ProjectSettings.xml:549
+#: doc/classes/ProjectSettings.xml:551
msgid "Optional name for the 2D physics layer 1."
msgstr ""
-#: doc/classes/ProjectSettings.xml:552
+#: doc/classes/ProjectSettings.xml:554
msgid "Optional name for the 2D physics layer 10."
msgstr ""
-#: doc/classes/ProjectSettings.xml:555
+#: doc/classes/ProjectSettings.xml:557
msgid "Optional name for the 2D physics layer 11."
msgstr ""
-#: doc/classes/ProjectSettings.xml:558
+#: doc/classes/ProjectSettings.xml:560
msgid "Optional name for the 2D physics layer 12."
msgstr ""
-#: doc/classes/ProjectSettings.xml:561
+#: doc/classes/ProjectSettings.xml:563
msgid "Optional name for the 2D physics layer 13."
msgstr ""
-#: doc/classes/ProjectSettings.xml:564
+#: doc/classes/ProjectSettings.xml:566
msgid "Optional name for the 2D physics layer 14."
msgstr ""
-#: doc/classes/ProjectSettings.xml:567
+#: doc/classes/ProjectSettings.xml:569
msgid "Optional name for the 2D physics layer 15."
msgstr ""
-#: doc/classes/ProjectSettings.xml:570
+#: doc/classes/ProjectSettings.xml:572
msgid "Optional name for the 2D physics layer 16."
msgstr ""
-#: doc/classes/ProjectSettings.xml:573
+#: doc/classes/ProjectSettings.xml:575
msgid "Optional name for the 2D physics layer 17."
msgstr ""
-#: doc/classes/ProjectSettings.xml:576
+#: doc/classes/ProjectSettings.xml:578
msgid "Optional name for the 2D physics layer 18."
msgstr ""
-#: doc/classes/ProjectSettings.xml:579
+#: doc/classes/ProjectSettings.xml:581
msgid "Optional name for the 2D physics layer 19."
msgstr ""
-#: doc/classes/ProjectSettings.xml:582
+#: doc/classes/ProjectSettings.xml:584
msgid "Optional name for the 2D physics layer 2."
msgstr ""
-#: doc/classes/ProjectSettings.xml:585
+#: doc/classes/ProjectSettings.xml:587
msgid "Optional name for the 2D physics layer 20."
msgstr ""
-#: doc/classes/ProjectSettings.xml:588
+#: doc/classes/ProjectSettings.xml:590
msgid "Optional name for the 2D physics layer 3."
msgstr ""
-#: doc/classes/ProjectSettings.xml:591
+#: doc/classes/ProjectSettings.xml:593
msgid "Optional name for the 2D physics layer 4."
msgstr ""
-#: doc/classes/ProjectSettings.xml:594
+#: doc/classes/ProjectSettings.xml:596
msgid "Optional name for the 2D physics layer 5."
msgstr ""
-#: doc/classes/ProjectSettings.xml:597
+#: doc/classes/ProjectSettings.xml:599
msgid "Optional name for the 2D physics layer 6."
msgstr ""
-#: doc/classes/ProjectSettings.xml:600
+#: doc/classes/ProjectSettings.xml:602
msgid "Optional name for the 2D physics layer 7."
msgstr ""
-#: doc/classes/ProjectSettings.xml:603
+#: doc/classes/ProjectSettings.xml:605
msgid "Optional name for the 2D physics layer 8."
msgstr ""
-#: doc/classes/ProjectSettings.xml:606
+#: doc/classes/ProjectSettings.xml:608
msgid "Optional name for the 2D physics layer 9."
msgstr ""
-#: doc/classes/ProjectSettings.xml:609
+#: doc/classes/ProjectSettings.xml:611
msgid "Optional name for the 2D render layer 1."
msgstr ""
-#: doc/classes/ProjectSettings.xml:612
+#: doc/classes/ProjectSettings.xml:614
msgid "Optional name for the 2D render layer 10."
msgstr ""
-#: doc/classes/ProjectSettings.xml:615
+#: doc/classes/ProjectSettings.xml:617
msgid "Optional name for the 2D render layer 11."
msgstr ""
-#: doc/classes/ProjectSettings.xml:618
+#: doc/classes/ProjectSettings.xml:620
msgid "Optional name for the 2D render layer 12."
msgstr ""
-#: doc/classes/ProjectSettings.xml:621
+#: doc/classes/ProjectSettings.xml:623
msgid "Optional name for the 2D render layer 13."
msgstr ""
-#: doc/classes/ProjectSettings.xml:624
+#: doc/classes/ProjectSettings.xml:626
msgid "Optional name for the 2D render layer 14."
msgstr ""
-#: doc/classes/ProjectSettings.xml:627
+#: doc/classes/ProjectSettings.xml:629
msgid "Optional name for the 2D render layer 15."
msgstr ""
-#: doc/classes/ProjectSettings.xml:630
+#: doc/classes/ProjectSettings.xml:632
msgid "Optional name for the 2D render layer 16."
msgstr ""
-#: doc/classes/ProjectSettings.xml:633
+#: doc/classes/ProjectSettings.xml:635
msgid "Optional name for the 2D render layer 17."
msgstr ""
-#: doc/classes/ProjectSettings.xml:636
+#: doc/classes/ProjectSettings.xml:638
msgid "Optional name for the 2D render layer 18."
msgstr ""
-#: doc/classes/ProjectSettings.xml:639
+#: doc/classes/ProjectSettings.xml:641
msgid "Optional name for the 2D render layer 19."
msgstr ""
-#: doc/classes/ProjectSettings.xml:642
+#: doc/classes/ProjectSettings.xml:644
msgid "Optional name for the 2D render layer 2."
msgstr ""
-#: doc/classes/ProjectSettings.xml:645
+#: doc/classes/ProjectSettings.xml:647
msgid "Optional name for the 2D render layer 20."
msgstr ""
-#: doc/classes/ProjectSettings.xml:648
+#: doc/classes/ProjectSettings.xml:650
msgid "Optional name for the 2D render layer 3."
msgstr ""
-#: doc/classes/ProjectSettings.xml:651
+#: doc/classes/ProjectSettings.xml:653
msgid "Optional name for the 2D render layer 4."
msgstr ""
-#: doc/classes/ProjectSettings.xml:654
+#: doc/classes/ProjectSettings.xml:656
msgid "Optional name for the 2D render layer 5."
msgstr ""
-#: doc/classes/ProjectSettings.xml:657
+#: doc/classes/ProjectSettings.xml:659
msgid "Optional name for the 2D render layer 6."
msgstr ""
-#: doc/classes/ProjectSettings.xml:660
+#: doc/classes/ProjectSettings.xml:662
msgid "Optional name for the 2D render layer 7."
msgstr ""
-#: doc/classes/ProjectSettings.xml:663
+#: doc/classes/ProjectSettings.xml:665
msgid "Optional name for the 2D render layer 8."
msgstr ""
-#: doc/classes/ProjectSettings.xml:666
+#: doc/classes/ProjectSettings.xml:668
msgid "Optional name for the 2D render layer 9."
msgstr ""
-#: doc/classes/ProjectSettings.xml:669
+#: doc/classes/ProjectSettings.xml:671
msgid "Optional name for the 3D physics layer 1."
msgstr ""
-#: doc/classes/ProjectSettings.xml:672
+#: doc/classes/ProjectSettings.xml:674
msgid "Optional name for the 3D physics layer 10."
msgstr ""
-#: doc/classes/ProjectSettings.xml:675
+#: doc/classes/ProjectSettings.xml:677
msgid "Optional name for the 3D physics layer 11."
msgstr ""
-#: doc/classes/ProjectSettings.xml:678
+#: doc/classes/ProjectSettings.xml:680
msgid "Optional name for the 3D physics layer 12."
msgstr ""
-#: doc/classes/ProjectSettings.xml:681
+#: doc/classes/ProjectSettings.xml:683
msgid "Optional name for the 3D physics layer 13."
msgstr ""
-#: doc/classes/ProjectSettings.xml:684
+#: doc/classes/ProjectSettings.xml:686
msgid "Optional name for the 3D physics layer 14."
msgstr ""
-#: doc/classes/ProjectSettings.xml:687
+#: doc/classes/ProjectSettings.xml:689
msgid "Optional name for the 3D physics layer 15."
msgstr ""
-#: doc/classes/ProjectSettings.xml:690
+#: doc/classes/ProjectSettings.xml:692
msgid "Optional name for the 3D physics layer 16."
msgstr ""
-#: doc/classes/ProjectSettings.xml:693
+#: doc/classes/ProjectSettings.xml:695
msgid "Optional name for the 3D physics layer 17."
msgstr ""
-#: doc/classes/ProjectSettings.xml:696
+#: doc/classes/ProjectSettings.xml:698
msgid "Optional name for the 3D physics layer 18."
msgstr ""
-#: doc/classes/ProjectSettings.xml:699
+#: doc/classes/ProjectSettings.xml:701
msgid "Optional name for the 3D physics layer 19."
msgstr ""
-#: doc/classes/ProjectSettings.xml:702
+#: doc/classes/ProjectSettings.xml:704
msgid "Optional name for the 3D physics layer 2."
msgstr ""
-#: doc/classes/ProjectSettings.xml:705
+#: doc/classes/ProjectSettings.xml:707
msgid "Optional name for the 3D physics layer 20."
msgstr ""
-#: doc/classes/ProjectSettings.xml:708
+#: doc/classes/ProjectSettings.xml:710
msgid "Optional name for the 3D physics layer 3."
msgstr ""
-#: doc/classes/ProjectSettings.xml:711
+#: doc/classes/ProjectSettings.xml:713
msgid "Optional name for the 3D physics layer 4."
msgstr ""
-#: doc/classes/ProjectSettings.xml:714
+#: doc/classes/ProjectSettings.xml:716
msgid "Optional name for the 3D physics layer 5."
msgstr ""
-#: doc/classes/ProjectSettings.xml:717
+#: doc/classes/ProjectSettings.xml:719
msgid "Optional name for the 3D physics layer 6."
msgstr ""
-#: doc/classes/ProjectSettings.xml:720
+#: doc/classes/ProjectSettings.xml:722
msgid "Optional name for the 3D physics layer 7."
msgstr ""
-#: doc/classes/ProjectSettings.xml:723
+#: doc/classes/ProjectSettings.xml:725
msgid "Optional name for the 3D physics layer 8."
msgstr ""
-#: doc/classes/ProjectSettings.xml:726
+#: doc/classes/ProjectSettings.xml:728
msgid "Optional name for the 3D physics layer 9."
msgstr ""
-#: doc/classes/ProjectSettings.xml:729
+#: doc/classes/ProjectSettings.xml:731
msgid "Optional name for the 3D render layer 1."
msgstr ""
-#: doc/classes/ProjectSettings.xml:732
+#: doc/classes/ProjectSettings.xml:734
msgid "Optional name for the 3D render layer 10."
msgstr ""
-#: doc/classes/ProjectSettings.xml:735
+#: doc/classes/ProjectSettings.xml:737
msgid "Optional name for the 3D render layer 11."
msgstr ""
-#: doc/classes/ProjectSettings.xml:738
+#: doc/classes/ProjectSettings.xml:740
msgid "Optional name for the 3D render layer 12."
msgstr ""
-#: doc/classes/ProjectSettings.xml:741
+#: doc/classes/ProjectSettings.xml:743
msgid "Optional name for the 3D render layer 13."
msgstr ""
-#: doc/classes/ProjectSettings.xml:744
+#: doc/classes/ProjectSettings.xml:746
msgid "Optional name for the 3D render layer 14"
msgstr ""
-#: doc/classes/ProjectSettings.xml:747
+#: doc/classes/ProjectSettings.xml:749
msgid "Optional name for the 3D render layer 15."
msgstr ""
-#: doc/classes/ProjectSettings.xml:750
+#: doc/classes/ProjectSettings.xml:752
msgid "Optional name for the 3D render layer 16."
msgstr ""
-#: doc/classes/ProjectSettings.xml:753
+#: doc/classes/ProjectSettings.xml:755
msgid "Optional name for the 3D render layer 17."
msgstr ""
-#: doc/classes/ProjectSettings.xml:756
+#: doc/classes/ProjectSettings.xml:758
msgid "Optional name for the 3D render layer 18."
msgstr ""
-#: doc/classes/ProjectSettings.xml:759
+#: doc/classes/ProjectSettings.xml:761
msgid "Optional name for the 3D render layer 19."
msgstr ""
-#: doc/classes/ProjectSettings.xml:762
+#: doc/classes/ProjectSettings.xml:764
msgid "Optional name for the 3D render layer 2."
msgstr ""
-#: doc/classes/ProjectSettings.xml:765
+#: doc/classes/ProjectSettings.xml:767
msgid "Optional name for the 3D render layer 20."
msgstr ""
-#: doc/classes/ProjectSettings.xml:768
+#: doc/classes/ProjectSettings.xml:770
msgid "Optional name for the 3D render layer 3."
msgstr ""
-#: doc/classes/ProjectSettings.xml:771
+#: doc/classes/ProjectSettings.xml:773
msgid "Optional name for the 3D render layer 4."
msgstr ""
-#: doc/classes/ProjectSettings.xml:774
+#: doc/classes/ProjectSettings.xml:776
msgid "Optional name for the 3D render layer 5."
msgstr ""
-#: doc/classes/ProjectSettings.xml:777
+#: doc/classes/ProjectSettings.xml:779
msgid "Optional name for the 3D render layer 6."
msgstr ""
-#: doc/classes/ProjectSettings.xml:780
+#: doc/classes/ProjectSettings.xml:782
msgid "Optional name for the 3D render layer 7."
msgstr ""
-#: doc/classes/ProjectSettings.xml:783
+#: doc/classes/ProjectSettings.xml:785
msgid "Optional name for the 3D render layer 8."
msgstr ""
-#: doc/classes/ProjectSettings.xml:786
+#: doc/classes/ProjectSettings.xml:788
msgid "Optional name for the 3D render layer 9."
msgstr ""
-#: doc/classes/ProjectSettings.xml:789
+#: doc/classes/ProjectSettings.xml:791
msgid ""
"The locale to fall back to if a translation isn't available in a given "
"language. If left empty, [code]en[/code] (English) will be used."
msgstr ""
-#: doc/classes/ProjectSettings.xml:792
+#: doc/classes/ProjectSettings.xml:794
msgid ""
"If non-empty, this locale will be used when running the project from the "
"editor."
msgstr ""
-#: doc/classes/ProjectSettings.xml:795
+#: doc/classes/ProjectSettings.xml:797
msgid "If [code]true[/code], logs all output to files."
msgstr ""
-#: doc/classes/ProjectSettings.xml:798
+#: doc/classes/ProjectSettings.xml:800
msgid ""
"Path to logs within the project. Using an [code]user://[/code] path is "
"recommended."
msgstr ""
-#: doc/classes/ProjectSettings.xml:801
+#: doc/classes/ProjectSettings.xml:803
msgid "Specifies the maximum amount of log files allowed (used for rotation)."
msgstr ""
-#: doc/classes/ProjectSettings.xml:804
+#: doc/classes/ProjectSettings.xml:806
msgid ""
"Godot uses a message queue to defer some function calls. If you run out of "
"space on it (you will see an error), you can increase the size here."
msgstr ""
-#: doc/classes/ProjectSettings.xml:807
+#: doc/classes/ProjectSettings.xml:809
msgid ""
"This is used by servers when used in multi-threading mode (servers and "
"visual). RIDs are preallocated to avoid stalling the server requesting them "
@@ -39209,118 +39185,118 @@ msgid ""
"thread, increase this number."
msgstr ""
-#: doc/classes/ProjectSettings.xml:822
+#: doc/classes/ProjectSettings.xml:824
msgid ""
"Maximum amount of characters allowed to send as output from the debugger. "
"Over this value, content is dropped. This helps not to stall the debugger "
"connection."
msgstr ""
-#: doc/classes/ProjectSettings.xml:825
+#: doc/classes/ProjectSettings.xml:827
msgid ""
"Maximum number of errors allowed to be sent from the debugger. Over this "
"value, content is dropped. This helps not to stall the debugger connection."
msgstr ""
-#: doc/classes/ProjectSettings.xml:828
+#: doc/classes/ProjectSettings.xml:830
msgid ""
"Maximum amount of messages in the debugger queue. Over this value, content "
"is dropped. This helps to limit the debugger memory usage."
msgstr ""
-#: doc/classes/ProjectSettings.xml:831
+#: doc/classes/ProjectSettings.xml:833
msgid ""
"Maximum number of warnings allowed to be sent from the debugger. Over this "
"value, content is dropped. This helps not to stall the debugger connection."
msgstr ""
-#: doc/classes/ProjectSettings.xml:834
+#: doc/classes/ProjectSettings.xml:836
msgid ""
"Default size of packet peer stream for deserializing Godot data. Over this "
"size, data is dropped."
msgstr ""
-#: doc/classes/ProjectSettings.xml:837
+#: doc/classes/ProjectSettings.xml:839
msgid "Timeout (in seconds) for connection attempts using TCP."
msgstr ""
-#: doc/classes/ProjectSettings.xml:840
+#: doc/classes/ProjectSettings.xml:842
msgid "Maximum size (in kiB) for the [WebRTCDataChannel] input buffer."
msgstr ""
-#: doc/classes/ProjectSettings.xml:843
+#: doc/classes/ProjectSettings.xml:845
msgid "Maximum size (in kiB) for the [WebSocketClient] input buffer."
msgstr ""
-#: doc/classes/ProjectSettings.xml:846
+#: doc/classes/ProjectSettings.xml:848
msgid "Maximum number of concurrent input packets for [WebSocketClient]."
msgstr ""
-#: doc/classes/ProjectSettings.xml:849
+#: doc/classes/ProjectSettings.xml:851
msgid "Maximum size (in kiB) for the [WebSocketClient] output buffer."
msgstr ""
-#: doc/classes/ProjectSettings.xml:852
+#: doc/classes/ProjectSettings.xml:854
msgid "Maximum number of concurrent output packets for [WebSocketClient]."
msgstr ""
-#: doc/classes/ProjectSettings.xml:855
+#: doc/classes/ProjectSettings.xml:857
msgid "Maximum size (in kiB) for the [WebSocketServer] input buffer."
msgstr ""
-#: doc/classes/ProjectSettings.xml:858
+#: doc/classes/ProjectSettings.xml:860
msgid "Maximum number of concurrent input packets for [WebSocketServer]."
msgstr ""
-#: doc/classes/ProjectSettings.xml:861
+#: doc/classes/ProjectSettings.xml:863
msgid "Maximum size (in kiB) for the [WebSocketServer] output buffer."
msgstr ""
-#: doc/classes/ProjectSettings.xml:864
+#: doc/classes/ProjectSettings.xml:866
msgid "Maximum number of concurrent output packets for [WebSocketServer]."
msgstr ""
-#: doc/classes/ProjectSettings.xml:867
+#: doc/classes/ProjectSettings.xml:869
msgid ""
"Amount of read ahead used by remote filesystem. Higher values decrease the "
"effects of latency at the cost of higher bandwidth usage."
msgstr ""
-#: doc/classes/ProjectSettings.xml:870
+#: doc/classes/ProjectSettings.xml:872
msgid "Page size used by remote filesystem (in bytes)."
msgstr ""
-#: doc/classes/ProjectSettings.xml:873
+#: doc/classes/ProjectSettings.xml:875
msgid ""
"CA certificates bundle to use for SSL connections. If not defined, Godot's "
"internal CA certificates are used."
msgstr ""
-#: doc/classes/ProjectSettings.xml:876
+#: doc/classes/ProjectSettings.xml:878
msgid ""
"When creating node names automatically, set the type of casing in this "
"project. This is mostly an editor setting."
msgstr ""
-#: doc/classes/ProjectSettings.xml:879
+#: doc/classes/ProjectSettings.xml:881
msgid ""
"What to use to separate node name from number. This is mostly an editor "
"setting."
msgstr ""
-#: doc/classes/ProjectSettings.xml:882
+#: doc/classes/ProjectSettings.xml:884
msgid "Size of the hash table used for the broad-phase 2D hash grid algorithm."
msgstr ""
-#: doc/classes/ProjectSettings.xml:885
+#: doc/classes/ProjectSettings.xml:887
msgid "Cell size used for the broad-phase 2D hash grid algorithm."
msgstr ""
-#: doc/classes/ProjectSettings.xml:888
+#: doc/classes/ProjectSettings.xml:890
msgid "The default angular damp in 2D."
msgstr ""
-#: doc/classes/ProjectSettings.xml:891
+#: doc/classes/ProjectSettings.xml:893
msgid ""
"The default gravity strength in 2D.\n"
"[b]Note:[/b] This property is only read when the project starts. To change "
@@ -39332,7 +39308,7 @@ msgid ""
"[/codeblock]"
msgstr ""
-#: doc/classes/ProjectSettings.xml:899
+#: doc/classes/ProjectSettings.xml:901
msgid ""
"The default gravity direction in 2D.\n"
"[b]Note:[/b] This property is only read when the project starts. To change "
@@ -39344,38 +39320,38 @@ msgid ""
"[/codeblock]"
msgstr ""
-#: doc/classes/ProjectSettings.xml:907
+#: doc/classes/ProjectSettings.xml:909
msgid "The default linear damp in 2D."
msgstr ""
-#: doc/classes/ProjectSettings.xml:910
+#: doc/classes/ProjectSettings.xml:912
msgid ""
"Threshold defining the surface size that constitutes a large object with "
"regard to cells in the broad-phase 2D hash grid algorithm."
msgstr ""
-#: doc/classes/ProjectSettings.xml:913
+#: doc/classes/ProjectSettings.xml:915
msgid ""
"Sets which physics engine to use for 2D physics.\n"
-"\"DEFAULT\" and \"GodotPhysics\" are the same, as there is currently no "
+"\"DEFAULT\" and \"GodotPhysics2D\" are the same, as there is currently no "
"alternative 2D physics server implemented."
msgstr ""
-#: doc/classes/ProjectSettings.xml:917
+#: doc/classes/ProjectSettings.xml:919
msgid ""
"Threshold angular velocity under which a 2D physics body will be considered "
"inactive. See [constant PhysicsServer2D."
"SPACE_PARAM_BODY_ANGULAR_VELOCITY_SLEEP_THRESHOLD]."
msgstr ""
-#: doc/classes/ProjectSettings.xml:920
+#: doc/classes/ProjectSettings.xml:922
msgid ""
"Threshold linear velocity under which a 2D physics body will be considered "
"inactive. See [constant PhysicsServer2D."
"SPACE_PARAM_BODY_LINEAR_VELOCITY_SLEEP_THRESHOLD]."
msgstr ""
-#: doc/classes/ProjectSettings.xml:923
+#: doc/classes/ProjectSettings.xml:925
msgid ""
"Sets whether physics is run on the main thread or a separate one. Running "
"the server on a thread increases performance, but restricts API access to "
@@ -39385,23 +39361,23 @@ msgid ""
"give you extra performance and no regressions when using it."
msgstr ""
-#: doc/classes/ProjectSettings.xml:927
+#: doc/classes/ProjectSettings.xml:929
msgid ""
"Time (in seconds) of inactivity before which a 2D physics body will put to "
"sleep. See [constant PhysicsServer2D.SPACE_PARAM_BODY_TIME_TO_SLEEP]."
msgstr ""
-#: doc/classes/ProjectSettings.xml:930
+#: doc/classes/ProjectSettings.xml:932
msgid ""
"Sets whether the 3D physics world will be created with support for "
"[SoftBody3D] physics. Only applies to the Bullet physics engine."
msgstr ""
-#: doc/classes/ProjectSettings.xml:933
+#: doc/classes/ProjectSettings.xml:935
msgid "The default angular damp in 3D."
msgstr ""
-#: doc/classes/ProjectSettings.xml:936
+#: doc/classes/ProjectSettings.xml:938
msgid ""
"The default gravity strength in 3D.\n"
"[b]Note:[/b] This property is only read when the project starts. To change "
@@ -39413,7 +39389,7 @@ msgid ""
"[/codeblock]"
msgstr ""
-#: doc/classes/ProjectSettings.xml:944
+#: doc/classes/ProjectSettings.xml:946
msgid ""
"The default gravity direction in 3D.\n"
"[b]Note:[/b] This property is only read when the project starts. To change "
@@ -39425,23 +39401,23 @@ msgid ""
"[/codeblock]"
msgstr ""
-#: doc/classes/ProjectSettings.xml:952
+#: doc/classes/ProjectSettings.xml:954
msgid "The default linear damp in 3D."
msgstr ""
-#: doc/classes/ProjectSettings.xml:955
+#: doc/classes/ProjectSettings.xml:957
msgid ""
"Sets which physics engine to use for 3D physics.\n"
"\"DEFAULT\" is currently the [url=https://bulletphysics.org]Bullet[/url] "
-"physics engine. The \"GodotPhysics\" engine is still supported as an "
+"physics engine. The \"GodotPhysics3D\" engine is still supported as an "
"alternative."
msgstr ""
-#: doc/classes/ProjectSettings.xml:959
+#: doc/classes/ProjectSettings.xml:961
msgid "Enables [member Viewport.physics_object_picking] on the root viewport."
msgstr ""
-#: doc/classes/ProjectSettings.xml:962
+#: doc/classes/ProjectSettings.xml:964
msgid ""
"The number of fixed iterations per second. This controls how often physics "
"simulation and [method Node._physics_process] methods are run.\n"
@@ -39450,7 +39426,7 @@ msgid ""
"instead."
msgstr ""
-#: doc/classes/ProjectSettings.xml:966
+#: doc/classes/ProjectSettings.xml:968
msgid ""
"Fix to improve physics jitter, specially on monitors where refresh rate is "
"different than the physics FPS.\n"
@@ -39458,7 +39434,7 @@ msgid ""
"the physics FPS at runtime, set [member Engine.physics_jitter_fix] instead."
msgstr ""
-#: doc/classes/ProjectSettings.xml:970
+#: doc/classes/ProjectSettings.xml:972
msgid ""
"Default background clear color. Overridable per [Viewport] using its "
"[Environment]. See [member Environment.background_mode] and [member "
@@ -39466,7 +39442,7 @@ msgid ""
"programmatically, use [method RenderingServer.set_default_clear_color]."
msgstr ""
-#: doc/classes/ProjectSettings.xml:973
+#: doc/classes/ProjectSettings.xml:975
msgid ""
"[Environment] that will be used as a fallback environment in case a scene "
"does not specify its own environment. The default environment is loaded in "
@@ -39476,14 +39452,14 @@ msgid ""
"here."
msgstr ""
-#: doc/classes/ProjectSettings.xml:976
+#: doc/classes/ProjectSettings.xml:980
msgid ""
"Max amount of elements renderable in a frame. If more than this are visible "
"per frame, they will be dropped. Keep in mind elements refer to mesh "
"surfaces and not meshes themselves."
msgstr ""
-#: doc/classes/ProjectSettings.xml:979
+#: doc/classes/ProjectSettings.xml:985
msgid ""
"Some NVIDIA GPU drivers have a bug which produces flickering issues for the "
"[code]draw_rect[/code] method, especially as used in [TileMap]. Refer to "
@@ -39495,39 +39471,73 @@ msgid ""
"using the Vulkan backend."
msgstr ""
-#: doc/classes/ProjectSettings.xml:983
+#: doc/classes/ProjectSettings.xml:989
msgid ""
"If [code]true[/code], forces snapping of polygons to pixels in 2D rendering. "
"May help in some pixel art styles."
msgstr ""
-#: doc/classes/ProjectSettings.xml:986
+#: doc/classes/ProjectSettings.xml:992
+msgid ""
+"Sets the quality of the depth of field effect. Higher quality takes more "
+"samples, which is slower but looks smoother."
+msgstr ""
+
+#: doc/classes/ProjectSettings.xml:995
+msgid ""
+"Sets the depth of field shape. Can be Box, Hexagon, or Circle. Box is the "
+"fastest. Circle is the most realistic, but also the most expensive to "
+"compute."
+msgstr ""
+
+#: doc/classes/ProjectSettings.xml:998
+msgid ""
+"If [code]true[/code], jitters DOF samples to make effect slightly blurrier "
+"and hide lines created from low sample rates. This can result in a slightly "
+"grainy appearance when used with a low number of samples."
+msgstr ""
+
+#: doc/classes/ProjectSettings.xml:1001
msgid ""
"Disables depth pre-pass for some GPU vendors (usually mobile), as their "
"architecture already does this."
msgstr ""
-#: doc/classes/ProjectSettings.xml:989
+#: doc/classes/ProjectSettings.xml:1004
msgid ""
"If [code]true[/code], performs a previous depth pass before rendering "
"materials. This increases performance in scenes with high overdraw, when "
"complex materials and lighting are used."
msgstr ""
-#: doc/classes/ProjectSettings.xml:992
+#: doc/classes/ProjectSettings.xml:1007
msgid ""
"The directional shadow's size in pixels. Higher values will result in "
"sharper shadows, at the cost of performance. The value will be rounded up to "
"the nearest power of 2."
msgstr ""
-#: doc/classes/ProjectSettings.xml:995
+#: doc/classes/ProjectSettings.xml:1010
msgid ""
"Lower-end override for [member rendering/quality/directional_shadow/size] on "
"mobile devices, due to performance concerns or driver support."
msgstr ""
-#: doc/classes/ProjectSettings.xml:998
+#: doc/classes/ProjectSettings.xml:1013
+msgid ""
+"Quality setting for shadows cast by [DirectionalLight3D]s. Higher quality "
+"settings use more samples when reading from shadow maps and are thus slower. "
+"Low quality settings may result in shadows looking grainy."
+msgstr ""
+
+#: doc/classes/ProjectSettings.xml:1016
+msgid ""
+"Lower-end override for [member rendering/quality/directional_shadow/"
+"soft_shadow_quality] on mobile devices, due to performance concerns or "
+"driver support."
+msgstr ""
+
+#: doc/classes/ProjectSettings.xml:1019
msgid ""
"The video driver to use (\"GLES2\" or \"Vulkan\").\n"
"[b]Note:[/b] The backend in use can be overridden at runtime via the [code]--"
@@ -39537,25 +39547,33 @@ msgid ""
"get_current_video_driver[/code] to query it at run-time."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1012
+#: doc/classes/ProjectSettings.xml:1025
msgid ""
-"Sets the number of MSAA samples to use. MSAA is used to reduce aliasing "
-"around the edges of polygons. A higher MSAA value results in smoother edges "
-"but can be significantly slower on some hardware.\n"
-"[b]Note:[/b] MSAA is not available on HTML5 export using the GLES2 backend."
+"If [code]true[/code], take additional samples when rendering objects "
+"affected by a [GIProbe] to reduce artifacts from only sampling in one "
+"direction."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1020
+#: doc/classes/ProjectSettings.xml:1028
msgid ""
-"If [code]true[/code], uses nearest-neighbor mipmap filtering when using "
-"mipmaps (also called \"bilinear filtering\"), which will result in visible "
-"seams appearing between mipmap stages. This may increase performance in "
-"mobile as less memory bandwidth is used. If [code]false[/code], linear "
-"mipmap filtering (also called \"trilinear filtering\") is used."
+"Sets the number of cone samples taken when rendering objects affected by "
+"[GIProbe]s."
msgstr ""
#: doc/classes/ProjectSettings.xml:1031
msgid ""
+"Sets how the glow effect is upscaled before being copied onto the screen. "
+"Linear is faster, but looks blocky. Bicubic is slower but looks smooth."
+msgstr ""
+
+#: doc/classes/ProjectSettings.xml:1034
+msgid ""
+"Lower-end override for [member rendering/quality/glow/upscale_mode] on "
+"mobile devices, due to performance concerns or driver support."
+msgstr ""
+
+#: doc/classes/ProjectSettings.xml:1037
+msgid ""
"Strategy used for framebuffer allocation. The simpler it is, the less "
"resources it uses (but the less features it supports). If set to \"2D "
"Without Sampling\" or \"3D Without Effects\", sample buffers will not be "
@@ -39564,41 +39582,41 @@ msgid ""
"be available in the [Environment]."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1034
+#: doc/classes/ProjectSettings.xml:1040
msgid ""
"Lower-end override for [member rendering/quality/intended_usage/"
"framebuffer_allocation] on mobile devices, due to performance concerns or "
"driver support."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1037
+#: doc/classes/ProjectSettings.xml:1043
msgid ""
"Number of cubemaps to store in the reflection atlas. The number of "
"[ReflectionProbe]s in a scene will be limited by this amount. A higher "
"number requires more VRAM."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1040
+#: doc/classes/ProjectSettings.xml:1046
msgid ""
"Size of cubemap faces for [ReflectionProbe]s. A higher number requires more "
"VRAM and may make reflection probe updating slower."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1043
+#: doc/classes/ProjectSettings.xml:1049
msgid ""
"Lower-end override for [member rendering/quality/reflection_atlas/"
"reflection_size] on mobile devices, due to performance concerns or driver "
"support."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1046
+#: doc/classes/ProjectSettings.xml:1052
msgid ""
"Use a higher quality variant of the fast filtering algorithm. Significantly "
"slower than using default quality, but results in smoother reflections. "
"Should only be used when the scene is especially detailed."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1049
+#: doc/classes/ProjectSettings.xml:1055
msgid ""
"Sets the number of samples to take when using importance sampling for [Sky]s "
"and [ReflectionProbe]s. A higher value will result in smoother, higher "
@@ -39608,19 +39626,19 @@ msgid ""
"environments with a high level of detail."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1052
+#: doc/classes/ProjectSettings.xml:1058
msgid ""
"Lower-end override for [member rendering/quality/reflections/ggx_samples] on "
"mobile devices, due to performance concerns or driver support."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1055
+#: doc/classes/ProjectSettings.xml:1061
msgid ""
"Limits the number of layers to use in radiance maps when using importance "
"sampling. A lower number will be slightly faster and take up less VRAM."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1058
+#: doc/classes/ProjectSettings.xml:1064
msgid ""
"If [code]true[/code], uses texture arrays instead of mipmaps for reflection "
"probes and panorama backgrounds (sky). This reduces jitter noise and "
@@ -39629,128 +39647,229 @@ msgid ""
"memory."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1061
+#: doc/classes/ProjectSettings.xml:1067
msgid ""
"Lower-end override for [member rendering/quality/reflections/"
"texture_array_reflections] on mobile devices, due to performance concerns or "
"driver support."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1066
+#: doc/classes/ProjectSettings.xml:1070
+msgid ""
+"Sets the number of MSAA samples to use. MSAA is used to reduce aliasing "
+"around the edges of polygons. A higher MSAA value results in smoother edges "
+"but can be significantly slower on some hardware.\n"
+"[b]Note:[/b] MSAA is not available on HTML5 export using the GLES2 backend."
+msgstr ""
+
+#: doc/classes/ProjectSettings.xml:1074
+msgid ""
+"Sets the screen-space antialiasing mode for the default screen [Viewport]. "
+"Screen-space antialiasing works by selectively blurring edges in a post-"
+"process shader. It differs from MSAA which takes multiple coverage samples "
+"while rendering objects. Screen-space AA methods are typically faster than "
+"MSAA and will smooth out specular aliasing, but tend to make scenes appear "
+"blurry.\n"
+"Another way to combat specular aliasing is to enable [member rendering/"
+"quality/screen_filters/screen_space_roughness_limiter]."
+msgstr ""
+
+#: doc/classes/ProjectSettings.xml:1078
+msgid ""
+"Enables the screen-space roughness limiter which increases material "
+"roughness in areas with a high normal frequency (i.e. when normals change a "
+"lot from pixel to pixel). This helps to reduce the amount of specular "
+"aliasing in a scene. Specular aliasing looks like random bright pixels that "
+"occur in reflections."
+msgstr ""
+
+#: doc/classes/ProjectSettings.xml:1081
+msgid ""
+"Curves the amount of the roughness limited effect. A higher value limits the "
+"effect to very sharply curved surfaces, while a lower threshold extends the "
+"effect to smoother surfaces."
+msgstr ""
+
+#: doc/classes/ProjectSettings.xml:1084
+msgid ""
+"Sets the quality for rough screen-space reflections. Turning off will make "
+"all screen space reflections sharp, while higher values make rough "
+"reflections look better."
+msgstr ""
+
+#: doc/classes/ProjectSettings.xml:1087
msgid ""
"If [code]true[/code], uses faster but lower-quality Blinn model to generate "
"blurred reflections instead of the GGX model."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1069
+#: doc/classes/ProjectSettings.xml:1090
msgid ""
"Lower-end override for [member rendering/quality/shading/"
"force_blinn_over_ggx] on mobile devices, due to performance concerns or "
"driver support."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1072
+#: doc/classes/ProjectSettings.xml:1093
msgid ""
"If [code]true[/code], uses faster but lower-quality Lambert material "
"lighting model instead of Burley."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1075
+#: doc/classes/ProjectSettings.xml:1096
msgid ""
"Lower-end override for [member rendering/quality/shading/"
"force_lambert_over_burley] on mobile devices, due to performance concerns or "
"driver support."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1078
+#: doc/classes/ProjectSettings.xml:1099
msgid ""
"If [code]true[/code], forces vertex shading for all rendering. This can "
"increase performance a lot, but also reduces quality immensely. Can be used "
"to optimize performance on low-end mobile devices."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1081
+#: doc/classes/ProjectSettings.xml:1102
msgid ""
"Lower-end override for [member rendering/quality/shading/"
"force_vertex_shading] on mobile devices, due to performance concerns or "
"driver support."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1084 doc/classes/ProjectSettings.xml:1087
-#: doc/classes/ProjectSettings.xml:1090 doc/classes/ProjectSettings.xml:1093
+#: doc/classes/ProjectSettings.xml:1105 doc/classes/ProjectSettings.xml:1108
+#: doc/classes/ProjectSettings.xml:1111 doc/classes/ProjectSettings.xml:1114
msgid ""
"Subdivision quadrant size for shadow mapping. See shadow mapping "
"documentation."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1096
+#: doc/classes/ProjectSettings.xml:1117
msgid ""
"Size for shadow atlas (used for OmniLights and SpotLights). See "
"documentation."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1099
+#: doc/classes/ProjectSettings.xml:1120
msgid ""
"Lower-end override for [member rendering/quality/shadow_atlas/size] on "
"mobile devices, due to performance concerns or driver support."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1102
+#: doc/classes/ProjectSettings.xml:1123
msgid ""
-"Shadow filter mode. Higher-quality settings result in smoother shadows that "
-"flicker less when moving. \"Disabled\" is the fastest option, but also has "
-"the lowest quality. \"PCF5\" is smoother but is also slower. \"PCF13\" is "
-"the smoothest option, but is also the slowest."
+"Quality setting for shadows cast by [OmniLight3D]s and [SpotLight3D]s. "
+"Higher quality settings use more samples when reading from shadow maps and "
+"are thus slower. Low quality settings may result in shadows looking grainy."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1105
+#: doc/classes/ProjectSettings.xml:1126
msgid ""
-"Lower-end override for [member rendering/quality/shadows/filter_mode] on "
-"mobile devices, due to performance concerns or driver support."
+"Lower-end override for [member rendering/quality/shadows/"
+"soft_shadow_quality] on mobile devices, due to performance concerns or "
+"driver support."
+msgstr ""
+
+#: doc/classes/ProjectSettings.xml:1129
+msgid ""
+"If [code]true[/code], screen-space ambient occlusion will be rendered at "
+"half size and then upscaled before being added to the scene. This is "
+"significantly faster but may miss small details."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1118
+#: doc/classes/ProjectSettings.xml:1132
+msgid ""
+"Sets the quality of the screen-space ambient occlusion effect. Higher values "
+"take more samples and so will result in better quality, at the cost of "
+"performance."
+msgstr ""
+
+#: doc/classes/ProjectSettings.xml:1135
+msgid ""
+"Scales the depth over which the subsurface scattering effect is applied. A "
+"high value may allow light to scatter into a part of the mesh or another "
+"mesh that is close in screen space but far in depth."
+msgstr ""
+
+#: doc/classes/ProjectSettings.xml:1138
+msgid ""
+"Sets the quality of the subsurface scattering effect. Higher values are "
+"slower but look nicer."
+msgstr ""
+
+#: doc/classes/ProjectSettings.xml:1141
+msgid ""
+"Scales the distance over which samples are taken for subsurface scattering "
+"effect. Changing this does not impact performance, but higher values will "
+"result in significant artifacts as the samples will become obviously spread "
+"out. A lower value results in a smaller spread of scattered light."
+msgstr ""
+
+#: doc/classes/ProjectSettings.xml:1144
+msgid ""
+"Sets the maximum number of samples to take when using anisotropic filtering "
+"on textures. A higher sample count will result in sharper textures at "
+"oblique angles, but is more expensive to compute.\n"
+"Only power of two values are valid ([code]1[/code], [code]2[/code], [code]4[/"
+"code], [code]8[/code], [code]16[/code]). A value of [code]1[/code] forcibly "
+"disables anisotropic filtering, even on materials where it is enabled."
+msgstr ""
+
+#: doc/classes/ProjectSettings.xml:1148
+msgid ""
+"If [code]true[/code], uses nearest-neighbor mipmap filtering when using "
+"mipmaps (also called \"bilinear filtering\"), which will result in visible "
+"seams appearing between mipmap stages. This may increase performance in "
+"mobile as less memory bandwidth is used. If [code]false[/code], linear "
+"mipmap filtering (also called \"trilinear filtering\") is used."
+msgstr ""
+
+#: doc/classes/ProjectSettings.xml:1151
msgid ""
"Thread model for rendering. Rendering on a thread can vastly improve "
"performance, but synchronizing to the main thread can cause a bit more "
"jitter."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1121
+#: doc/classes/ProjectSettings.xml:1154
msgid ""
"If [code]true[/code], the texture importer will import VRAM-compressed "
"textures using the BPTC algorithm. This texture compression algorithm is "
"only supported on desktop platforms, and only when using the Vulkan renderer."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1124
+#: doc/classes/ProjectSettings.xml:1157
msgid ""
"If [code]true[/code], the texture importer will import VRAM-compressed "
"textures using the Ericsson Texture Compression algorithm. This algorithm "
"doesn't support alpha channels in textures."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1127
+#: doc/classes/ProjectSettings.xml:1160
msgid ""
"If [code]true[/code], the texture importer will import VRAM-compressed "
"textures using the Ericsson Texture Compression 2 algorithm. This texture "
"compression algorithm is only supported when using the Vulkan renderer."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1130
+#: doc/classes/ProjectSettings.xml:1163
msgid ""
"If [code]true[/code], the texture importer will import VRAM-compressed "
"textures using the PowerVR Texture Compression algorithm. This texture "
"compression algorithm is only supported on iOS."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1133
+#: doc/classes/ProjectSettings.xml:1166
msgid ""
"If [code]true[/code], the texture importer will import VRAM-compressed "
"textures using the S3 Texture Compression algorithm. This algorithm is only "
"supported on desktop platforms and consoles."
msgstr ""
+#: doc/classes/ProjectSettings.xml:1177
+msgid "Cell size used for the 2D hash grid that [VisibilityNotifier2D] uses."
+msgstr ""
+
#: doc/classes/ProximityGroup3D.xml:4 doc/classes/ProximityGroup3D.xml:7
msgid "General-purpose proximity detection node."
msgstr ""
@@ -40851,11 +40970,11 @@ msgstr ""
#: doc/classes/RenderingServer.xml:7
msgid ""
-"Server for anything visible. The visual server is the API backend for "
+"Server for anything visible. The rendering server is the API backend for "
"everything visible. The whole scene system mounts on it to display.\n"
-"The visual server is completely opaque, the internals are entirely "
+"The rendering server is completely opaque, the internals are entirely "
"implementation specific and cannot be accessed.\n"
-"The visual server can be used to bypass the scene system entirely.\n"
+"The rendering server can be used to bypass the scene system entirely.\n"
"Resources are created using the [code]*_create[/code] functions.\n"
"All objects are drawn to a viewport. You can use the [Viewport] attached to "
"the [SceneTree] or you can create one yourself with [method "
@@ -40863,10 +40982,10 @@ msgid ""
"canvas needs to be attached to the viewport using [method "
"viewport_set_scenario] or [method viewport_attach_canvas].\n"
"In 3D, all visual objects must be associated with a scenario. The scenario "
-"is a visual representation of the world. If accessing the visual server from "
-"a running game, the scenario can be accessed from the scene tree from any "
-"[Node3D] node with [method Node3D.get_world]. Otherwise, a scenario can be "
-"created with [method scenario_create].\n"
+"is a visual representation of the world. If accessing the rendering server "
+"from a running game, the scenario can be accessed from the scene tree from "
+"any [Node3D] node with [method Node3D.get_world]. Otherwise, a scenario can "
+"be created with [method scenario_create].\n"
"Similarly in 2D, a canvas is needed to draw all canvas items.\n"
"In 3D, all visible objects are comprised of a resource and an instance. A "
"resource can be a mesh, a particle system, a light, or any other 3D object. "
@@ -41292,42 +41411,42 @@ msgstr ""
msgid "Returns the id of a white texture. Creates one if none exists."
msgstr ""
-#: doc/classes/RenderingServer.xml:954
+#: doc/classes/RenderingServer.xml:1006
msgid ""
"Returns [code]true[/code] if changes have been made to the RenderingServer's "
"data. [method force_draw] is usually called if this happens."
msgstr ""
-#: doc/classes/RenderingServer.xml:963
+#: doc/classes/RenderingServer.xml:1015
msgid "Not yet implemented. Always returns [code]false[/code]."
msgstr ""
-#: doc/classes/RenderingServer.xml:972
+#: doc/classes/RenderingServer.xml:1024
msgid ""
"Returns [code]true[/code] if the OS supports a certain feature. Features "
"might be [code]s3tc[/code], [code]etc[/code], [code]etc2[/code] and "
"[code]pvrtc[/code]."
msgstr ""
-#: doc/classes/RenderingServer.xml:985
+#: doc/classes/RenderingServer.xml:1037
msgid ""
"Sets up [ImmediateGeometry3D] internals to prepare for drawing. Equivalent "
"to [method ImmediateGeometry3D.begin]."
msgstr ""
-#: doc/classes/RenderingServer.xml:994
+#: doc/classes/RenderingServer.xml:1046
msgid ""
"Clears everything that was set up between [method immediate_begin] and "
"[method immediate_end]. Equivalent to [method ImmediateGeometry3D.clear]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1005
+#: doc/classes/RenderingServer.xml:1057
msgid ""
"Sets the color to be used with next vertex. Equivalent to [method "
"ImmediateGeometry3D.set_color]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1012
+#: doc/classes/RenderingServer.xml:1064
msgid ""
"Creates an immediate geometry and adds it to the RenderingServer. It can be "
"accessed with the RID that is returned. This RID will be used in all "
@@ -41338,78 +41457,78 @@ msgid ""
"[method instance_set_base] using the returned RID."
msgstr ""
-#: doc/classes/RenderingServer.xml:1023
+#: doc/classes/RenderingServer.xml:1075
msgid ""
"Ends drawing the [ImmediateGeometry3D] and displays it. Equivalent to "
"[method ImmediateGeometry3D.end]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1032
+#: doc/classes/RenderingServer.xml:1084
msgid "Returns the material assigned to the [ImmediateGeometry3D]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1043
+#: doc/classes/RenderingServer.xml:1095
msgid ""
"Sets the normal to be used with next vertex. Equivalent to [method "
"ImmediateGeometry3D.set_normal]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1054
+#: doc/classes/RenderingServer.xml:1106
msgid "Sets the material to be used to draw the [ImmediateGeometry3D]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1065
+#: doc/classes/RenderingServer.xml:1117
msgid ""
"Sets the tangent to be used with next vertex. Equivalent to [method "
"ImmediateGeometry3D.set_tangent]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1076
+#: doc/classes/RenderingServer.xml:1128
msgid ""
"Sets the UV to be used with next vertex. Equivalent to [method "
"ImmediateGeometry3D.set_uv]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1087
+#: doc/classes/RenderingServer.xml:1139
msgid ""
"Sets the UV2 to be used with next vertex. Equivalent to [method "
"ImmediateGeometry3D.set_uv2]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1098
+#: doc/classes/RenderingServer.xml:1150
msgid ""
"Adds the next vertex using the information provided in advance. Equivalent "
"to [method ImmediateGeometry3D.add_vertex]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1109
+#: doc/classes/RenderingServer.xml:1161
msgid ""
"Adds the next vertex using the information provided in advance. This is a "
"helper class that calls [method immediate_vertex] under the hood. Equivalent "
"to [method ImmediateGeometry3D.add_vertex]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1116
+#: doc/classes/RenderingServer.xml:1168
msgid ""
-"Initializes the visual server. This function is called internally by "
+"Initializes the rendering server. This function is called internally by "
"platform-dependent code during engine initialization. If called from a "
"running game, it will not do anything."
msgstr ""
-#: doc/classes/RenderingServer.xml:1127
+#: doc/classes/RenderingServer.xml:1179
msgid ""
"Attaches a unique Object ID to instance. Object ID must be attached to "
"instance for proper culling with [method instances_cull_aabb], [method "
"instances_cull_convex], and [method instances_cull_ray]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1138
+#: doc/classes/RenderingServer.xml:1190
msgid ""
"Attaches a skeleton to an instance. Removes the previous skeleton from the "
"instance."
msgstr ""
-#: doc/classes/RenderingServer.xml:1145
+#: doc/classes/RenderingServer.xml:1197
msgid ""
"Creates a visual instance and adds it to the RenderingServer. It can be "
"accessed with the RID that is returned. This RID will be used in all "
@@ -41421,7 +41540,7 @@ msgid ""
"instance to be visible in the scenario using [method instance_set_base]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1158
+#: doc/classes/RenderingServer.xml:1210
msgid ""
"Creates a visual instance, adds it to the RenderingServer, and sets both "
"base and scenario. It can be accessed with the RID that is returned. This "
@@ -41430,31 +41549,31 @@ msgid ""
"RenderingServer's [method free_rid] static method."
msgstr ""
-#: doc/classes/RenderingServer.xml:1170 doc/classes/RenderingServer.xml:1198
-#: doc/classes/RenderingServer.xml:1488
+#: doc/classes/RenderingServer.xml:1222 doc/classes/RenderingServer.xml:1250
+#: doc/classes/RenderingServer.xml:1540
msgid "Not implemented in Godot 3.x."
msgstr ""
-#: doc/classes/RenderingServer.xml:1181
+#: doc/classes/RenderingServer.xml:1233
msgid ""
"Sets the shadow casting setting to one of [enum ShadowCastingSetting]. "
"Equivalent to [member GeometryInstance3D.cast_shadow]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1211
+#: doc/classes/RenderingServer.xml:1263
msgid ""
"Sets the flag for a given [enum InstanceFlags]. See [enum InstanceFlags] for "
"more details."
msgstr ""
-#: doc/classes/RenderingServer.xml:1222
+#: doc/classes/RenderingServer.xml:1274
msgid ""
"Sets a material that will override the material for all surfaces on the mesh "
"associated with this instance. Equivalent to [member GeometryInstance3D."
"material_override]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1233
+#: doc/classes/RenderingServer.xml:1285
msgid ""
"Sets the base of the instance. A base can be any of the 3D objects that are "
"created in the RenderingServer that can be displayed. For example, any of "
@@ -41463,62 +41582,62 @@ msgid ""
"be set as the base of an instance in order to be displayed in the scenario."
msgstr ""
-#: doc/classes/RenderingServer.xml:1246
+#: doc/classes/RenderingServer.xml:1298
msgid "Sets the weight for a given blend shape associated with this instance."
msgstr ""
-#: doc/classes/RenderingServer.xml:1257
+#: doc/classes/RenderingServer.xml:1309
msgid ""
"Sets a custom AABB to use when culling objects from the view frustum. "
"Equivalent to [method GeometryInstance3D.set_custom_aabb]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1268
+#: doc/classes/RenderingServer.xml:1320
msgid "Function not implemented in Godot 3.x."
msgstr ""
-#: doc/classes/RenderingServer.xml:1279
+#: doc/classes/RenderingServer.xml:1331
msgid ""
"Sets a margin to increase the size of the AABB when culling objects from the "
"view frustum. This allows you avoid culling objects that fall outside the "
"view frustum. Equivalent to [member GeometryInstance3D.extra_cull_margin]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1290
+#: doc/classes/RenderingServer.xml:1342
msgid ""
"Sets the render layers that this instance will be drawn to. Equivalent to "
"[member VisualInstance3D.layers]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1301
+#: doc/classes/RenderingServer.xml:1353
msgid ""
"Sets the scenario that the instance is in. The scenario is the 3D world that "
"the objects will be displayed in."
msgstr ""
-#: doc/classes/RenderingServer.xml:1314
+#: doc/classes/RenderingServer.xml:1366
msgid ""
"Sets the material of a specific surface. Equivalent to [method "
"MeshInstance3D.set_surface_material]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1325
+#: doc/classes/RenderingServer.xml:1377
msgid ""
"Sets the world space transform of the instance. Equivalent to [member Node3D."
"transform]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1338
+#: doc/classes/RenderingServer.xml:1390
msgid "Sets the lightmap to use with this instance."
msgstr ""
-#: doc/classes/RenderingServer.xml:1349
+#: doc/classes/RenderingServer.xml:1401
msgid ""
"Sets whether an instance is drawn or not. Equivalent to [member Node3D."
"visible]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1360
+#: doc/classes/RenderingServer.xml:1412
msgid ""
"Returns an array of object IDs intersecting with the provided AABB. Only "
"visual 3D nodes are considered, such as [MeshInstance3D] or "
@@ -41530,7 +41649,7 @@ msgid ""
"game use cases, prefer physics collision."
msgstr ""
-#: doc/classes/RenderingServer.xml:1372
+#: doc/classes/RenderingServer.xml:1424
msgid ""
"Returns an array of object IDs intersecting with the provided convex shape. "
"Only visual 3D nodes are considered, such as [MeshInstance3D] or "
@@ -41542,7 +41661,7 @@ msgid ""
"game use cases, prefer physics collision."
msgstr ""
-#: doc/classes/RenderingServer.xml:1386
+#: doc/classes/RenderingServer.xml:1438
msgid ""
"Returns an array of object IDs intersecting with the provided 3D ray. Only "
"visual 3D nodes are considered, such as [MeshInstance3D] or "
@@ -41554,58 +41673,58 @@ msgid ""
"game use cases, prefer physics collision."
msgstr ""
-#: doc/classes/RenderingServer.xml:1398
+#: doc/classes/RenderingServer.xml:1450
msgid ""
"If [code]true[/code], this directional light will blend between shadow map "
"splits resulting in a smoother transition between them. Equivalent to "
"[member DirectionalLight3D.directional_shadow_blend_splits]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1409
+#: doc/classes/RenderingServer.xml:1461
msgid ""
"Sets the shadow depth range mode for this directional light. Equivalent to "
"[member DirectionalLight3D.directional_shadow_depth_range]. See [enum "
"LightDirectionalShadowDepthRangeMode] for options."
msgstr ""
-#: doc/classes/RenderingServer.xml:1420
+#: doc/classes/RenderingServer.xml:1472
msgid ""
"Sets the shadow mode for this directional light. Equivalent to [member "
"DirectionalLight3D.directional_shadow_mode]. See [enum "
"LightDirectionalShadowMode] for options."
msgstr ""
-#: doc/classes/RenderingServer.xml:1431
+#: doc/classes/RenderingServer.xml:1483
msgid ""
"Sets whether to use a dual paraboloid or a cubemap for the shadow map. Dual "
"paraboloid is faster but may suffer from artifacts. Equivalent to [member "
"OmniLight3D.omni_shadow_mode]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1442
+#: doc/classes/RenderingServer.xml:1494
msgid ""
"Sets the color of the light. Equivalent to [member Light3D.light_color]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1453
+#: doc/classes/RenderingServer.xml:1505
msgid ""
"Sets the cull mask for this Light3D. Lights only affect objects in the "
"selected layers. Equivalent to [member Light3D.light_cull_mask]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1464
+#: doc/classes/RenderingServer.xml:1516
msgid ""
"If [code]true[/code], light will subtract light instead of adding light. "
"Equivalent to [member Light3D.light_negative]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1477
+#: doc/classes/RenderingServer.xml:1529
msgid ""
"Sets the specified light parameter. See [enum LightParam] for options. "
"Equivalent to [method Light3D.set_param]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1499
+#: doc/classes/RenderingServer.xml:1551
msgid ""
"If [code]true[/code], reverses the backface culling of the mesh. This can be "
"useful when you have a flat mesh that has a light behind it. If you need to "
@@ -41614,23 +41733,23 @@ msgid ""
"to [member Light3D.shadow_reverse_cull_face]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1510
+#: doc/classes/RenderingServer.xml:1562
msgid ""
"If [code]true[/code], light will cast shadows. Equivalent to [member Light3D."
"shadow_enabled]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1521
+#: doc/classes/RenderingServer.xml:1573
msgid ""
"Sets the color of the shadow cast by the light. Equivalent to [member "
"Light3D.shadow_color]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1532
+#: doc/classes/RenderingServer.xml:1584
msgid "Sets whether GI probes capture light information from this light."
msgstr ""
-#: doc/classes/RenderingServer.xml:1539
+#: doc/classes/RenderingServer.xml:1591
msgid ""
"Creates a lightmap capture and adds it to the RenderingServer. It can be "
"accessed with the RID that is returned. This RID will be used in all "
@@ -41641,54 +41760,54 @@ msgid ""
"[method instance_set_base] using the returned RID."
msgstr ""
-#: doc/classes/RenderingServer.xml:1550
+#: doc/classes/RenderingServer.xml:1602
msgid "Returns the size of the lightmap capture area."
msgstr ""
-#: doc/classes/RenderingServer.xml:1559
+#: doc/classes/RenderingServer.xml:1611
msgid "Returns the energy multiplier used by the lightmap capture."
msgstr ""
-#: doc/classes/RenderingServer.xml:1568
+#: doc/classes/RenderingServer.xml:1620
msgid "Returns the octree used by the lightmap capture."
msgstr ""
-#: doc/classes/RenderingServer.xml:1577
+#: doc/classes/RenderingServer.xml:1629
msgid ""
"Returns the cell subdivision amount used by this lightmap capture's octree."
msgstr ""
-#: doc/classes/RenderingServer.xml:1586
+#: doc/classes/RenderingServer.xml:1638
msgid "Returns the cell transform for this lightmap capture's octree."
msgstr ""
-#: doc/classes/RenderingServer.xml:1597
+#: doc/classes/RenderingServer.xml:1649
msgid "Sets the size of the area covered by the lightmap capture."
msgstr ""
-#: doc/classes/RenderingServer.xml:1608
+#: doc/classes/RenderingServer.xml:1660
msgid "Sets the energy multiplier for this lightmap capture."
msgstr ""
-#: doc/classes/RenderingServer.xml:1619
+#: doc/classes/RenderingServer.xml:1671
msgid "Sets the octree to be used by this lightmap capture."
msgstr ""
-#: doc/classes/RenderingServer.xml:1630
+#: doc/classes/RenderingServer.xml:1682
msgid "Sets the subdivision level of this lightmap capture's octree."
msgstr ""
-#: doc/classes/RenderingServer.xml:1641
+#: doc/classes/RenderingServer.xml:1693
msgid "Sets the octree cell transform for this lightmap capture's octree."
msgstr ""
-#: doc/classes/RenderingServer.xml:1654
+#: doc/classes/RenderingServer.xml:1706
msgid ""
"Returns a mesh of a sphere with the given amount of horizontal and vertical "
"subdivisions."
msgstr ""
-#: doc/classes/RenderingServer.xml:1661
+#: doc/classes/RenderingServer.xml:1713
msgid ""
"Creates an empty material and adds it to the RenderingServer. It can be "
"accessed with the RID that is returned. This RID will be used in all "
@@ -41697,31 +41816,31 @@ msgid ""
"RenderingServer's [method free_rid] static method."
msgstr ""
-#: doc/classes/RenderingServer.xml:1673
+#: doc/classes/RenderingServer.xml:1725
msgid "Returns the value of a certain material's parameter."
msgstr ""
-#: doc/classes/RenderingServer.xml:1684
+#: doc/classes/RenderingServer.xml:1736
msgid "Sets an object's next material."
msgstr ""
-#: doc/classes/RenderingServer.xml:1697
+#: doc/classes/RenderingServer.xml:1749
msgid "Sets a material's parameter."
msgstr ""
-#: doc/classes/RenderingServer.xml:1708
+#: doc/classes/RenderingServer.xml:1760
msgid "Sets a material's render priority."
msgstr ""
-#: doc/classes/RenderingServer.xml:1719
+#: doc/classes/RenderingServer.xml:1771
msgid "Sets a shader material's shader."
msgstr ""
-#: doc/classes/RenderingServer.xml:1748
+#: doc/classes/RenderingServer.xml:1800
msgid "Removes all surfaces from a mesh."
msgstr ""
-#: doc/classes/RenderingServer.xml:1755
+#: doc/classes/RenderingServer.xml:1807
msgid ""
"Creates a new mesh and adds it to the RenderingServer. It can be accessed "
"with the RID that is returned. This RID will be used in all [code]mesh_*[/"
@@ -41732,58 +41851,58 @@ msgid ""
"instance_set_base] using the returned RID."
msgstr ""
-#: doc/classes/RenderingServer.xml:1766
+#: doc/classes/RenderingServer.xml:1818
msgid "Returns a mesh's blend shape count."
msgstr ""
-#: doc/classes/RenderingServer.xml:1775
+#: doc/classes/RenderingServer.xml:1827
msgid "Returns a mesh's blend shape mode."
msgstr ""
-#: doc/classes/RenderingServer.xml:1784
+#: doc/classes/RenderingServer.xml:1836
msgid "Returns a mesh's custom aabb."
msgstr ""
-#: doc/classes/RenderingServer.xml:1793
+#: doc/classes/RenderingServer.xml:1845
msgid "Returns a mesh's number of surfaces."
msgstr ""
-#: doc/classes/RenderingServer.xml:1804
+#: doc/classes/RenderingServer.xml:1856
msgid "Sets a mesh's blend shape mode."
msgstr ""
-#: doc/classes/RenderingServer.xml:1815
+#: doc/classes/RenderingServer.xml:1867
msgid "Sets a mesh's custom aabb."
msgstr ""
-#: doc/classes/RenderingServer.xml:1826
+#: doc/classes/RenderingServer.xml:1878
msgid "Returns a mesh's surface's buffer arrays."
msgstr ""
-#: doc/classes/RenderingServer.xml:1837
+#: doc/classes/RenderingServer.xml:1889
msgid "Returns a mesh's surface's arrays for blend shapes."
msgstr ""
-#: doc/classes/RenderingServer.xml:1852 doc/classes/RenderingServer.xml:1865
+#: doc/classes/RenderingServer.xml:1904 doc/classes/RenderingServer.xml:1917
msgid "Function is unused in Godot 3.x."
msgstr ""
-#: doc/classes/RenderingServer.xml:1876
+#: doc/classes/RenderingServer.xml:1928
msgid "Returns a mesh's surface's material."
msgstr ""
-#: doc/classes/RenderingServer.xml:1889
+#: doc/classes/RenderingServer.xml:1941
msgid "Sets a mesh's surface's material."
msgstr ""
-#: doc/classes/RenderingServer.xml:1904
+#: doc/classes/RenderingServer.xml:1956
msgid ""
"Updates a specific region of a vertex buffer for the specified surface. "
"Warning: this function alters the vertex buffer directly with no safety "
"mechanisms, you can easily corrupt your mesh."
msgstr ""
-#: doc/classes/RenderingServer.xml:1927
+#: doc/classes/RenderingServer.xml:1979
msgid ""
"Creates a new multimesh on the RenderingServer and returns an [RID] handle. "
"This RID will be used in all [code]multimesh_*[/code] RenderingServer "
@@ -41794,82 +41913,82 @@ msgid ""
"instance_set_base] using the returned RID."
msgstr ""
-#: doc/classes/RenderingServer.xml:1938
+#: doc/classes/RenderingServer.xml:1990
msgid ""
"Calculates and returns the axis-aligned bounding box that encloses all "
"instances within the multimesh."
msgstr ""
-#: doc/classes/RenderingServer.xml:1955
+#: doc/classes/RenderingServer.xml:2007
msgid "Returns the number of instances allocated for this multimesh."
msgstr ""
-#: doc/classes/RenderingServer.xml:1964
+#: doc/classes/RenderingServer.xml:2016
msgid ""
"Returns the RID of the mesh that will be used in drawing this multimesh."
msgstr ""
-#: doc/classes/RenderingServer.xml:1973
+#: doc/classes/RenderingServer.xml:2025
msgid "Returns the number of visible instances for this multimesh."
msgstr ""
-#: doc/classes/RenderingServer.xml:1984
+#: doc/classes/RenderingServer.xml:2036
msgid "Returns the color by which the specified instance will be modulated."
msgstr ""
-#: doc/classes/RenderingServer.xml:1995
+#: doc/classes/RenderingServer.xml:2047
msgid "Returns the custom data associated with the specified instance."
msgstr ""
-#: doc/classes/RenderingServer.xml:2006
+#: doc/classes/RenderingServer.xml:2058
msgid "Returns the [Transform] of the specified instance."
msgstr ""
-#: doc/classes/RenderingServer.xml:2017
+#: doc/classes/RenderingServer.xml:2069
msgid ""
"Returns the [Transform2D] of the specified instance. For use when the "
"multimesh is set to use 2D transforms."
msgstr ""
-#: doc/classes/RenderingServer.xml:2030
+#: doc/classes/RenderingServer.xml:2082
msgid ""
"Sets the color by which this instance will be modulated. Equivalent to "
"[method MultiMesh.set_instance_color]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2043
+#: doc/classes/RenderingServer.xml:2095
msgid ""
"Sets the custom data for this instance. Custom data is passed as a [Color], "
"but is interpreted as a [code]vec4[/code] in the shader. Equivalent to "
"[method MultiMesh.set_instance_custom_data]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2056
+#: doc/classes/RenderingServer.xml:2108
msgid ""
"Sets the [Transform] for this instance. Equivalent to [method MultiMesh."
"set_instance_transform]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2069
+#: doc/classes/RenderingServer.xml:2121
msgid ""
"Sets the [Transform2D] for this instance. For use when multimesh is used in "
"2D. Equivalent to [method MultiMesh.set_instance_transform_2d]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2090
+#: doc/classes/RenderingServer.xml:2142
msgid ""
"Sets the mesh to be drawn by the multimesh. Equivalent to [member MultiMesh."
"mesh]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2101
+#: doc/classes/RenderingServer.xml:2153
msgid ""
"Sets the number of instances visible at a given time. If -1, all instances "
"that have been allocated are drawn. Equivalent to [member MultiMesh."
"visible_instance_count]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2108
+#: doc/classes/RenderingServer.xml:2160
msgid ""
"Creates a new omni light and adds it to the RenderingServer. It can be "
"accessed with the RID that is returned. This RID can be used in most "
@@ -41880,7 +41999,7 @@ msgid ""
"instance_set_base] using the returned RID."
msgstr ""
-#: doc/classes/RenderingServer.xml:2117
+#: doc/classes/RenderingServer.xml:2169
msgid ""
"Creates a particle system and adds it to the RenderingServer. It can be "
"accessed with the RID that is returned. This RID will be used in all "
@@ -41891,23 +42010,23 @@ msgid ""
"instance_set_base] using the returned RID."
msgstr ""
-#: doc/classes/RenderingServer.xml:2128
+#: doc/classes/RenderingServer.xml:2180
msgid ""
"Calculates and returns the axis-aligned bounding box that contains all the "
"particles. Equivalent to [method GPUParticles3D.capture_aabb]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2137
+#: doc/classes/RenderingServer.xml:2189
msgid "Returns [code]true[/code] if particles are currently set to emitting."
msgstr ""
-#: doc/classes/RenderingServer.xml:2146
+#: doc/classes/RenderingServer.xml:2198
msgid ""
"Returns [code]true[/code] if particles are not emitting and particles are "
"set to inactive."
msgstr ""
-#: doc/classes/RenderingServer.xml:2155
+#: doc/classes/RenderingServer.xml:2207
msgid ""
"Add particle system to list of particle systems that need to be updated. "
"Update will take place on the next frame, or on the next call to [method "
@@ -41915,121 +42034,121 @@ msgid ""
"instances_cull_ray]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2164
+#: doc/classes/RenderingServer.xml:2216
msgid ""
"Reset the particles on the next update. Equivalent to [method GPUParticles3D."
"restart]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2175
+#: doc/classes/RenderingServer.xml:2227
msgid ""
"Sets the number of particles to be drawn and allocates the memory for them. "
"Equivalent to [member GPUParticles3D.amount]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2186
+#: doc/classes/RenderingServer.xml:2238
msgid ""
"Sets a custom axis-aligned bounding box for the particle system. Equivalent "
"to [member GPUParticles3D.visibility_aabb]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2197
+#: doc/classes/RenderingServer.xml:2249
msgid ""
"Sets the draw order of the particles to one of the named enums from [enum "
"ParticlesDrawOrder]. See [enum ParticlesDrawOrder] for options. Equivalent "
"to [member GPUParticles3D.draw_order]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2210
+#: doc/classes/RenderingServer.xml:2262
msgid ""
"Sets the mesh to be used for the specified draw pass. Equivalent to [member "
"GPUParticles3D.draw_pass_1], [member GPUParticles3D.draw_pass_2], [member "
"GPUParticles3D.draw_pass_3], and [member GPUParticles3D.draw_pass_4]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2221
+#: doc/classes/RenderingServer.xml:2273
msgid ""
"Sets the number of draw passes to use. Equivalent to [member GPUParticles3D."
"draw_passes]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2232
+#: doc/classes/RenderingServer.xml:2284
msgid ""
"Sets the [Transform] that will be used by the particles when they first emit."
msgstr ""
-#: doc/classes/RenderingServer.xml:2243
+#: doc/classes/RenderingServer.xml:2295
msgid ""
"If [code]true[/code], particles will emit over time. Setting to false does "
"not reset the particles, but only stops their emission. Equivalent to "
"[member GPUParticles3D.emitting]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2254
+#: doc/classes/RenderingServer.xml:2306
msgid ""
"Sets the explosiveness ratio. Equivalent to [member GPUParticles3D."
"explosiveness]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2265
+#: doc/classes/RenderingServer.xml:2317
msgid ""
"Sets the frame rate that the particle system rendering will be fixed to. "
"Equivalent to [member GPUParticles3D.fixed_fps]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2276
+#: doc/classes/RenderingServer.xml:2328
msgid ""
"If [code]true[/code], uses fractional delta which smooths the movement of "
"the particles. Equivalent to [member GPUParticles3D.fract_delta]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2287
+#: doc/classes/RenderingServer.xml:2339
msgid ""
"Sets the lifetime of each particle in the system. Equivalent to [member "
"GPUParticles3D.lifetime]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2298
+#: doc/classes/RenderingServer.xml:2350
msgid ""
"If [code]true[/code], particles will emit once and then stop. Equivalent to "
"[member GPUParticles3D.one_shot]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2309
+#: doc/classes/RenderingServer.xml:2361
msgid ""
"Sets the preprocess time for the particles animation. This lets you delay "
"starting an animation until after the particles have begun emitting. "
"Equivalent to [member GPUParticles3D.preprocess]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2320
+#: doc/classes/RenderingServer.xml:2372
msgid ""
"Sets the material for processing the particles. Note: this is not the "
"material used to draw the materials. Equivalent to [member GPUParticles3D."
"process_material]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2331
+#: doc/classes/RenderingServer.xml:2383
msgid ""
"Sets the emission randomness ratio. This randomizes the emission of "
"particles within their phase. Equivalent to [member GPUParticles3D."
"randomness]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2342
+#: doc/classes/RenderingServer.xml:2394
msgid ""
"Sets the speed scale of the particle system. Equivalent to [member "
"GPUParticles3D.speed_scale]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2353
+#: doc/classes/RenderingServer.xml:2405
msgid ""
"If [code]true[/code], particles use local coordinates. If [code]false[/code] "
"they use global coordinates. Equivalent to [member GPUParticles3D."
"local_coords]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2360
+#: doc/classes/RenderingServer.xml:2412
msgid ""
"Creates a reflection probe and adds it to the RenderingServer. It can be "
"accessed with the RID that is returned. This RID will be used in all "
@@ -42040,59 +42159,59 @@ msgid ""
"[method instance_set_base] using the returned RID."
msgstr ""
-#: doc/classes/RenderingServer.xml:2373
+#: doc/classes/RenderingServer.xml:2425
msgid ""
"If [code]true[/code], reflections will ignore sky contribution. Equivalent "
"to [member ReflectionProbe.interior_enable]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2384
+#: doc/classes/RenderingServer.xml:2436
msgid ""
"Sets the render cull mask for this reflection probe. Only instances with a "
"matching cull mask will be rendered by this probe. Equivalent to [member "
"ReflectionProbe.cull_mask]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2395
+#: doc/classes/RenderingServer.xml:2447
msgid ""
"If [code]true[/code], uses box projection. This can make reflections look "
"more correct in certain situations. Equivalent to [member ReflectionProbe."
"box_projection]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2406
+#: doc/classes/RenderingServer.xml:2458
msgid ""
"If [code]true[/code], computes shadows in the reflection probe. This makes "
"the reflection much slower to compute. Equivalent to [member ReflectionProbe."
"enable_shadows]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2417
+#: doc/classes/RenderingServer.xml:2469
msgid ""
"Sets the size of the area that the reflection probe will capture. Equivalent "
"to [member ReflectionProbe.extents]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2428
+#: doc/classes/RenderingServer.xml:2480
msgid ""
"Sets the intensity of the reflection probe. Intensity modulates the strength "
"of the reflection. Equivalent to [member ReflectionProbe.intensity]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2439
+#: doc/classes/RenderingServer.xml:2491
msgid ""
"Sets the ambient light color for this reflection probe when set to interior "
"mode. Equivalent to [member ReflectionProbe.interior_ambient_color]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2450
+#: doc/classes/RenderingServer.xml:2502
msgid ""
"Sets the energy multiplier for this reflection probes ambient light "
"contribution when set to interior mode. Equivalent to [member "
"ReflectionProbe.interior_ambient_energy]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2461
+#: doc/classes/RenderingServer.xml:2513
msgid ""
"Sets the contribution value for how much the reflection affects the ambient "
"light for this reflection probe when set to interior mode. Useful so that "
@@ -42100,25 +42219,25 @@ msgid ""
"ReflectionProbe.interior_ambient_contrib]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2472
+#: doc/classes/RenderingServer.xml:2524
msgid ""
"Sets the max distance away from the probe an object can be before it is "
"culled. Equivalent to [member ReflectionProbe.max_distance]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2483
+#: doc/classes/RenderingServer.xml:2535
msgid ""
"Sets the origin offset to be used when this reflection probe is in box "
"project mode. Equivalent to [member ReflectionProbe.origin_offset]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2494
+#: doc/classes/RenderingServer.xml:2546
msgid ""
"Sets how often the reflection probe updates. Can either be once or every "
"frame. See [enum ReflectionProbeUpdateMode] for options."
msgstr ""
-#: doc/classes/RenderingServer.xml:2507
+#: doc/classes/RenderingServer.xml:2559
msgid ""
"Schedules a callback to the corresponding named [code]method[/code] on "
"[code]where[/code] after a frame has been drawn.\n"
@@ -42126,7 +42245,7 @@ msgid ""
"[code]userdata[/code]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2515
+#: doc/classes/RenderingServer.xml:2567
msgid ""
"Creates a scenario and adds it to the RenderingServer. It can be accessed "
"with the RID that is returned. This RID will be used in all "
@@ -42136,24 +42255,24 @@ msgid ""
"The scenario is the 3D world that all the visual instances exist in."
msgstr ""
-#: doc/classes/RenderingServer.xml:2528
+#: doc/classes/RenderingServer.xml:2580
msgid ""
"Sets the [enum ScenarioDebugMode] for this scenario. See [enum "
"ScenarioDebugMode] for options."
msgstr ""
-#: doc/classes/RenderingServer.xml:2539
+#: doc/classes/RenderingServer.xml:2591
msgid "Sets the environment that will be used with this scenario."
msgstr ""
-#: doc/classes/RenderingServer.xml:2550
+#: doc/classes/RenderingServer.xml:2602
msgid ""
"Sets the fallback environment to be used by this scenario. The fallback "
"environment is used if no environment is set. Internally, this is used by "
"the editor to provide a default environment."
msgstr ""
-#: doc/classes/RenderingServer.xml:2565
+#: doc/classes/RenderingServer.xml:2617
msgid ""
"Sets a boot image. The color defines the background color. If [code]scale[/"
"code] is [code]true[/code], the image will be scaled to fit the screen size. "
@@ -42162,19 +42281,19 @@ msgid ""
"the image will be scaled with nearest-neighbor interpolation."
msgstr ""
-#: doc/classes/RenderingServer.xml:2574
+#: doc/classes/RenderingServer.xml:2626
msgid ""
"If [code]true[/code], the engine will generate wireframes for use with the "
"wireframe debug mode."
msgstr ""
-#: doc/classes/RenderingServer.xml:2583
+#: doc/classes/RenderingServer.xml:2635
msgid ""
"Sets the default clear color which is used when a specific clear color has "
"not been selected."
msgstr ""
-#: doc/classes/RenderingServer.xml:2590
+#: doc/classes/RenderingServer.xml:2642
msgid ""
"Creates an empty shader and adds it to the RenderingServer. It can be "
"accessed with the RID that is returned. This RID will be used in all "
@@ -42183,47 +42302,47 @@ msgid ""
"RenderingServer's [method free_rid] static method."
msgstr ""
-#: doc/classes/RenderingServer.xml:2600
+#: doc/classes/RenderingServer.xml:2652
msgid "Returns a shader's code."
msgstr ""
-#: doc/classes/RenderingServer.xml:2611
+#: doc/classes/RenderingServer.xml:2663
msgid "Returns a default texture from a shader searched by name."
msgstr ""
-#: doc/classes/RenderingServer.xml:2630
+#: doc/classes/RenderingServer.xml:2682
msgid "Returns the parameters of a shader."
msgstr ""
-#: doc/classes/RenderingServer.xml:2641
+#: doc/classes/RenderingServer.xml:2693
msgid "Sets a shader's code."
msgstr ""
-#: doc/classes/RenderingServer.xml:2654
+#: doc/classes/RenderingServer.xml:2706
msgid "Sets a shader's default texture. Overwrites the texture given by name."
msgstr ""
-#: doc/classes/RenderingServer.xml:2667
+#: doc/classes/RenderingServer.xml:2719
msgid "Allocates the GPU buffers for this skeleton."
msgstr ""
-#: doc/classes/RenderingServer.xml:2678
+#: doc/classes/RenderingServer.xml:2730
msgid "Returns the [Transform] set for a specific bone of this skeleton."
msgstr ""
-#: doc/classes/RenderingServer.xml:2689
+#: doc/classes/RenderingServer.xml:2741
msgid "Returns the [Transform2D] set for a specific bone of this skeleton."
msgstr ""
-#: doc/classes/RenderingServer.xml:2702
+#: doc/classes/RenderingServer.xml:2754
msgid "Sets the [Transform] for a specific bone of this skeleton."
msgstr ""
-#: doc/classes/RenderingServer.xml:2715
+#: doc/classes/RenderingServer.xml:2767
msgid "Sets the [Transform2D] for a specific bone of this skeleton."
msgstr ""
-#: doc/classes/RenderingServer.xml:2722
+#: doc/classes/RenderingServer.xml:2774
msgid ""
"Creates a skeleton and adds it to the RenderingServer. It can be accessed "
"with the RID that is returned. This RID will be used in all "
@@ -42232,11 +42351,11 @@ msgid ""
"RenderingServer's [method free_rid] static method."
msgstr ""
-#: doc/classes/RenderingServer.xml:2732
+#: doc/classes/RenderingServer.xml:2784
msgid "Returns the number of bones allocated for this skeleton."
msgstr ""
-#: doc/classes/RenderingServer.xml:2739
+#: doc/classes/RenderingServer.xml:2791
msgid ""
"Creates an empty sky and adds it to the RenderingServer. It can be accessed "
"with the RID that is returned. This RID will be used in all [code]sky_*[/"
@@ -42245,13 +42364,13 @@ msgid ""
"RenderingServer's [method free_rid] static method."
msgstr ""
-#: doc/classes/RenderingServer.xml:2751
+#: doc/classes/RenderingServer.xml:2803
msgid ""
"Sets the material that the sky uses to render the background and reflection "
"maps."
msgstr ""
-#: doc/classes/RenderingServer.xml:2758
+#: doc/classes/RenderingServer.xml:2810
msgid ""
"Creates a spot light and adds it to the RenderingServer. It can be accessed "
"with the RID that is returned. This RID can be used in most [code]light_*[/"
@@ -42262,15 +42381,15 @@ msgid ""
"instance_set_base] using the returned RID."
msgstr ""
-#: doc/classes/RenderingServer.xml:2787
+#: doc/classes/RenderingServer.xml:2839
msgid "Sets a viewport's camera."
msgstr ""
-#: doc/classes/RenderingServer.xml:2798
+#: doc/classes/RenderingServer.xml:2850
msgid "Sets a viewport's canvas."
msgstr ""
-#: doc/classes/RenderingServer.xml:2811
+#: doc/classes/RenderingServer.xml:2863
msgid ""
"Copies the viewport to a region of the screen specified by [code]rect[/"
"code]. If [method viewport_set_render_direct_to_screen] is [code]true[/"
@@ -42292,7 +42411,7 @@ msgid ""
"viewport_set_render_direct_to_screen]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2825
+#: doc/classes/RenderingServer.xml:2877
msgid ""
"Creates an empty viewport and adds it to the RenderingServer. It can be "
"accessed with the RID that is returned. This RID will be used in all "
@@ -42301,72 +42420,72 @@ msgid ""
"RenderingServer's [method free_rid] static method."
msgstr ""
-#: doc/classes/RenderingServer.xml:2837
+#: doc/classes/RenderingServer.xml:2889
msgid ""
"Returns a viewport's render information. For options, see the [enum "
"ViewportRenderInfo] constants."
msgstr ""
-#: doc/classes/RenderingServer.xml:2846
+#: doc/classes/RenderingServer.xml:2898
msgid "Returns the viewport's last rendered frame."
msgstr ""
-#: doc/classes/RenderingServer.xml:2857
+#: doc/classes/RenderingServer.xml:2909
msgid "Detaches a viewport from a canvas and vice versa."
msgstr ""
-#: doc/classes/RenderingServer.xml:2868
+#: doc/classes/RenderingServer.xml:2920
msgid "If [code]true[/code], sets the viewport active, else sets it inactive."
msgstr ""
-#: doc/classes/RenderingServer.xml:2883
+#: doc/classes/RenderingServer.xml:2935
msgid ""
"Sets the stacking order for a viewport's canvas.\n"
"[code]layer[/code] is the actual canvas layer, while [code]sublayer[/code] "
"specifies the stacking order of the canvas among those in the same layer."
msgstr ""
-#: doc/classes/RenderingServer.xml:2897
+#: doc/classes/RenderingServer.xml:2949
msgid "Sets the transformation of a viewport's canvas."
msgstr ""
-#: doc/classes/RenderingServer.xml:2908
+#: doc/classes/RenderingServer.xml:2960
msgid ""
"Sets the clear mode of a viewport. See [enum ViewportClearMode] for options."
msgstr ""
-#: doc/classes/RenderingServer.xml:2919
+#: doc/classes/RenderingServer.xml:2971
msgid ""
"Sets the debug draw mode of a viewport. See [enum ViewportDebugDraw] for "
"options."
msgstr ""
-#: doc/classes/RenderingServer.xml:2930
+#: doc/classes/RenderingServer.xml:2982
msgid ""
"If [code]true[/code], rendering of a viewport's environment is disabled."
msgstr ""
-#: doc/classes/RenderingServer.xml:2941
+#: doc/classes/RenderingServer.xml:2993
msgid "Sets the viewport's global transformation matrix."
msgstr ""
-#: doc/classes/RenderingServer.xml:2952
+#: doc/classes/RenderingServer.xml:3004
msgid "If [code]true[/code], the viewport's canvas is not rendered."
msgstr ""
-#: doc/classes/RenderingServer.xml:2963
+#: doc/classes/RenderingServer.xml:3015
msgid "Currently unimplemented in Godot 3.x."
msgstr ""
-#: doc/classes/RenderingServer.xml:2974
+#: doc/classes/RenderingServer.xml:3026
msgid "Sets the anti-aliasing mode. See [enum ViewportMSAA] for options."
msgstr ""
-#: doc/classes/RenderingServer.xml:2985
+#: doc/classes/RenderingServer.xml:3037
msgid "Sets the viewport's parent to another viewport."
msgstr ""
-#: doc/classes/RenderingServer.xml:2996
+#: doc/classes/RenderingServer.xml:3048
msgid ""
"If [code]true[/code], render the contents of the viewport directly to "
"screen. This allows a low-level optimization where you can skip drawing a "
@@ -42382,708 +42501,864 @@ msgid ""
"significantly larger than the window size."
msgstr ""
-#: doc/classes/RenderingServer.xml:3007
+#: doc/classes/RenderingServer.xml:3059
msgid ""
"Sets a viewport's scenario.\n"
"The scenario contains information about the [enum ScenarioDebugMode], "
"environment information, reflection atlas etc."
msgstr ""
-#: doc/classes/RenderingServer.xml:3021
+#: doc/classes/RenderingServer.xml:3073
msgid "Sets the shadow atlas quadrant's subdivision."
msgstr ""
-#: doc/classes/RenderingServer.xml:3032
+#: doc/classes/RenderingServer.xml:3084
msgid ""
"Sets the size of the shadow atlas's images (used for omni and spot lights). "
"The value will be rounded up to the nearest power of 2."
msgstr ""
-#: doc/classes/RenderingServer.xml:3045
+#: doc/classes/RenderingServer.xml:3097
msgid "Sets the viewport's width and height."
msgstr ""
-#: doc/classes/RenderingServer.xml:3056
+#: doc/classes/RenderingServer.xml:3108
msgid ""
"If [code]true[/code], the viewport renders its background as transparent."
msgstr ""
-#: doc/classes/RenderingServer.xml:3067
+#: doc/classes/RenderingServer.xml:3119
msgid ""
"Sets when the viewport should be updated. See [enum ViewportUpdateMode] "
"constants for options."
msgstr ""
-#: doc/classes/RenderingServer.xml:3078
+#: doc/classes/RenderingServer.xml:3130
msgid ""
"If [code]true[/code], the viewport uses augmented or virtual reality "
-"technologies. See [ARVRInterface]."
+"technologies. See [XRInterface]."
msgstr ""
-#: doc/classes/RenderingServer.xml:3085
+#: doc/classes/RenderingServer.xml:3137
msgid ""
"Emitted at the end of the frame, after the RenderingServer has finished "
"updating all the Viewports."
msgstr ""
-#: doc/classes/RenderingServer.xml:3090
+#: doc/classes/RenderingServer.xml:3142
msgid ""
"Emitted at the beginning of the frame, before the RenderingServer updates "
"all the Viewports."
msgstr ""
-#: doc/classes/RenderingServer.xml:3096
+#: doc/classes/RenderingServer.xml:3148
msgid "Marks an error that shows that the index array is empty."
msgstr ""
-#: doc/classes/RenderingServer.xml:3099
+#: doc/classes/RenderingServer.xml:3151
msgid "Number of weights/bones per vertex."
msgstr ""
-#: doc/classes/RenderingServer.xml:3102
+#: doc/classes/RenderingServer.xml:3154
msgid "The minimum Z-layer for canvas items."
msgstr ""
-#: doc/classes/RenderingServer.xml:3105
+#: doc/classes/RenderingServer.xml:3157
msgid "The maximum Z-layer for canvas items."
msgstr ""
-#: doc/classes/RenderingServer.xml:3108
+#: doc/classes/RenderingServer.xml:3160
msgid ""
"Max number of glow levels that can be used with glow post-process effect."
msgstr ""
-#: doc/classes/RenderingServer.xml:3111
+#: doc/classes/RenderingServer.xml:3163
msgid "Unused enum in Godot 3.x."
msgstr ""
-#: doc/classes/RenderingServer.xml:3114
-msgid "The minimum renderpriority of all materials."
-msgstr ""
-
-#: doc/classes/RenderingServer.xml:3117
-msgid "The maximum renderpriority of all materials."
-msgstr ""
-
-#: doc/classes/RenderingServer.xml:3138
+#: doc/classes/RenderingServer.xml:3184
msgid "Shader is a 3D shader."
msgstr ""
-#: doc/classes/RenderingServer.xml:3141
+#: doc/classes/RenderingServer.xml:3187
msgid "Shader is a 2D shader."
msgstr ""
-#: doc/classes/RenderingServer.xml:3144
+#: doc/classes/RenderingServer.xml:3190
msgid "Shader is a particle shader."
msgstr ""
-#: doc/classes/RenderingServer.xml:3147
+#: doc/classes/RenderingServer.xml:3193
msgid "Shader is a sky shader."
msgstr ""
-#: doc/classes/RenderingServer.xml:3150
+#: doc/classes/RenderingServer.xml:3196
msgid "Represents the size of the [enum ShaderMode] enum."
msgstr ""
-#: doc/classes/RenderingServer.xml:3153
+#: doc/classes/RenderingServer.xml:3199
+msgid "The minimum renderpriority of all materials."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3202
+msgid "The maximum renderpriority of all materials."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3205
msgid "Array is a vertex array."
msgstr ""
-#: doc/classes/RenderingServer.xml:3156
+#: doc/classes/RenderingServer.xml:3208
msgid "Array is a normal array."
msgstr ""
-#: doc/classes/RenderingServer.xml:3159
+#: doc/classes/RenderingServer.xml:3211
msgid "Array is a tangent array."
msgstr ""
-#: doc/classes/RenderingServer.xml:3162
+#: doc/classes/RenderingServer.xml:3214
msgid "Array is a color array."
msgstr ""
-#: doc/classes/RenderingServer.xml:3165
+#: doc/classes/RenderingServer.xml:3217
msgid "Array is an UV coordinates array."
msgstr ""
-#: doc/classes/RenderingServer.xml:3168
+#: doc/classes/RenderingServer.xml:3220
msgid "Array is an UV coordinates array for the second UV coordinates."
msgstr ""
-#: doc/classes/RenderingServer.xml:3171
+#: doc/classes/RenderingServer.xml:3223
msgid "Array contains bone information."
msgstr ""
-#: doc/classes/RenderingServer.xml:3174
+#: doc/classes/RenderingServer.xml:3226
msgid "Array is weight information."
msgstr ""
-#: doc/classes/RenderingServer.xml:3177
+#: doc/classes/RenderingServer.xml:3229
msgid "Array is index array."
msgstr ""
-#: doc/classes/RenderingServer.xml:3183
+#: doc/classes/RenderingServer.xml:3235
msgid "Flag used to mark a vertex array."
msgstr ""
-#: doc/classes/RenderingServer.xml:3186
+#: doc/classes/RenderingServer.xml:3238
msgid "Flag used to mark a normal array."
msgstr ""
-#: doc/classes/RenderingServer.xml:3189
+#: doc/classes/RenderingServer.xml:3241
msgid "Flag used to mark a tangent array."
msgstr ""
-#: doc/classes/RenderingServer.xml:3192
+#: doc/classes/RenderingServer.xml:3244
msgid "Flag used to mark a color array."
msgstr ""
-#: doc/classes/RenderingServer.xml:3195
+#: doc/classes/RenderingServer.xml:3247
msgid "Flag used to mark an UV coordinates array."
msgstr ""
-#: doc/classes/RenderingServer.xml:3198
+#: doc/classes/RenderingServer.xml:3250
msgid ""
"Flag used to mark an UV coordinates array for the second UV coordinates."
msgstr ""
-#: doc/classes/RenderingServer.xml:3201
+#: doc/classes/RenderingServer.xml:3253
msgid "Flag used to mark a bone information array."
msgstr ""
-#: doc/classes/RenderingServer.xml:3204
+#: doc/classes/RenderingServer.xml:3256
msgid "Flag used to mark a weights array."
msgstr ""
-#: doc/classes/RenderingServer.xml:3207
+#: doc/classes/RenderingServer.xml:3259
msgid "Flag used to mark an index array."
msgstr ""
-#: doc/classes/RenderingServer.xml:3236
+#: doc/classes/RenderingServer.xml:3288
msgid "Primitive to draw consists of points."
msgstr ""
-#: doc/classes/RenderingServer.xml:3239
+#: doc/classes/RenderingServer.xml:3291
msgid "Primitive to draw consists of lines."
msgstr ""
-#: doc/classes/RenderingServer.xml:3242
+#: doc/classes/RenderingServer.xml:3294
msgid "Primitive to draw consists of a line strip from start to end."
msgstr ""
-#: doc/classes/RenderingServer.xml:3245
+#: doc/classes/RenderingServer.xml:3297
msgid "Primitive to draw consists of triangles."
msgstr ""
-#: doc/classes/RenderingServer.xml:3248
+#: doc/classes/RenderingServer.xml:3300
msgid ""
"Primitive to draw consists of a triangle strip (the last 3 vertices are "
"always combined to make a triangle)."
msgstr ""
-#: doc/classes/RenderingServer.xml:3251
+#: doc/classes/RenderingServer.xml:3303
msgid "Represents the size of the [enum PrimitiveType] enum."
msgstr ""
-#: doc/classes/RenderingServer.xml:3260
+#: doc/classes/RenderingServer.xml:3312
msgid "Use [Transform2D] to store MultiMesh transform."
msgstr ""
-#: doc/classes/RenderingServer.xml:3263
+#: doc/classes/RenderingServer.xml:3315
msgid "Use [Transform] to store MultiMesh transform."
msgstr ""
-#: doc/classes/RenderingServer.xml:3266
+#: doc/classes/RenderingServer.xml:3318
msgid "Is a directional (sun) light."
msgstr ""
-#: doc/classes/RenderingServer.xml:3269
+#: doc/classes/RenderingServer.xml:3321
msgid "Is an omni light."
msgstr ""
-#: doc/classes/RenderingServer.xml:3272
+#: doc/classes/RenderingServer.xml:3324
msgid "Is a spot light."
msgstr ""
-#: doc/classes/RenderingServer.xml:3275
+#: doc/classes/RenderingServer.xml:3327
msgid "The light's energy."
msgstr ""
-#: doc/classes/RenderingServer.xml:3280
+#: doc/classes/RenderingServer.xml:3332
msgid "The light's influence on specularity."
msgstr ""
-#: doc/classes/RenderingServer.xml:3283
+#: doc/classes/RenderingServer.xml:3335
msgid "The light's range."
msgstr ""
-#: doc/classes/RenderingServer.xml:3286
+#: doc/classes/RenderingServer.xml:3338
+msgid ""
+"The size of the light when using spot light or omni light. The angular size "
+"of the light when using directional light."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3341
msgid "The light's attenuation."
msgstr ""
-#: doc/classes/RenderingServer.xml:3289
+#: doc/classes/RenderingServer.xml:3344
msgid "The spotlight's angle."
msgstr ""
-#: doc/classes/RenderingServer.xml:3292
+#: doc/classes/RenderingServer.xml:3347
msgid "The spotlight's attenuation."
msgstr ""
-#: doc/classes/RenderingServer.xml:3295
-msgid "Scales the shadow color."
-msgstr ""
-
-#: doc/classes/RenderingServer.xml:3298
+#: doc/classes/RenderingServer.xml:3350
msgid "Max distance that shadows will be rendered."
msgstr ""
-#: doc/classes/RenderingServer.xml:3301
+#: doc/classes/RenderingServer.xml:3353
msgid "Proportion of shadow atlas occupied by the first split."
msgstr ""
-#: doc/classes/RenderingServer.xml:3304
+#: doc/classes/RenderingServer.xml:3356
msgid "Proportion of shadow atlas occupied by the second split."
msgstr ""
-#: doc/classes/RenderingServer.xml:3307
+#: doc/classes/RenderingServer.xml:3359
msgid ""
"Proportion of shadow atlas occupied by the third split. The fourth split "
"occupies the rest."
msgstr ""
-#: doc/classes/RenderingServer.xml:3312
+#: doc/classes/RenderingServer.xml:3362
+msgid ""
+"Proportion of shadow max distance where the shadow will start to fade out."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3365
msgid ""
"Normal bias used to offset shadow lookup by object normal. Can be used to "
"fix self-shadowing artifacts."
msgstr ""
-#: doc/classes/RenderingServer.xml:3315
+#: doc/classes/RenderingServer.xml:3368
msgid "Bias the shadow lookup to fix self-shadowing artifacts."
msgstr ""
-#: doc/classes/RenderingServer.xml:3318
-msgid ""
-"Increases bias on further splits to fix self-shadowing that only occurs far "
-"away from the camera."
-msgstr ""
-
-#: doc/classes/RenderingServer.xml:3321
+#: doc/classes/RenderingServer.xml:3379
msgid "Represents the size of the [enum LightParam] enum."
msgstr ""
-#: doc/classes/RenderingServer.xml:3324
+#: doc/classes/RenderingServer.xml:3382
msgid "Use a dual paraboloid shadow map for omni lights."
msgstr ""
-#: doc/classes/RenderingServer.xml:3327
+#: doc/classes/RenderingServer.xml:3385
msgid ""
"Use a cubemap shadow map for omni lights. Slower but better quality than "
"dual paraboloid."
msgstr ""
-#: doc/classes/RenderingServer.xml:3330
+#: doc/classes/RenderingServer.xml:3388
msgid "Use orthogonal shadow projection for directional light."
msgstr ""
-#: doc/classes/RenderingServer.xml:3333
+#: doc/classes/RenderingServer.xml:3391
msgid "Use 2 splits for shadow projection when using directional light."
msgstr ""
-#: doc/classes/RenderingServer.xml:3336
+#: doc/classes/RenderingServer.xml:3394
msgid "Use 4 splits for shadow projection when using directional light."
msgstr ""
-#: doc/classes/RenderingServer.xml:3339
+#: doc/classes/RenderingServer.xml:3397
msgid ""
"Keeps shadows stable as camera moves but has lower effective resolution."
msgstr ""
-#: doc/classes/RenderingServer.xml:3342
+#: doc/classes/RenderingServer.xml:3400
msgid ""
"Optimize use of shadow maps, increasing the effective resolution. But may "
"result in shadows moving or flickering slightly."
msgstr ""
-#: doc/classes/RenderingServer.xml:3345
+#: doc/classes/RenderingServer.xml:3403
msgid "Reflection probe will update reflections once and then stop."
msgstr ""
-#: doc/classes/RenderingServer.xml:3348
+#: doc/classes/RenderingServer.xml:3406
msgid ""
"Reflection probe will update each frame. This mode is necessary to capture "
"moving objects."
msgstr ""
-#: doc/classes/RenderingServer.xml:3351
+#: doc/classes/RenderingServer.xml:3419
msgid "Draw particles in the order that they appear in the particles array."
msgstr ""
-#: doc/classes/RenderingServer.xml:3354
+#: doc/classes/RenderingServer.xml:3422
msgid "Sort particles based on their lifetime."
msgstr ""
-#: doc/classes/RenderingServer.xml:3357
+#: doc/classes/RenderingServer.xml:3425
msgid "Sort particles based on their distance to the camera."
msgstr ""
-#: doc/classes/RenderingServer.xml:3360
+#: doc/classes/RenderingServer.xml:3428
msgid "Do not update the viewport."
msgstr ""
-#: doc/classes/RenderingServer.xml:3363
+#: doc/classes/RenderingServer.xml:3431
msgid "Update the viewport once then set to disabled."
msgstr ""
-#: doc/classes/RenderingServer.xml:3366
+#: doc/classes/RenderingServer.xml:3434
msgid "Update the viewport whenever it is visible."
msgstr ""
-#: doc/classes/RenderingServer.xml:3371
+#: doc/classes/RenderingServer.xml:3439
msgid "Always update the viewport."
msgstr ""
-#: doc/classes/RenderingServer.xml:3374
+#: doc/classes/RenderingServer.xml:3442
msgid "The viewport is always cleared before drawing."
msgstr ""
-#: doc/classes/RenderingServer.xml:3377
+#: doc/classes/RenderingServer.xml:3445
msgid "The viewport is never cleared before drawing."
msgstr ""
-#: doc/classes/RenderingServer.xml:3380
+#: doc/classes/RenderingServer.xml:3448
msgid ""
"The viewport is cleared once, then the clear mode is set to [constant "
"VIEWPORT_CLEAR_NEVER]."
msgstr ""
-#: doc/classes/RenderingServer.xml:3383
+#: doc/classes/RenderingServer.xml:3451
msgid "Multisample antialiasing is disabled."
msgstr ""
-#: doc/classes/RenderingServer.xml:3386
-msgid "Multisample antialiasing is set to 2×."
-msgstr ""
-
-#: doc/classes/RenderingServer.xml:3389
-msgid "Multisample antialiasing is set to 4×."
-msgstr ""
-
-#: doc/classes/RenderingServer.xml:3392
-msgid "Multisample antialiasing is set to 8×."
+#: doc/classes/RenderingServer.xml:3454
+msgid "Multisample antialiasing uses 2 samples per pixel."
msgstr ""
-#: doc/classes/RenderingServer.xml:3395
-msgid "Multisample antialiasing is set to 16×."
+#: doc/classes/RenderingServer.xml:3457
+msgid "Multisample antialiasing uses 4 samples per pixel."
msgstr ""
-#: doc/classes/RenderingServer.xml:3398
-msgid ""
-"Multisample antialiasing is set to 2× on external texture. Special mode for "
-"GLES2 Android VR (Oculus Quest and Go)."
+#: doc/classes/RenderingServer.xml:3460
+msgid "Multisample antialiasing uses 8 samples per pixel."
msgstr ""
-#: doc/classes/RenderingServer.xml:3401
-msgid ""
-"Multisample antialiasing is set to 4× on external texture. Special mode for "
-"GLES2 Android VR (Oculus Quest and Go)."
+#: doc/classes/RenderingServer.xml:3463
+msgid "Multisample antialiasing uses 16 samples per pixel."
msgstr ""
-#: doc/classes/RenderingServer.xml:3404
+#: doc/classes/RenderingServer.xml:3474
msgid "Number of objects drawn in a single frame."
msgstr ""
-#: doc/classes/RenderingServer.xml:3407
+#: doc/classes/RenderingServer.xml:3477
msgid "Number of vertices drawn in a single frame."
msgstr ""
-#: doc/classes/RenderingServer.xml:3410
+#: doc/classes/RenderingServer.xml:3480
msgid "Number of material changes during this frame."
msgstr ""
-#: doc/classes/RenderingServer.xml:3413
+#: doc/classes/RenderingServer.xml:3483
msgid "Number of shader changes during this frame."
msgstr ""
-#: doc/classes/RenderingServer.xml:3416
+#: doc/classes/RenderingServer.xml:3486
msgid "Number of surface changes during this frame."
msgstr ""
-#: doc/classes/RenderingServer.xml:3419
+#: doc/classes/RenderingServer.xml:3489
msgid "Number of draw calls during this frame."
msgstr ""
-#: doc/classes/RenderingServer.xml:3422
+#: doc/classes/RenderingServer.xml:3492
msgid "Represents the size of the [enum ViewportRenderInfo] enum."
msgstr ""
-#: doc/classes/RenderingServer.xml:3425
+#: doc/classes/RenderingServer.xml:3495
msgid "Debug draw is disabled. Default setting."
msgstr ""
-#: doc/classes/RenderingServer.xml:3428
-msgid "Debug draw sets objects to unshaded."
+#: doc/classes/RenderingServer.xml:3498 doc/classes/Viewport.xml:348
+msgid "Objects are displayed without light information."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3501
+msgid "Objects are displayed with only light information."
msgstr ""
-#: doc/classes/RenderingServer.xml:3433
-msgid "Overwrites clear color to [code](0,0,0,0)[/code]."
+#: doc/classes/RenderingServer.xml:3504 doc/classes/Viewport.xml:353
+msgid ""
+"Objects are displayed semi-transparent with additive blending so you can see "
+"where they are drawing over top of one another. A higher overdraw means you "
+"are wasting performance on drawing pixels that are being hidden behind "
+"others."
msgstr ""
-#: doc/classes/RenderingServer.xml:3436
+#: doc/classes/RenderingServer.xml:3507
msgid "Debug draw draws objects in wireframe."
msgstr ""
-#: doc/classes/RenderingServer.xml:3461
+#: doc/classes/RenderingServer.xml:3510
+msgid ""
+"Normal buffer is drawn instead of regular scene so you can see the per-pixel "
+"normals that will be used by post-processing effects."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3513 doc/classes/Viewport.xml:361
+msgid "Objects are displayed with only the albedo value from [GIProbe]s."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3516 doc/classes/Viewport.xml:364
+msgid "Objects are displayed with only the lighting value from [GIProbe]s."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3519 doc/classes/Viewport.xml:367
+msgid "Objects are displayed with only the emission color from [GIProbe]s."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3522 doc/classes/Viewport.xml:370
+msgid ""
+"Draws the shadow atlas that stores shadows from [OmniLight3D]s and "
+"[SpotLight3D]s in the upper left quadrant of the [Viewport]."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3525 doc/classes/Viewport.xml:373
+msgid ""
+"Draws the shadow atlas that stores shadows from [DirectionalLight3D]s in the "
+"upper left quadrant of the [Viewport]."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3530
+msgid ""
+"Draws the screen space ambient occlusion texture instead of the scene so "
+"that you can clearly see how it is affecting objects. In order for this "
+"display mode to work, you must have [member Environment.ssao_enabled] set in "
+"your [WorldEnvironment]."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3533 doc/classes/Viewport.xml:381
+msgid ""
+"Draws the roughness limiter post process over the Viewport so you can see "
+"where it has an effect. It must be enabled in [member ProjectSettings."
+"rendering/quality/screen_filters/screen_space_roughness_limiter] to work."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3536
+msgid ""
+"Colors each PSSM split for the [DirectionalLight3D]s in the scene a "
+"different color so you can see where the splits are. In order they will be "
+"colored red, green, blue, yellow."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3541
+msgid ""
+"Uses high quality importance sampling to process the radiance map. In "
+"general, this results in much higher quality than [constant Sky."
+"PROCESS_MODE_REALTIME] but takes much longer to generate. This should not be "
+"used if you plan on changing the sky at runtime. If you are finding that the "
+"reflection is not blurry enough and is showing sparkles or fireflies, try "
+"increasing [member ProjectSettings.rendering/quality/reflections/"
+"ggx_samples]."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3544
+msgid ""
+"Uses the fast filtering algorithm to process the radiance map. In general "
+"this results in lower quality, but substantially faster run times.\n"
+"[b]Note:[/b] The fast filtering algorithm is limited to 256x256 cubemaps, so "
+"[member Sky.radiance_size] must be set to [constant Sky.RADIANCE_SIZE_256]."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3548
msgid "Use the clear color as background."
msgstr ""
-#: doc/classes/RenderingServer.xml:3464
+#: doc/classes/RenderingServer.xml:3551
msgid "Use a specified color as the background."
msgstr ""
-#: doc/classes/RenderingServer.xml:3467
+#: doc/classes/RenderingServer.xml:3554
msgid "Use a sky resource for the background."
msgstr ""
-#: doc/classes/RenderingServer.xml:3470
+#: doc/classes/RenderingServer.xml:3557
msgid ""
"Use a specified canvas layer as the background. This can be useful for "
"instantiating a 2D scene in a 3D world."
msgstr ""
-#: doc/classes/RenderingServer.xml:3473
+#: doc/classes/RenderingServer.xml:3560
msgid ""
"Do not clear the background, use whatever was rendered last frame as the "
"background."
msgstr ""
-#: doc/classes/RenderingServer.xml:3479
+#: doc/classes/RenderingServer.xml:3566
msgid "Represents the size of the [enum EnvironmentBG] enum."
msgstr ""
-#: doc/classes/RenderingServer.xml:3506
+#: doc/classes/RenderingServer.xml:3605
msgid "Output color as they came in."
msgstr ""
-#: doc/classes/RenderingServer.xml:3509
+#: doc/classes/RenderingServer.xml:3608
msgid "Use the Reinhard tonemapper."
msgstr ""
-#: doc/classes/RenderingServer.xml:3512
+#: doc/classes/RenderingServer.xml:3611
msgid "Use the filmic tonemapper."
msgstr ""
-#: doc/classes/RenderingServer.xml:3515
+#: doc/classes/RenderingServer.xml:3614
msgid "Use the ACES tonemapper."
msgstr ""
-#: doc/classes/RenderingServer.xml:3518
+#: doc/classes/RenderingServer.xml:3625
msgid "Disables the blur set for SSAO. Will make SSAO look noisier."
msgstr ""
-#: doc/classes/RenderingServer.xml:3521
+#: doc/classes/RenderingServer.xml:3628
msgid "Perform a 1x1 blur on the SSAO output."
msgstr ""
-#: doc/classes/RenderingServer.xml:3524
+#: doc/classes/RenderingServer.xml:3631
msgid "Performs a 2x2 blur on the SSAO output."
msgstr ""
-#: doc/classes/RenderingServer.xml:3527
+#: doc/classes/RenderingServer.xml:3634
msgid "Performs a 3x3 blur on the SSAO output. Use this for smoothest SSAO."
msgstr ""
-#: doc/classes/RenderingServer.xml:3530
+#: doc/classes/RenderingServer.xml:3637
msgid "Lowest quality of screen space ambient occlusion."
msgstr ""
-#: doc/classes/RenderingServer.xml:3533
+#: doc/classes/RenderingServer.xml:3640
msgid "Medium quality screen space ambient occlusion."
msgstr ""
-#: doc/classes/RenderingServer.xml:3536
+#: doc/classes/RenderingServer.xml:3643
+msgid "High quality screen space ambient occlusion."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3646
msgid "Highest quality screen space ambient occlusion."
msgstr ""
-#: doc/classes/RenderingServer.xml:3555
+#: doc/classes/RenderingServer.xml:3657
+msgid ""
+"Lowest quality DOF blur. This is the fastest setting, but you may be able to "
+"see filtering artifacts."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3660
+msgid "Low quality DOF blur."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3663
+msgid "Medium quality DOF blur."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3666
+msgid ""
+"Highest quality DOF blur. Results in the smoothest looking blur by taking "
+"the most samples, but is also significantly slower."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3669
+msgid ""
+"Calculate the DOF blur using a box filter. The fastest option, but results "
+"in obvious lines in blur pattern."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3672
+msgid "Calculates DOF blur using a hexagon shaped filter."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3675
+msgid ""
+"Calculates DOF blur using a circle shaped filter. Best quality and most "
+"realistic, but slowest. Use only for areas where a lot of performance can be "
+"dedicated to post-processing (e.g. cutscenes)."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3690
msgid "Do not use a debug mode."
msgstr ""
-#: doc/classes/RenderingServer.xml:3558
+#: doc/classes/RenderingServer.xml:3693
msgid "Draw all objects as wireframe models."
msgstr ""
-#: doc/classes/RenderingServer.xml:3561
+#: doc/classes/RenderingServer.xml:3696
msgid ""
"Draw all objects in a way that displays how much overdraw is occurring. "
"Overdraw occurs when a section of pixels is drawn and shaded and then "
"another object covers it up. To optimize a scene, you should reduce overdraw."
msgstr ""
-#: doc/classes/RenderingServer.xml:3564
+#: doc/classes/RenderingServer.xml:3699
msgid ""
"Draw all objects without shading. Equivalent to setting all objects shaders "
"to [code]unshaded[/code]."
msgstr ""
-#: doc/classes/RenderingServer.xml:3567
+#: doc/classes/RenderingServer.xml:3702
msgid "The instance does not have a type."
msgstr ""
-#: doc/classes/RenderingServer.xml:3570
+#: doc/classes/RenderingServer.xml:3705
msgid "The instance is a mesh."
msgstr ""
-#: doc/classes/RenderingServer.xml:3573
+#: doc/classes/RenderingServer.xml:3708
msgid "The instance is a multimesh."
msgstr ""
-#: doc/classes/RenderingServer.xml:3576
+#: doc/classes/RenderingServer.xml:3711
msgid "The instance is an immediate geometry."
msgstr ""
-#: doc/classes/RenderingServer.xml:3579
+#: doc/classes/RenderingServer.xml:3714
msgid "The instance is a particle emitter."
msgstr ""
-#: doc/classes/RenderingServer.xml:3582
+#: doc/classes/RenderingServer.xml:3717
msgid "The instance is a light."
msgstr ""
-#: doc/classes/RenderingServer.xml:3585
+#: doc/classes/RenderingServer.xml:3720
msgid "The instance is a reflection probe."
msgstr ""
-#: doc/classes/RenderingServer.xml:3588
+#: doc/classes/RenderingServer.xml:3723
+msgid "The instance is a decal."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3726
msgid "The instance is a GI probe."
msgstr ""
-#: doc/classes/RenderingServer.xml:3591
+#: doc/classes/RenderingServer.xml:3729
msgid "The instance is a lightmap capture."
msgstr ""
-#: doc/classes/RenderingServer.xml:3594
+#: doc/classes/RenderingServer.xml:3732
msgid "Represents the size of the [enum InstanceType] enum."
msgstr ""
-#: doc/classes/RenderingServer.xml:3597
+#: doc/classes/RenderingServer.xml:3735
msgid ""
"A combination of the flags of geometry instances (mesh, multimesh, immediate "
"and particles)."
msgstr ""
-#: doc/classes/RenderingServer.xml:3600
+#: doc/classes/RenderingServer.xml:3738
msgid "Allows the instance to be used in baked lighting."
msgstr ""
-#: doc/classes/RenderingServer.xml:3605
+#: doc/classes/RenderingServer.xml:3741
+msgid "Allows the instance to be used with dynamic global illumination."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3744
msgid "When set, manually requests to draw geometry on next frame."
msgstr ""
-#: doc/classes/RenderingServer.xml:3608
+#: doc/classes/RenderingServer.xml:3747
msgid "Represents the size of the [enum InstanceFlags] enum."
msgstr ""
-#: doc/classes/RenderingServer.xml:3611
+#: doc/classes/RenderingServer.xml:3750
msgid "Disable shadows from this instance."
msgstr ""
-#: doc/classes/RenderingServer.xml:3614
+#: doc/classes/RenderingServer.xml:3753
msgid "Cast shadows from this instance."
msgstr ""
-#: doc/classes/RenderingServer.xml:3617
+#: doc/classes/RenderingServer.xml:3756
msgid ""
"Disable backface culling when rendering the shadow of the object. This is "
"slightly slower but may result in more correct shadows."
msgstr ""
-#: doc/classes/RenderingServer.xml:3620
+#: doc/classes/RenderingServer.xml:3759
msgid ""
"Only render the shadows from the object. The object itself will not be drawn."
msgstr ""
-#: doc/classes/RenderingServer.xml:3623
+#: doc/classes/RenderingServer.xml:3762
msgid "The nine patch gets stretched where needed."
msgstr ""
-#: doc/classes/RenderingServer.xml:3626
+#: doc/classes/RenderingServer.xml:3765
msgid "The nine patch gets filled with tiles where needed."
msgstr ""
-#: doc/classes/RenderingServer.xml:3629
+#: doc/classes/RenderingServer.xml:3768
msgid ""
"The nine patch gets filled with tiles where needed and stretches them a bit "
"if needed."
msgstr ""
-#: doc/classes/RenderingServer.xml:3658
+#: doc/classes/RenderingServer.xml:3771
+msgid "Uses the default filter mode for this [Viewport]."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3783 doc/classes/Viewport.xml:399
+msgid ""
+"The texture filter blends between the nearest 4 pixels and between the "
+"nearest 2 mipmaps."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3792
+msgid "Max value for [enum CanvasItemTextureFilter] enum."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3795
+msgid "Uses the default repeat mode for this [Viewport]."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3798 doc/classes/Viewport.xml:405
+msgid ""
+"Disables textures repeating. Instead, when reading UVs outside the 0-1 "
+"range, the value will be clamped to the edge of the texture, resulting in a "
+"stretched out look at the borders of the texture."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3804 doc/classes/Viewport.xml:411
+msgid ""
+"Flip the texture when repeating so that the edge lines up instead of "
+"abruptly changing."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3807
+msgid "Max value for [enum CanvasItemTextureRepeat] enum."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3810
msgid "Adds light color additive to the canvas."
msgstr ""
-#: doc/classes/RenderingServer.xml:3661
+#: doc/classes/RenderingServer.xml:3813
msgid "Adds light color subtractive to the canvas."
msgstr ""
-#: doc/classes/RenderingServer.xml:3664
+#: doc/classes/RenderingServer.xml:3816
msgid "The light adds color depending on transparency."
msgstr ""
-#: doc/classes/RenderingServer.xml:3667
+#: doc/classes/RenderingServer.xml:3819
msgid "The light adds color depending on mask."
msgstr ""
-#: doc/classes/RenderingServer.xml:3670
+#: doc/classes/RenderingServer.xml:3822
msgid "Do not apply a filter to canvas light shadows."
msgstr ""
-#: doc/classes/RenderingServer.xml:3673
+#: doc/classes/RenderingServer.xml:3825
msgid "Use PCF5 filtering to filter canvas light shadows."
msgstr ""
-#: doc/classes/RenderingServer.xml:3676
+#: doc/classes/RenderingServer.xml:3828
msgid "Use PCF13 filtering to filter canvas light shadows."
msgstr ""
-#: doc/classes/RenderingServer.xml:3681
+#: doc/classes/RenderingServer.xml:3831
+msgid "Max value of the [enum CanvasLightShadowFilter] enum."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3834
msgid "Culling of the canvas occluder is disabled."
msgstr ""
-#: doc/classes/RenderingServer.xml:3684
+#: doc/classes/RenderingServer.xml:3837
msgid "Culling of the canvas occluder is clockwise."
msgstr ""
-#: doc/classes/RenderingServer.xml:3687
+#: doc/classes/RenderingServer.xml:3840
msgid "Culling of the canvas occluder is counterclockwise."
msgstr ""
-#: doc/classes/RenderingServer.xml:3690
+#: doc/classes/RenderingServer.xml:3901
msgid "The amount of objects in the frame."
msgstr ""
-#: doc/classes/RenderingServer.xml:3693
+#: doc/classes/RenderingServer.xml:3904
msgid "The amount of vertices in the frame."
msgstr ""
-#: doc/classes/RenderingServer.xml:3696
+#: doc/classes/RenderingServer.xml:3907
msgid "The amount of modified materials in the frame."
msgstr ""
-#: doc/classes/RenderingServer.xml:3699
+#: doc/classes/RenderingServer.xml:3910
msgid "The amount of shader rebinds in the frame."
msgstr ""
-#: doc/classes/RenderingServer.xml:3702
+#: doc/classes/RenderingServer.xml:3913
msgid "The amount of surface changes in the frame."
msgstr ""
-#: doc/classes/RenderingServer.xml:3705
+#: doc/classes/RenderingServer.xml:3916
msgid "The amount of draw calls in frame."
msgstr ""
-#: doc/classes/RenderingServer.xml:3720
+#: doc/classes/RenderingServer.xml:3931
msgid "Hardware supports shaders. This enum is currently unused in Godot 3.x."
msgstr ""
-#: doc/classes/RenderingServer.xml:3723
+#: doc/classes/RenderingServer.xml:3934
msgid ""
"Hardware supports multithreading. This enum is currently unused in Godot 3.x."
msgstr ""
@@ -44081,15 +44356,11 @@ msgid ""
"Physics > 2d[/b]."
msgstr ""
-#: doc/classes/RigidBody2D.xml:158 doc/classes/RigidBody3D.xml:174
-msgid "The body's mass."
-msgstr ""
-
#: doc/classes/RigidBody2D.xml:161
msgid "The body's mode. See [enum Mode] for possible values."
msgstr ""
-#: doc/classes/RigidBody2D.xml:164 doc/classes/RigidBody3D.xml:180
+#: doc/classes/RigidBody2D.xml:164 doc/classes/RigidBody3D.xml:181
#: doc/classes/StaticBody2D.xml:22 doc/classes/StaticBody3D.xml:22
msgid ""
"The physics material override for the body.\n"
@@ -44218,22 +44489,32 @@ msgid ""
"for a body."
msgstr ""
+#: doc/classes/RigidBody3D.xml:31
+msgid ""
+"Adds a constant directional force (i.e. acceleration) without affecting "
+"rotation.\n"
+"This is equivalent to [code]add_force(force, Vector3(0,0,0))[/code]."
+msgstr ""
+
#: doc/classes/RigidBody3D.xml:43
-msgid "Adds a constant force (i.e. acceleration)."
+msgid ""
+"Adds a constant directional force (i.e. acceleration).\n"
+"The position uses the rotation of the global coordinate system, but is "
+"centered at the object's origin."
msgstr ""
-#: doc/classes/RigidBody3D.xml:52
+#: doc/classes/RigidBody3D.xml:53
msgid ""
"Adds a constant rotational force (i.e. a motor) without affecting position."
msgstr ""
-#: doc/classes/RigidBody3D.xml:61
+#: doc/classes/RigidBody3D.xml:62
msgid ""
"Applies a directional impulse without affecting rotation.\n"
"This is equivalent to [code]apply_impulse(Vector3(0,0,0), impulse)[/code]."
msgstr ""
-#: doc/classes/RigidBody3D.xml:73
+#: doc/classes/RigidBody3D.xml:74
msgid ""
"Applies a positioned impulse to the body. An impulse is time independent! "
"Applying an impulse every frame would result in a framerate-dependent force. "
@@ -44242,19 +44523,19 @@ msgid ""
"at the object's origin."
msgstr ""
-#: doc/classes/RigidBody3D.xml:82
+#: doc/classes/RigidBody3D.xml:83
msgid ""
"Applies a torque impulse which will be affected by the body mass and shape. "
"This will rotate the body around the [code]impulse[/code] vector passed."
msgstr ""
-#: doc/classes/RigidBody3D.xml:91
+#: doc/classes/RigidBody3D.xml:92
msgid ""
"Returns [code]true[/code] if the specified linear or rotational axis is "
"locked."
msgstr ""
-#: doc/classes/RigidBody3D.xml:98
+#: doc/classes/RigidBody3D.xml:99
msgid ""
"Returns a list of the bodies colliding with this one. By default, number of "
"max contacts reported is at 0, see the [member contacts_reported] property "
@@ -44264,64 +44545,32 @@ msgid ""
"physics step. Consider using signals instead."
msgstr ""
-#: doc/classes/RigidBody3D.xml:110
+#: doc/classes/RigidBody3D.xml:111
msgid "Locks the specified linear or rotational axis."
msgstr ""
-#: doc/classes/RigidBody3D.xml:125
+#: doc/classes/RigidBody3D.xml:126
msgid "Damps RigidBody3D's rotational forces."
msgstr ""
-#: doc/classes/RigidBody3D.xml:128
+#: doc/classes/RigidBody3D.xml:129
msgid "RigidBody3D's rotational velocity."
msgstr ""
-#: doc/classes/RigidBody3D.xml:131
-msgid "Lock the body's rotation in the X axis."
-msgstr ""
-
-#: doc/classes/RigidBody3D.xml:134
-msgid "Lock the body's rotation in the Y axis."
-msgstr ""
-
-#: doc/classes/RigidBody3D.xml:137
-msgid "Lock the body's rotation in the Z axis."
-msgstr ""
-
-#: doc/classes/RigidBody3D.xml:140
-msgid "Lock the body's movement in the X axis."
-msgstr ""
-
-#: doc/classes/RigidBody3D.xml:143
-msgid "Lock the body's movement in the Y axis."
-msgstr ""
-
-#: doc/classes/RigidBody3D.xml:146
-msgid "Lock the body's movement in the Z axis."
-msgstr ""
-
-#: doc/classes/RigidBody3D.xml:149
-msgid ""
-"If [code]true[/code], the RigidBody3D will not calculate forces and will act "
-"as a static body while there is no movement. It will wake up when forces are "
-"applied through other collisions or when the [code]apply_impulse[/code] "
-"method is used."
-msgstr ""
-
-#: doc/classes/RigidBody3D.xml:152
+#: doc/classes/RigidBody3D.xml:153
msgid ""
"If [code]true[/code], the RigidBody3D will emit signals when it collides "
"with another RigidBody3D."
msgstr ""
-#: doc/classes/RigidBody3D.xml:155
+#: doc/classes/RigidBody3D.xml:156
msgid ""
"The maximum contacts to report. Bodies can keep a log of the contacts with "
"other bodies, this is enabled by setting the maximum amount of contacts "
"reported to a number greater than 0."
msgstr ""
-#: doc/classes/RigidBody3D.xml:158
+#: doc/classes/RigidBody3D.xml:159
msgid ""
"If [code]true[/code], continuous collision detection is used.\n"
"Continuous collision detection tries to predict where a moving body will "
@@ -44331,7 +44580,7 @@ msgid ""
"faster to compute, but can miss small, fast-moving objects."
msgstr ""
-#: doc/classes/RigidBody3D.xml:162
+#: doc/classes/RigidBody3D.xml:163
msgid ""
"If [code]true[/code], internal force integration will be disabled (like "
"gravity or air friction) for this body. Other than collision response, the "
@@ -44339,7 +44588,7 @@ msgid ""
"function, if defined."
msgstr ""
-#: doc/classes/RigidBody3D.xml:165
+#: doc/classes/RigidBody3D.xml:166
msgid ""
"This is multiplied by the global 3D gravity setting found in [b]Project > "
"Project Settings > Physics > 3d[/b] to produce RigidBody3D's gravity. For "
@@ -44347,14 +44596,14 @@ msgid ""
"and 0.5 will apply half gravity to this object."
msgstr ""
-#: doc/classes/RigidBody3D.xml:168
+#: doc/classes/RigidBody3D.xml:169
msgid ""
"The body's linear damp. Cannot be less than -1.0. If this value is different "
"from -1.0, any linear damp derived from the world or areas will be "
"overridden."
msgstr ""
-#: doc/classes/RigidBody3D.xml:171
+#: doc/classes/RigidBody3D.xml:172
msgid ""
"The body's linear velocity. Can be used sporadically, but [b]don't set this "
"every frame[/b], because physics may run in another thread and runs at a "
@@ -44362,35 +44611,29 @@ msgid ""
"for precise control of the body state."
msgstr ""
-#: doc/classes/RigidBody3D.xml:177
+#: doc/classes/RigidBody3D.xml:178
msgid "The body mode. See [enum Mode] for possible values."
msgstr ""
-#: doc/classes/RigidBody3D.xml:184
+#: doc/classes/RigidBody3D.xml:185
msgid ""
"If [code]true[/code], the body is sleeping and will not calculate forces "
"until woken up by a collision or the [code]apply_impulse[/code] method."
msgstr ""
-#: doc/classes/RigidBody3D.xml:187
-msgid ""
-"The body's weight based on its mass and the global 3D gravity. Global values "
-"are set in [b]Project > Project Settings > Physics > 3d[/b]."
-msgstr ""
-
-#: doc/classes/RigidBody3D.xml:195
+#: doc/classes/RigidBody3D.xml:196
msgid ""
"Emitted when a body enters into contact with this one. Contact monitor and "
"contacts reported must be enabled for this to work."
msgstr ""
-#: doc/classes/RigidBody3D.xml:202
+#: doc/classes/RigidBody3D.xml:203
msgid ""
"Emitted when a body shape exits contact with this one. Contact monitor and "
"contacts reported must be enabled for this to work."
msgstr ""
-#: doc/classes/RigidBody3D.xml:215
+#: doc/classes/RigidBody3D.xml:216
msgid ""
"Emitted when a body enters into contact with this one. Contact monitor and "
"contacts reported must be enabled for this to work.\n"
@@ -44400,7 +44643,7 @@ msgid ""
"([code]local_shape[/code]) the other body collided with."
msgstr ""
-#: doc/classes/RigidBody3D.xml:229
+#: doc/classes/RigidBody3D.xml:230
msgid ""
"Emitted when a body shape exits contact with this one. Contact monitor and "
"contacts reported must be enabled for this to work.\n"
@@ -44410,30 +44653,30 @@ msgid ""
"([code]local_shape[/code]) the other body stopped colliding with."
msgstr ""
-#: doc/classes/RigidBody3D.xml:235
+#: doc/classes/RigidBody3D.xml:236
msgid ""
"Emitted when the body changes its sleeping state. Either by sleeping or "
"waking up."
msgstr ""
-#: doc/classes/RigidBody3D.xml:241
+#: doc/classes/RigidBody3D.xml:242
msgid ""
"Rigid body mode. This is the \"natural\" state of a rigid body. It is "
"affected by forces, and can move, rotate, and be affected by user code."
msgstr ""
-#: doc/classes/RigidBody3D.xml:244
+#: doc/classes/RigidBody3D.xml:245
msgid ""
"Static mode. The body behaves like a [StaticBody3D], and can only move by "
"user code."
msgstr ""
-#: doc/classes/RigidBody3D.xml:247
+#: doc/classes/RigidBody3D.xml:248
msgid ""
"Character body mode. This behaves like a rigid body, but can not rotate."
msgstr ""
-#: doc/classes/RigidBody3D.xml:250
+#: doc/classes/RigidBody3D.xml:251
msgid ""
"Kinematic body mode. The body behaves like a [KinematicBody3D], and can only "
"move by user code."
@@ -45057,27 +45300,33 @@ msgstr ""
msgid "Godot editor's script editor."
msgstr ""
-#: doc/classes/ScriptEditor.xml:39
+#: doc/classes/ScriptEditor.xml:7
+msgid ""
+"[b]Note:[/b] This class shouldn't be instantiated directly. Instead, access "
+"the singleton using [method EditorInterface.get_script_editor]."
+msgstr ""
+
+#: doc/classes/ScriptEditor.xml:40
msgid "Returns a [Script] that is currently active in editor."
msgstr ""
-#: doc/classes/ScriptEditor.xml:56
+#: doc/classes/ScriptEditor.xml:57
msgid ""
"Returns an array with all [Script] objects which are currently open in "
"editor."
msgstr ""
-#: doc/classes/ScriptEditor.xml:65
+#: doc/classes/ScriptEditor.xml:66
msgid "Goes to the specified line in the current script."
msgstr ""
-#: doc/classes/ScriptEditor.xml:84
+#: doc/classes/ScriptEditor.xml:85
msgid ""
"Emitted when user changed active script. Argument is a freshly activated "
"[Script]."
msgstr ""
-#: doc/classes/ScriptEditor.xml:91
+#: doc/classes/ScriptEditor.xml:92
msgid ""
"Emitted when editor is about to close the active script. Argument is a "
"[Script] that is going to be closed."
@@ -45139,7 +45388,7 @@ msgid ""
"visible."
msgstr ""
-#: doc/classes/ScrollContainer.xml:37 doc/classes/TextEdit.xml:441
+#: doc/classes/ScrollContainer.xml:37 doc/classes/TextEdit.xml:442
msgid "The current horizontal scroll value."
msgstr ""
@@ -45147,7 +45396,7 @@ msgstr ""
msgid "If [code]true[/code], enables horizontal scrolling."
msgstr ""
-#: doc/classes/ScrollContainer.xml:43 doc/classes/TextEdit.xml:444
+#: doc/classes/ScrollContainer.xml:43 doc/classes/TextEdit.xml:445
msgid "The current vertical scroll value."
msgstr ""
@@ -45677,7 +45926,10 @@ msgid ""
"Uses high quality importance sampling to process the radiance map. In "
"general, this results in much higher quality than [constant "
"PROCESS_MODE_REALTIME] but takes much longer to generate. This should not be "
-"used if you plan on changing the sky at runtime."
+"used if you plan on changing the sky at runtime. If you are finding that the "
+"reflection is not blurry enough and is showing sparkles or fireflies, try "
+"increasing [member ProjectSettings.rendering/quality/reflections/"
+"ggx_samples]."
msgstr ""
#: doc/classes/Sky.xml:55
@@ -47871,65 +48123,65 @@ msgid ""
msgstr ""
#: doc/classes/SubViewport.xml:13
-msgid "If [code]true[/code], the sub-viewport will be used in AR/VR process."
-msgstr ""
-
-#: doc/classes/SubViewport.xml:16
msgid "The clear mode when the sub-viewport is used as a render target."
msgstr ""
-#: doc/classes/SubViewport.xml:19
+#: doc/classes/SubViewport.xml:16
msgid "The update mode when the sub-viewport is used as a render target."
msgstr ""
-#: doc/classes/SubViewport.xml:22
+#: doc/classes/SubViewport.xml:19
msgid "The width and height of the sub-viewport."
msgstr ""
-#: doc/classes/SubViewport.xml:25
+#: doc/classes/SubViewport.xml:22
msgid ""
"The 2D size override of the sub-viewport. If either the width or height is "
"[code]0[/code], the override is disabled."
msgstr ""
-#: doc/classes/SubViewport.xml:28
+#: doc/classes/SubViewport.xml:25
msgid "If [code]true[/code], the 2D size override affects stretch as well."
msgstr ""
+#: doc/classes/SubViewport.xml:28
+msgid "If [code]true[/code], the sub-viewport will be used in AR/VR process."
+msgstr ""
+
#: doc/classes/SubViewport.xml:33
-msgid "Do not update the render target."
+msgid "Always clear the render target before drawing."
msgstr ""
#: doc/classes/SubViewport.xml:36
-msgid ""
-"Update the render target once, then switch to [constant UPDATE_DISABLED]."
+msgid "Never clear the render target."
msgstr ""
#: doc/classes/SubViewport.xml:39
msgid ""
-"Update the render target only when it is visible. This is the default value."
+"Clear the render target next frame, then switch to [constant "
+"CLEAR_MODE_NEVER]."
msgstr ""
#: doc/classes/SubViewport.xml:42
-msgid "Update the render target only when the its parent is visible."
+msgid "Do not update the render target."
msgstr ""
#: doc/classes/SubViewport.xml:45
-msgid "Always update the render target."
+msgid ""
+"Update the render target once, then switch to [constant UPDATE_DISABLED]."
msgstr ""
#: doc/classes/SubViewport.xml:48
-msgid "Always clear the render target before drawing."
+msgid ""
+"Update the render target only when it is visible. This is the default value."
msgstr ""
#: doc/classes/SubViewport.xml:51
-msgid "Never clear the render target."
+msgid "Update the render target only when the its parent is visible."
msgstr ""
#: doc/classes/SubViewport.xml:54
-msgid ""
-"Clear the render target next frame, then switch to [constant "
-"CLEAR_MODE_NEVER]."
+msgid "Always update the render target."
msgstr ""
#: doc/classes/SubViewportContainer.xml:4
@@ -47984,85 +48236,90 @@ msgid ""
"information to a mesh.\n"
"Additionally, the attributes used before the first vertex is added determine "
"the format of the mesh. For example, if you only add UVs to the first "
-"vertex, you cannot add color to any of the subsequent vertices."
+"vertex, you cannot add color to any of the subsequent vertices.\n"
+"See also [ArrayMesh], [ImmediateGeometry3D] and [MeshDataTool] for "
+"procedural geometry generation.\n"
+"[b]Note:[/b] Godot uses clockwise [url=https://learnopengl.com/Advanced-"
+"OpenGL/Face-culling]winding order[/url] for front faces of triangle "
+"primitive modes."
msgstr ""
-#: doc/classes/SurfaceTool.xml:28
+#: doc/classes/SurfaceTool.xml:30
msgid ""
"Adds an array of bones for the next vertex to use. [code]bones[/code] must "
"contain 4 integers."
msgstr ""
-#: doc/classes/SurfaceTool.xml:37
+#: doc/classes/SurfaceTool.xml:39
msgid "Specifies a [Color] for the next vertex to use."
msgstr ""
-#: doc/classes/SurfaceTool.xml:46
+#: doc/classes/SurfaceTool.xml:48
msgid ""
"Adds an index to index array if you are using indexed vertices. Does not "
"need to be called before adding vertices."
msgstr ""
-#: doc/classes/SurfaceTool.xml:55
+#: doc/classes/SurfaceTool.xml:57
msgid "Specifies a normal for the next vertex to use."
msgstr ""
-#: doc/classes/SurfaceTool.xml:64
+#: doc/classes/SurfaceTool.xml:66
msgid ""
"Specifies whether the current vertex (if using only vertex arrays) or "
"current index (if also using index arrays) should use smooth normals for "
"normal calculation."
msgstr ""
-#: doc/classes/SurfaceTool.xml:73
+#: doc/classes/SurfaceTool.xml:75
msgid "Specifies a tangent for the next vertex to use."
msgstr ""
-#: doc/classes/SurfaceTool.xml:92
+#: doc/classes/SurfaceTool.xml:94
msgid ""
"Inserts a triangle fan made of array data into [Mesh] being constructed.\n"
"Requires the primitive type be set to [constant Mesh.PRIMITIVE_TRIANGLES]."
msgstr ""
-#: doc/classes/SurfaceTool.xml:102
+#: doc/classes/SurfaceTool.xml:104
msgid "Specifies a set of UV coordinates to use for the next vertex."
msgstr ""
-#: doc/classes/SurfaceTool.xml:111
+#: doc/classes/SurfaceTool.xml:113
msgid ""
"Specifies an optional second set of UV coordinates to use for the next "
"vertex."
msgstr ""
-#: doc/classes/SurfaceTool.xml:120
+#: doc/classes/SurfaceTool.xml:122
msgid ""
"Specifies the position of current vertex. Should be called after specifying "
"other vertex properties (e.g. Color, UV)."
msgstr ""
-#: doc/classes/SurfaceTool.xml:129
+#: doc/classes/SurfaceTool.xml:131
msgid ""
"Specifies weight values for next vertex to use. [code]weights[/code] must "
"contain 4 values."
msgstr ""
-#: doc/classes/SurfaceTool.xml:142
+#: doc/classes/SurfaceTool.xml:144
msgid ""
"Append vertices from a given [Mesh] surface onto the current vertex array "
"with specified [Transform]."
msgstr ""
-#: doc/classes/SurfaceTool.xml:151
+#: doc/classes/SurfaceTool.xml:153
msgid ""
"Called before adding any vertices. Takes the primitive type as an argument "
"(e.g. [constant Mesh.PRIMITIVE_TRIANGLES])."
msgstr ""
-#: doc/classes/SurfaceTool.xml:158
+#: doc/classes/SurfaceTool.xml:160
msgid "Clear all information passed into the surface tool so far."
msgstr ""
-#: doc/classes/SurfaceTool.xml:169
+#: doc/classes/SurfaceTool.xml:171
msgid ""
"Returns a constructed [ArrayMesh] from current information passed in. If an "
"existing [ArrayMesh] is passed in as an argument, will add an extra surface "
@@ -48072,28 +48329,28 @@ msgid ""
"flags."
msgstr ""
-#: doc/classes/SurfaceTool.xml:177
+#: doc/classes/SurfaceTool.xml:179
msgid ""
"Commits the data to the same format used by [method ArrayMesh."
"add_surface_from_arrays]. This way you can further process the mesh data "
"using the [ArrayMesh] API."
msgstr ""
-#: doc/classes/SurfaceTool.xml:188
+#: doc/classes/SurfaceTool.xml:190
msgid "Creates a vertex array from an existing [Mesh]."
msgstr ""
-#: doc/classes/SurfaceTool.xml:201
+#: doc/classes/SurfaceTool.xml:203
msgid ""
"Creates a vertex array from the specified blend shape of an existing [Mesh]. "
"This can be used to extract a specific pose from a blend shape."
msgstr ""
-#: doc/classes/SurfaceTool.xml:208
+#: doc/classes/SurfaceTool.xml:210
msgid "Removes the index array by expanding the vertex array."
msgstr ""
-#: doc/classes/SurfaceTool.xml:217
+#: doc/classes/SurfaceTool.xml:219
msgid ""
"Generates normals from vertices so you do not have to do it manually. If "
"[code]flip[/code] is [code]true[/code], the resulting normals will be "
@@ -48101,19 +48358,19 @@ msgid ""
"Requires the primitive type to be set to [constant Mesh.PRIMITIVE_TRIANGLES]."
msgstr ""
-#: doc/classes/SurfaceTool.xml:225
+#: doc/classes/SurfaceTool.xml:227
msgid ""
"Generates a tangent vector for each vertex. Requires that each vertex have "
"UVs and normals set already."
msgstr ""
-#: doc/classes/SurfaceTool.xml:232
+#: doc/classes/SurfaceTool.xml:234
msgid ""
"Shrinks the vertex array by creating an index array (avoids reusing "
"vertices)."
msgstr ""
-#: doc/classes/SurfaceTool.xml:241
+#: doc/classes/SurfaceTool.xml:243
msgid "Sets [Material] to be used by the [Mesh] you are constructing."
msgstr ""
@@ -48147,7 +48404,7 @@ msgid "Returns the previously active tab index."
msgstr ""
#: doc/classes/TabContainer.xml:42
-msgid "Returns the currently visible tab's [Control] node."
+msgid "Returns the [Control] node from the tab at index [code]tab_idx[/code]."
msgstr ""
#: doc/classes/TabContainer.xml:49 doc/classes/Tabs.xml:50
@@ -48816,151 +49073,163 @@ msgstr ""
msgid "If [code]true[/code], the line containing the cursor is highlighted."
msgstr ""
-#: doc/classes/TextEdit.xml:438
+#: doc/classes/TextEdit.xml:436
+msgid ""
+"If [code]true[/code], custom [code]font_color_selected[/code] will be used "
+"for selected text."
+msgstr ""
+
+#: doc/classes/TextEdit.xml:439
msgid ""
"If [code]true[/code], read-only mode is enabled. Existing text cannot be "
"modified and new text cannot be added."
msgstr ""
-#: doc/classes/TextEdit.xml:451
+#: doc/classes/TextEdit.xml:452
msgid ""
"If [code]true[/code], line numbers are displayed to the left of the text."
msgstr ""
-#: doc/classes/TextEdit.xml:454
+#: doc/classes/TextEdit.xml:455
msgid ""
"If [code]true[/code], sets the [code]step[/code] of the scrollbars to "
"[code]0.25[/code] which results in smoother scrolling."
msgstr ""
-#: doc/classes/TextEdit.xml:457
+#: doc/classes/TextEdit.xml:458
msgid ""
"If [code]true[/code], any custom color properties that have been set for "
"this [TextEdit] will be visible."
msgstr ""
-#: doc/classes/TextEdit.xml:460
+#: doc/classes/TextEdit.xml:461
msgid "String value of the [TextEdit]."
msgstr ""
-#: doc/classes/TextEdit.xml:463
+#: doc/classes/TextEdit.xml:464
msgid "Vertical scroll sensitivity."
msgstr ""
-#: doc/classes/TextEdit.xml:466
+#: doc/classes/TextEdit.xml:467
msgid ""
"If [code]true[/code], enables text wrapping when it goes beyond the edge of "
"what is visible."
msgstr ""
-#: doc/classes/TextEdit.xml:474
+#: doc/classes/TextEdit.xml:475
msgid "Emitted when a breakpoint is placed via the breakpoint gutter."
msgstr ""
-#: doc/classes/TextEdit.xml:479
+#: doc/classes/TextEdit.xml:480
msgid "Emitted when the cursor changes."
msgstr ""
-#: doc/classes/TextEdit.xml:488
+#: doc/classes/TextEdit.xml:489
msgid "Emitted when the info icon is clicked."
msgstr ""
-#: doc/classes/TextEdit.xml:519
+#: doc/classes/TextEdit.xml:520
msgid "Match case when searching."
msgstr ""
-#: doc/classes/TextEdit.xml:522
+#: doc/classes/TextEdit.xml:523
msgid "Match whole words when searching."
msgstr ""
-#: doc/classes/TextEdit.xml:525
+#: doc/classes/TextEdit.xml:526
msgid "Search from end to beginning."
msgstr ""
-#: doc/classes/TextEdit.xml:528
+#: doc/classes/TextEdit.xml:529
msgid "Used to access the result column from [method search]."
msgstr ""
-#: doc/classes/TextEdit.xml:531
+#: doc/classes/TextEdit.xml:532
msgid "Used to access the result line from [method search]."
msgstr ""
-#: doc/classes/TextEdit.xml:540
+#: doc/classes/TextEdit.xml:541
msgid ""
"Pastes the clipboard text over the selected text (or at the cursor's "
"position)."
msgstr ""
-#: doc/classes/TextEdit.xml:543
+#: doc/classes/TextEdit.xml:544
msgid "Erases the whole [TextEdit] text."
msgstr ""
-#: doc/classes/TextEdit.xml:546
+#: doc/classes/TextEdit.xml:547
msgid "Selects the whole [TextEdit] text."
msgstr ""
-#: doc/classes/TextEdit.xml:552
+#: doc/classes/TextEdit.xml:553
msgid "Redoes the previous action."
msgstr ""
-#: doc/classes/TextEdit.xml:560
+#: doc/classes/TextEdit.xml:561
msgid ""
"Sets the background [Color] of this [TextEdit]. [member syntax_highlighting] "
"has to be enabled."
msgstr ""
-#: doc/classes/TextEdit.xml:563
+#: doc/classes/TextEdit.xml:564
msgid ""
"Sets the [Color] of the bookmark marker. [member syntax_highlighting] has to "
"be enabled."
msgstr ""
-#: doc/classes/TextEdit.xml:568 doc/classes/TextEdit.xml:595
+#: doc/classes/TextEdit.xml:569 doc/classes/TextEdit.xml:596
msgid ""
"Sets the [Color] of the breakpoints. [member breakpoint_gutter] has to be "
"enabled."
msgstr ""
-#: doc/classes/TextEdit.xml:606
+#: doc/classes/TextEdit.xml:607
msgid "Sets the default [Font]."
msgstr ""
-#: doc/classes/TextEdit.xml:609
+#: doc/classes/TextEdit.xml:610
msgid "Sets the font [Color]."
msgstr ""
-#: doc/classes/TextEdit.xml:618
+#: doc/classes/TextEdit.xml:615
+msgid ""
+"Sets the [Color] of the selected text. [member override_selected_font_color] "
+"has to be enabled."
+msgstr ""
+
+#: doc/classes/TextEdit.xml:620
msgid ""
"Sets the [Color] of the line numbers. [member show_line_numbers] has to be "
"enabled."
msgstr ""
-#: doc/classes/TextEdit.xml:621
+#: doc/classes/TextEdit.xml:623
msgid "Sets the spacing between the lines."
msgstr ""
-#: doc/classes/TextEdit.xml:624
+#: doc/classes/TextEdit.xml:626
msgid "Sets the [Color] of marked text."
msgstr ""
-#: doc/classes/TextEdit.xml:629
+#: doc/classes/TextEdit.xml:631
msgid "Sets the [StyleBox] of this [TextEdit]."
msgstr ""
-#: doc/classes/TextEdit.xml:634
+#: doc/classes/TextEdit.xml:636
msgid ""
"Sets the [StyleBox] of this [TextEdit] when [member readonly] is enabled."
msgstr ""
-#: doc/classes/TextEdit.xml:639
+#: doc/classes/TextEdit.xml:641
msgid "Sets the highlight [Color] of text selections."
msgstr ""
-#: doc/classes/TextEdit.xml:646
+#: doc/classes/TextEdit.xml:648
msgid "Sets a custom [Texture2D] for tab text characters."
msgstr ""
-#: doc/classes/TextEdit.xml:649
+#: doc/classes/TextEdit.xml:651
msgid ""
"Sets the highlight [Color] of multiple occurrences. [member "
"highlight_all_occurrences] has to be enabled."
@@ -49632,8 +49901,8 @@ msgstr ""
#: doc/classes/TileMap.xml:46
msgid ""
-"Returns the coordinate of the autotile variation in the tileset. Returns a "
-"zero vector if the cell doesn't have autotiling."
+"Returns the coordinate (subtile column and row) of the autotile variation in "
+"the tileset. Returns a zero vector if the cell doesn't have autotiling."
msgstr ""
#: doc/classes/TileMap.xml:55
@@ -49690,7 +49959,8 @@ msgid ""
"Sets the tile index for the cell given by a Vector2.\n"
"An index of [code]-1[/code] clears the cell.\n"
"Optionally, the tile can also be flipped, transposed, or given autotile "
-"coordinates.\n"
+"coordinates. The autotile coordinate refers to the column and row of the "
+"subtile.\n"
"[b]Note:[/b] Data such as navigation polygons and collision shapes are not "
"immediately updated for performance reasons.\n"
"If you need these to be immediately updated, you can call [method "
@@ -50497,9 +50767,10 @@ msgid ""
"using matrix multiplication. The axis must be a normalized vector."
msgstr ""
-#: doc/classes/Transform.xml:138 doc/classes/Transform2D.xml:140
+#: doc/classes/Transform.xml:138
msgid ""
-"Scales the transform by the given scale factor, using matrix multiplication."
+"Scales basis and origin of the transform by the given scale factor, using "
+"matrix multiplication."
msgstr ""
#: doc/classes/Transform.xml:147 doc/classes/Transform2D.xml:149
@@ -50609,6 +50880,11 @@ msgid ""
"multiplication."
msgstr ""
+#: doc/classes/Transform2D.xml:140
+msgid ""
+"Scales the transform by the given scale factor, using matrix multiplication."
+msgstr ""
+
#: doc/classes/Transform2D.xml:159
msgid ""
"Transforms the given [Vector2], [Rect2], or [PackedVector2Array] by this "
@@ -50766,7 +51042,8 @@ msgid ""
"[/codeblock]\n"
"To iterate over all the [TreeItem] objects in a [Tree] object, use [method "
"TreeItem.get_next] and [method TreeItem.get_children] after getting the root "
-"through [method get_root]."
+"through [method get_root]. You can use [method Object.free] on a [TreeItem] "
+"to remove it from the [Tree]."
msgstr ""
#: doc/classes/Tree.xml:28
@@ -51252,10 +51529,11 @@ msgstr ""
#: doc/classes/TreeItem.xml:7
msgid ""
"Control for a single item inside a [Tree]. May have child [TreeItem]s and be "
-"styled as well as contain buttons."
+"styled as well as contain buttons.\n"
+"You can remove a [TreeItem] by using [method Object.free]."
msgstr ""
-#: doc/classes/TreeItem.xml:26
+#: doc/classes/TreeItem.xml:27
msgid ""
"Adds a button with [Texture2D] [code]button[/code] at column [code]column[/"
"code]. The [code]button_idx[/code] index is used to identify the button when "
@@ -51265,89 +51543,89 @@ msgid ""
"have a [code]tooltip[/code]."
msgstr ""
-#: doc/classes/TreeItem.xml:35
+#: doc/classes/TreeItem.xml:36
msgid ""
"Calls the [code]method[/code] on the actual TreeItem and its children "
"recursively. Pass parameters as a comma separated list."
msgstr ""
-#: doc/classes/TreeItem.xml:44
+#: doc/classes/TreeItem.xml:45
msgid "Resets the background color for the given column to default."
msgstr ""
-#: doc/classes/TreeItem.xml:53
+#: doc/classes/TreeItem.xml:54
msgid "Resets the color for the given column to default."
msgstr ""
-#: doc/classes/TreeItem.xml:62
+#: doc/classes/TreeItem.xml:63
msgid "Deselects the given column."
msgstr ""
-#: doc/classes/TreeItem.xml:73
+#: doc/classes/TreeItem.xml:74
msgid ""
"Removes the button at index [code]button_idx[/code] in column [code]column[/"
"code]."
msgstr ""
-#: doc/classes/TreeItem.xml:84
+#: doc/classes/TreeItem.xml:85
msgid ""
"Returns the [Texture2D] of the button at index [code]button_idx[/code] in "
"column [code]column[/code]."
msgstr ""
-#: doc/classes/TreeItem.xml:93
+#: doc/classes/TreeItem.xml:94
msgid ""
"Returns the number of buttons in column [code]column[/code]. May be used to "
"get the most recently added button's index, if no index was specified."
msgstr ""
-#: doc/classes/TreeItem.xml:104
+#: doc/classes/TreeItem.xml:105
msgid ""
"Returns the tooltip string for the button at index [code]button_idx[/code] "
"in column [code]column[/code]."
msgstr ""
-#: doc/classes/TreeItem.xml:113
+#: doc/classes/TreeItem.xml:114
msgid "Returns the column's cell mode."
msgstr ""
-#: doc/classes/TreeItem.xml:120
+#: doc/classes/TreeItem.xml:121
msgid "Returns the TreeItem's child items."
msgstr ""
-#: doc/classes/TreeItem.xml:129
+#: doc/classes/TreeItem.xml:130
msgid "Returns the custom background color of column [code]column[/code]."
msgstr ""
-#: doc/classes/TreeItem.xml:138
+#: doc/classes/TreeItem.xml:139
msgid "Returns the custom color of column [code]column[/code]."
msgstr ""
-#: doc/classes/TreeItem.xml:147
+#: doc/classes/TreeItem.xml:148
msgid "Returns [code]true[/code] if [code]expand_right[/code] is set."
msgstr ""
-#: doc/classes/TreeItem.xml:156
+#: doc/classes/TreeItem.xml:157
msgid "Returns the given column's icon [Texture2D]. Error if no icon is set."
msgstr ""
-#: doc/classes/TreeItem.xml:165
+#: doc/classes/TreeItem.xml:166
msgid "Returns the column's icon's maximum width."
msgstr ""
-#: doc/classes/TreeItem.xml:174
+#: doc/classes/TreeItem.xml:175
msgid "Returns the [Color] modulating the column's icon."
msgstr ""
-#: doc/classes/TreeItem.xml:183
+#: doc/classes/TreeItem.xml:184
msgid "Returns the icon [Texture2D] region as [Rect2]."
msgstr ""
-#: doc/classes/TreeItem.xml:198
+#: doc/classes/TreeItem.xml:199
msgid "Returns the next TreeItem in the tree."
msgstr ""
-#: doc/classes/TreeItem.xml:207
+#: doc/classes/TreeItem.xml:208
msgid ""
"Returns the next visible TreeItem in the tree.\n"
"If [code]wrap[/code] is enabled, the method will wrap around to the first "
@@ -51355,15 +51633,15 @@ msgid ""
"otherwise it returns [code]null[/code]."
msgstr ""
-#: doc/classes/TreeItem.xml:215
+#: doc/classes/TreeItem.xml:216
msgid "Returns the parent TreeItem."
msgstr ""
-#: doc/classes/TreeItem.xml:222
+#: doc/classes/TreeItem.xml:223
msgid "Returns the previous TreeItem in the tree."
msgstr ""
-#: doc/classes/TreeItem.xml:231
+#: doc/classes/TreeItem.xml:232
msgid ""
"Returns the previous visible TreeItem in the tree.\n"
"If [code]wrap[/code] is enabled, the method will wrap around to the last "
@@ -51371,89 +51649,92 @@ msgid ""
"otherwise it returns [code]null[/code]."
msgstr ""
-#: doc/classes/TreeItem.xml:257
+#: doc/classes/TreeItem.xml:258
msgid "Returns the given column's text."
msgstr ""
-#: doc/classes/TreeItem.xml:266
+#: doc/classes/TreeItem.xml:267
msgid "Returns the given column's text alignment."
msgstr ""
-#: doc/classes/TreeItem.xml:275
+#: doc/classes/TreeItem.xml:276
msgid "Returns the given column's tooltip."
msgstr ""
-#: doc/classes/TreeItem.xml:286
+#: doc/classes/TreeItem.xml:287
msgid ""
"Returns [code]true[/code] if the button at index [code]button_idx[/code] for "
"the given column is disabled."
msgstr ""
-#: doc/classes/TreeItem.xml:295
+#: doc/classes/TreeItem.xml:296
msgid "Returns [code]true[/code] if the given column is checked."
msgstr ""
-#: doc/classes/TreeItem.xml:312
+#: doc/classes/TreeItem.xml:313
msgid "Returns [code]true[/code] if column [code]column[/code] is editable."
msgstr ""
-#: doc/classes/TreeItem.xml:321
+#: doc/classes/TreeItem.xml:322
msgid "Returns [code]true[/code] if column [code]column[/code] is selectable."
msgstr ""
-#: doc/classes/TreeItem.xml:330
+#: doc/classes/TreeItem.xml:331
msgid "Returns [code]true[/code] if column [code]column[/code] is selected."
msgstr ""
-#: doc/classes/TreeItem.xml:337
+#: doc/classes/TreeItem.xml:338
msgid "Moves this TreeItem to the bottom in the [Tree] hierarchy."
msgstr ""
-#: doc/classes/TreeItem.xml:344
+#: doc/classes/TreeItem.xml:345
msgid "Moves this TreeItem to the top in the [Tree] hierarchy."
msgstr ""
-#: doc/classes/TreeItem.xml:353
-msgid "Removes the given child TreeItem."
+#: doc/classes/TreeItem.xml:354
+msgid ""
+"Removes the given child [TreeItem] and all its children from the [Tree]. "
+"Note that it doesn't free the item from memory, so it can be reused later. "
+"To completely remove a [TreeItem] use [method Object.free]."
msgstr ""
-#: doc/classes/TreeItem.xml:362
+#: doc/classes/TreeItem.xml:363
msgid "Selects the column [code]column[/code]."
msgstr ""
-#: doc/classes/TreeItem.xml:375
+#: doc/classes/TreeItem.xml:376
msgid ""
"Sets the given column's button [Texture2D] at index [code]button_idx[/code] "
"to [code]button[/code]."
msgstr ""
-#: doc/classes/TreeItem.xml:388
+#: doc/classes/TreeItem.xml:389
msgid ""
"If [code]true[/code], disables the button at index [code]button_idx[/code] "
"in column [code]column[/code]."
msgstr ""
-#: doc/classes/TreeItem.xml:399
+#: doc/classes/TreeItem.xml:400
msgid ""
"Sets the given column's cell mode to [code]mode[/code]. See [enum "
"TreeCellMode] constants."
msgstr ""
-#: doc/classes/TreeItem.xml:410
+#: doc/classes/TreeItem.xml:411
msgid "If [code]true[/code], the column [code]column[/code] is checked."
msgstr ""
-#: doc/classes/TreeItem.xml:433
+#: doc/classes/TreeItem.xml:434
msgid ""
"Sets the given column's custom background color and whether to just use it "
"as an outline."
msgstr ""
-#: doc/classes/TreeItem.xml:444
+#: doc/classes/TreeItem.xml:445
msgid "Sets the given column's custom color."
msgstr ""
-#: doc/classes/TreeItem.xml:457
+#: doc/classes/TreeItem.xml:458
msgid ""
"Sets the given column's custom draw callback to [code]callback[/code] method "
"on [code]object[/code].\n"
@@ -51461,82 +51742,82 @@ msgid ""
"is drawn and its position and size as a [Rect2]."
msgstr ""
-#: doc/classes/TreeItem.xml:469
+#: doc/classes/TreeItem.xml:470
msgid "If [code]true[/code], column [code]column[/code] is editable."
msgstr ""
-#: doc/classes/TreeItem.xml:480
+#: doc/classes/TreeItem.xml:481
msgid ""
"If [code]true[/code], column [code]column[/code] is expanded to the right."
msgstr ""
-#: doc/classes/TreeItem.xml:491
+#: doc/classes/TreeItem.xml:492
msgid "Sets the given column's icon [Texture2D]."
msgstr ""
-#: doc/classes/TreeItem.xml:502
+#: doc/classes/TreeItem.xml:503
msgid "Sets the given column's icon's maximum width."
msgstr ""
-#: doc/classes/TreeItem.xml:513
+#: doc/classes/TreeItem.xml:514
msgid "Modulates the given column's icon with [code]modulate[/code]."
msgstr ""
-#: doc/classes/TreeItem.xml:524
+#: doc/classes/TreeItem.xml:525
msgid "Sets the given column's icon's texture region."
msgstr ""
-#: doc/classes/TreeItem.xml:571
+#: doc/classes/TreeItem.xml:572
msgid "If [code]true[/code], the given column is selectable."
msgstr ""
-#: doc/classes/TreeItem.xml:592
+#: doc/classes/TreeItem.xml:593
msgid ""
"Sets the given column's text alignment. See [enum TextAlign] for possible "
"values."
msgstr ""
-#: doc/classes/TreeItem.xml:603
+#: doc/classes/TreeItem.xml:604
msgid "Sets the given column's tooltip text."
msgstr ""
-#: doc/classes/TreeItem.xml:609
+#: doc/classes/TreeItem.xml:610
msgid "If [code]true[/code], the TreeItem is collapsed."
msgstr ""
-#: doc/classes/TreeItem.xml:612
+#: doc/classes/TreeItem.xml:613
msgid "The custom minimum height."
msgstr ""
-#: doc/classes/TreeItem.xml:615
+#: doc/classes/TreeItem.xml:616
msgid "If [code]true[/code], folding is disabled for this TreeItem."
msgstr ""
-#: doc/classes/TreeItem.xml:620
+#: doc/classes/TreeItem.xml:621
msgid "Cell contains a string."
msgstr ""
-#: doc/classes/TreeItem.xml:623
+#: doc/classes/TreeItem.xml:624
msgid "Cell can be checked."
msgstr ""
-#: doc/classes/TreeItem.xml:626
+#: doc/classes/TreeItem.xml:627
msgid "Cell contains a range."
msgstr ""
-#: doc/classes/TreeItem.xml:629
+#: doc/classes/TreeItem.xml:630
msgid "Cell contains an icon."
msgstr ""
-#: doc/classes/TreeItem.xml:634
+#: doc/classes/TreeItem.xml:635
msgid "Align text to the left. See [code]set_text_align()[/code]."
msgstr ""
-#: doc/classes/TreeItem.xml:637
+#: doc/classes/TreeItem.xml:638
msgid "Center text. See [code]set_text_align()[/code]."
msgstr ""
-#: doc/classes/TreeItem.xml:640
+#: doc/classes/TreeItem.xml:641
msgid "Align text to the right. See [code]set_text_align()[/code]."
msgstr ""
@@ -51562,8 +51843,8 @@ msgid ""
"know the final values in advance. For example, interpolating a dynamically-"
"chosen camera zoom value is best done with a [Tween] node; it would be "
"difficult to do the same thing with an [AnimationPlayer] node.\n"
-"Here is a brief usage example that causes a 2D node to move smoothly between "
-"two positions:\n"
+"Here is a brief usage example that makes a 2D node move smoothly between two "
+"positions:\n"
"[codeblock]\n"
"var tween = get_node(\"Tween\")\n"
"tween.interpolate_property($Node2D, \"position\",\n"
@@ -51578,15 +51859,18 @@ msgid ""
"where it would only apply to that particular component.\n"
"Many of the methods accept [code]trans_type[/code] and [code]ease_type[/"
"code]. The first accepts an [enum TransitionType] constant, and refers to "
-"the way the timing of the animation is handled (see [code]http://easings.net/"
-"[/code] for some examples). The second accepts an [enum EaseType] constant, "
-"and controls the where [code]trans_type[/code] is applied to the "
-"interpolation (in the beginning, the end, or both). If you don't know which "
-"transition and easing to pick, you can try different [enum TransitionType] "
-"constants with [constant EASE_IN_OUT], and use the one that looks best."
+"the way the timing of the animation is handled (see [url=https://easings."
+"net/]easings.net[/url] for some examples). The second accepts an [enum "
+"EaseType] constant, and controls the where [code]trans_type[/code] is "
+"applied to the interpolation (in the beginning, the end, or both). If you "
+"don't know which transition and easing to pick, you can try different [enum "
+"TransitionType] constants with [constant EASE_IN_OUT], and use the one that "
+"looks best.\n"
+"[b][url=https://raw.githubusercontent.com/godotengine/godot-docs/master/img/"
+"tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url][/b]"
msgstr ""
-#: doc/classes/Tween.xml:45
+#: doc/classes/Tween.xml:46
msgid ""
"Follows [code]method[/code] of [code]object[/code] and applies the returned "
"value on [code]target_method[/code] of [code]target[/code], beginning from "
@@ -51598,7 +51882,7 @@ msgid ""
"information."
msgstr ""
-#: doc/classes/Tween.xml:71
+#: doc/classes/Tween.xml:72
msgid ""
"Follows [code]property[/code] of [code]object[/code] and applies it on "
"[code]target_property[/code] of [code]target[/code], beginning from "
@@ -51610,21 +51894,21 @@ msgid ""
"information."
msgstr ""
-#: doc/classes/Tween.xml:79
+#: doc/classes/Tween.xml:80
msgid ""
"Returns the total time needed for all tweens to end. If you have two tweens, "
"one lasting 10 seconds and the other 20 seconds, it would return 20 seconds, "
"as by that time all tweens would have finished."
msgstr ""
-#: doc/classes/Tween.xml:102
+#: doc/classes/Tween.xml:103
msgid ""
"Calls [code]callback[/code] of [code]object[/code] after [code]duration[/"
"code]. [code]arg1[/code]-[code]arg5[/code] are arguments to be passed to the "
"callback."
msgstr ""
-#: doc/classes/Tween.xml:125
+#: doc/classes/Tween.xml:126
msgid ""
"Calls [code]callback[/code] of [code]object[/code] after [code]duration[/"
"code] on the main thread (similar to [method Object.call_deferred]). "
@@ -51632,7 +51916,7 @@ msgid ""
"callback."
msgstr ""
-#: doc/classes/Tween.xml:148
+#: doc/classes/Tween.xml:149
msgid ""
"Animates [code]method[/code] of [code]object[/code] from [code]initial_val[/"
"code] to [code]final_val[/code] for [code]duration[/code] seconds, "
@@ -51644,7 +51928,7 @@ msgid ""
"information."
msgstr ""
-#: doc/classes/Tween.xml:172
+#: doc/classes/Tween.xml:173
msgid ""
"Animates [code]property[/code] of [code]object[/code] from "
"[code]initial_val[/code] to [code]final_val[/code] for [code]duration[/code] "
@@ -51656,72 +51940,72 @@ msgid ""
"information."
msgstr ""
-#: doc/classes/Tween.xml:180
+#: doc/classes/Tween.xml:181
msgid ""
"Returns [code]true[/code] if any tweens are currently running.\n"
"[b]Note:[/b] This method doesn't consider tweens that have ended."
msgstr ""
-#: doc/classes/Tween.xml:192
+#: doc/classes/Tween.xml:193
msgid ""
"Stops animation and removes a tween, given its object and property/method "
"pair. By default, all tweens are removed, unless [code]key[/code] is "
"specified."
msgstr ""
-#: doc/classes/Tween.xml:199
+#: doc/classes/Tween.xml:200
msgid "Stops animation and removes all tweens."
msgstr ""
-#: doc/classes/Tween.xml:210
+#: doc/classes/Tween.xml:211
msgid ""
"Resets a tween to its initial value (the one given, not the one before the "
"tween), given its object and property/method pair. By default, all tweens "
"are removed, unless [code]key[/code] is specified."
msgstr ""
-#: doc/classes/Tween.xml:217
+#: doc/classes/Tween.xml:218
msgid ""
"Resets all tweens to their initial values (the ones given, not those before "
"the tween)."
msgstr ""
-#: doc/classes/Tween.xml:228
+#: doc/classes/Tween.xml:229
msgid ""
"Continues animating a stopped tween, given its object and property/method "
"pair. By default, all tweens are resumed, unless [code]key[/code] is "
"specified."
msgstr ""
-#: doc/classes/Tween.xml:235
+#: doc/classes/Tween.xml:236
msgid "Continues animating all stopped tweens."
msgstr ""
-#: doc/classes/Tween.xml:244
+#: doc/classes/Tween.xml:245
msgid "Sets the interpolation to the given [code]time[/code] in seconds."
msgstr ""
-#: doc/classes/Tween.xml:253
+#: doc/classes/Tween.xml:254
msgid ""
"Activates/deactivates the tween. See also [method stop_all] and [method "
"resume_all]."
msgstr ""
-#: doc/classes/Tween.xml:260
+#: doc/classes/Tween.xml:261
msgid "Starts the tween. You can define animations both before and after this."
msgstr ""
-#: doc/classes/Tween.xml:271
+#: doc/classes/Tween.xml:272
msgid ""
"Stops a tween, given its object and property/method pair. By default, all "
"tweens are stopped, unless [code]key[/code] is specified."
msgstr ""
-#: doc/classes/Tween.xml:278
+#: doc/classes/Tween.xml:279
msgid "Stops animating all tweens."
msgstr ""
-#: doc/classes/Tween.xml:303
+#: doc/classes/Tween.xml:304
msgid ""
"Animates [code]method[/code] of [code]object[/code] from the value returned "
"by [code]initial_method[/code] to [code]final_val[/code] for [code]duration[/"
@@ -51733,7 +52017,7 @@ msgid ""
"information."
msgstr ""
-#: doc/classes/Tween.xml:329
+#: doc/classes/Tween.xml:330
msgid ""
"Animates [code]property[/code] of [code]object[/code] from the current value "
"of the [code]initial_val[/code] property of [code]initial[/code] to "
@@ -51745,15 +52029,15 @@ msgid ""
"information."
msgstr ""
-#: doc/classes/Tween.xml:337
+#: doc/classes/Tween.xml:338
msgid "Returns the current time of the tween."
msgstr ""
-#: doc/classes/Tween.xml:343
+#: doc/classes/Tween.xml:344
msgid "The tween's animation process thread. See [enum TweenProcessMode]."
msgstr ""
-#: doc/classes/Tween.xml:346
+#: doc/classes/Tween.xml:347
msgid ""
"The tween's speed multiplier. For example, set it to [code]1.0[/code] for "
"normal speed, [code]2.0[/code] for two times normal speed, or [code]0.5[/"
@@ -51761,100 +52045,100 @@ msgid ""
"animation, but see also [method set_active] or [method stop_all] for this."
msgstr ""
-#: doc/classes/Tween.xml:349
+#: doc/classes/Tween.xml:350
msgid "If [code]true[/code], the tween loops."
msgstr ""
-#: doc/classes/Tween.xml:355
+#: doc/classes/Tween.xml:356
msgid "Emitted when all processes in a tween end."
msgstr ""
-#: doc/classes/Tween.xml:364
+#: doc/classes/Tween.xml:365
msgid "Emitted when a tween ends."
msgstr ""
-#: doc/classes/Tween.xml:373
+#: doc/classes/Tween.xml:374
msgid "Emitted when a tween starts."
msgstr ""
-#: doc/classes/Tween.xml:386
+#: doc/classes/Tween.xml:387
msgid "Emitted at each step of the animation."
msgstr ""
-#: doc/classes/Tween.xml:392
+#: doc/classes/Tween.xml:393
msgid "The tween updates with the [code]_physics_process[/code] callback."
msgstr ""
-#: doc/classes/Tween.xml:395
+#: doc/classes/Tween.xml:396
msgid "The tween updates with the [code]_process[/code] callback."
msgstr ""
-#: doc/classes/Tween.xml:398
+#: doc/classes/Tween.xml:399
msgid "The animation is interpolated linearly."
msgstr ""
-#: doc/classes/Tween.xml:401
+#: doc/classes/Tween.xml:402
msgid "The animation is interpolated using a sine function."
msgstr ""
-#: doc/classes/Tween.xml:404
+#: doc/classes/Tween.xml:405
msgid ""
"The animation is interpolated with a quintic (to the power of 5) function."
msgstr ""
-#: doc/classes/Tween.xml:407
+#: doc/classes/Tween.xml:408
msgid ""
"The animation is interpolated with a quartic (to the power of 4) function."
msgstr ""
-#: doc/classes/Tween.xml:410
+#: doc/classes/Tween.xml:411
msgid ""
"The animation is interpolated with a quadratic (to the power of 2) function."
msgstr ""
-#: doc/classes/Tween.xml:413
+#: doc/classes/Tween.xml:414
msgid ""
"The animation is interpolated with an exponential (to the power of x) "
"function."
msgstr ""
-#: doc/classes/Tween.xml:416
+#: doc/classes/Tween.xml:417
msgid ""
"The animation is interpolated with elasticity, wiggling around the edges."
msgstr ""
-#: doc/classes/Tween.xml:419
+#: doc/classes/Tween.xml:420
msgid ""
"The animation is interpolated with a cubic (to the power of 3) function."
msgstr ""
-#: doc/classes/Tween.xml:422
+#: doc/classes/Tween.xml:423
msgid "The animation is interpolated with a function using square roots."
msgstr ""
-#: doc/classes/Tween.xml:425
+#: doc/classes/Tween.xml:426
msgid "The animation is interpolated by bouncing at the end."
msgstr ""
-#: doc/classes/Tween.xml:428
+#: doc/classes/Tween.xml:429
msgid "The animation is interpolated backing out at ends."
msgstr ""
-#: doc/classes/Tween.xml:431
+#: doc/classes/Tween.xml:432
msgid "The interpolation starts slowly and speeds up towards the end."
msgstr ""
-#: doc/classes/Tween.xml:434
+#: doc/classes/Tween.xml:435
msgid "The interpolation starts quickly and slows down towards the end."
msgstr ""
-#: doc/classes/Tween.xml:437
+#: doc/classes/Tween.xml:438
msgid ""
"A combination of [constant EASE_IN] and [constant EASE_OUT]. The "
"interpolation is slowest at both ends."
msgstr ""
-#: doc/classes/Tween.xml:440
+#: doc/classes/Tween.xml:441
msgid ""
"A combination of [constant EASE_IN] and [constant EASE_OUT]. The "
"interpolation is fastest at both ends."
@@ -53458,69 +53742,90 @@ msgstr ""
msgid "If [code]true[/code], the viewport will process 3D audio streams."
msgstr ""
-#: doc/classes/Viewport.xml:199
+#: doc/classes/Viewport.xml:195
+msgid ""
+"Sets the default filter mode used by [CanvasItem]s in this Viewport. See "
+"[enum DefaultCanvasItemTextureFilter] for options."
+msgstr ""
+
+#: doc/classes/Viewport.xml:198
+msgid ""
+"Sets the default repeat mode used by [CanvasItem]s in this Viewport. See "
+"[enum DefaultCanvasItemTextureRepeat] for options."
+msgstr ""
+
+#: doc/classes/Viewport.xml:201
msgid ""
"The canvas transform of the viewport, useful for changing the on-screen "
"positions of all child [CanvasItem]s. This is relative to the global canvas "
"transform of the viewport."
msgstr ""
-#: doc/classes/Viewport.xml:202
+#: doc/classes/Viewport.xml:204
msgid "The overlay mode for test rendered geometry in debug purposes."
msgstr ""
-#: doc/classes/Viewport.xml:205
+#: doc/classes/Viewport.xml:207
msgid ""
"The global canvas transform of the viewport. The canvas transform is "
"relative to this."
msgstr ""
-#: doc/classes/Viewport.xml:208
+#: doc/classes/Viewport.xml:210
msgid "If [code]true[/code], the viewport will not receive input event."
msgstr ""
-#: doc/classes/Viewport.xml:213
+#: doc/classes/Viewport.xml:215
msgid ""
"If [code]true[/code], the GUI controls on the viewport will lay pixel "
"perfectly."
msgstr ""
-#: doc/classes/Viewport.xml:218
+#: doc/classes/Viewport.xml:220
msgid ""
"The multisample anti-aliasing mode. A higher number results in smoother "
"edges at the cost of significantly worse performance. A value of 4 is best "
"unless targeting very high-end systems."
msgstr ""
-#: doc/classes/Viewport.xml:221
+#: doc/classes/Viewport.xml:223
msgid ""
"If [code]true[/code], the viewport will use [World3D] defined in "
"[code]world[/code] property."
msgstr ""
-#: doc/classes/Viewport.xml:224
+#: doc/classes/Viewport.xml:226
msgid ""
"If [code]true[/code], the objects rendered by viewport become subjects of "
"mouse picking process."
msgstr ""
-#: doc/classes/Viewport.xml:227
+#: doc/classes/Viewport.xml:229
+msgid ""
+"Sets the screen-space antialiasing method used. Screen-space antialiasing "
+"works by selectively blurring edges in a post-process shader. It differs "
+"from MSAA which takes multiple coverage samples while rendering objects. "
+"Screen-space AA methods are typically faster than MSAA and will smooth out "
+"specular aliasing, but tend to make scenes appear blurry."
+msgstr ""
+
+#: doc/classes/Viewport.xml:232
msgid "The subdivision amount of the first quadrant on the shadow atlas."
msgstr ""
-#: doc/classes/Viewport.xml:230
+#: doc/classes/Viewport.xml:235
msgid "The subdivision amount of the second quadrant on the shadow atlas."
msgstr ""
-#: doc/classes/Viewport.xml:233
+#: doc/classes/Viewport.xml:238
msgid "The subdivision amount of the third quadrant on the shadow atlas."
msgstr ""
-#: doc/classes/Viewport.xml:236
+#: doc/classes/Viewport.xml:241
msgid "The subdivision amount of the fourth quadrant on the shadow atlas."
msgstr ""
-#: doc/classes/Viewport.xml:239
+#: doc/classes/Viewport.xml:244
msgid ""
"The shadow atlas' resolution (used for omni and spot lights). The value will "
"be rounded up to the nearest power of 2.\n"
@@ -53529,136 +53834,177 @@ msgid ""
"manually."
msgstr ""
-#: doc/classes/Viewport.xml:243
+#: doc/classes/Viewport.xml:248
msgid ""
"If [code]true[/code], the viewport should render its background as "
"transparent."
msgstr ""
-#: doc/classes/Viewport.xml:246
+#: doc/classes/Viewport.xml:251
msgid "The custom [World3D] which can be used as 3D environment source."
msgstr ""
-#: doc/classes/Viewport.xml:249
+#: doc/classes/Viewport.xml:254
msgid "The custom [World2D] which can be used as 2D environment source."
msgstr ""
-#: doc/classes/Viewport.xml:257
+#: doc/classes/Viewport.xml:262
msgid "Emitted when a Control node grabs keyboard focus."
msgstr ""
-#: doc/classes/Viewport.xml:262
+#: doc/classes/Viewport.xml:267
msgid ""
"Emitted when the size of the viewport is changed, whether by resizing of "
"window, or some other means."
msgstr ""
-#: doc/classes/Viewport.xml:268
+#: doc/classes/Viewport.xml:273
msgid "This quadrant will not be used."
msgstr ""
-#: doc/classes/Viewport.xml:271
+#: doc/classes/Viewport.xml:276
msgid "This quadrant will only be used by one shadow map."
msgstr ""
-#: doc/classes/Viewport.xml:274
+#: doc/classes/Viewport.xml:279
msgid "This quadrant will be split in 4 and used by up to 4 shadow maps."
msgstr ""
-#: doc/classes/Viewport.xml:277
+#: doc/classes/Viewport.xml:282
msgid "This quadrant will be split 16 ways and used by up to 16 shadow maps."
msgstr ""
-#: doc/classes/Viewport.xml:280
+#: doc/classes/Viewport.xml:285
msgid "This quadrant will be split 64 ways and used by up to 64 shadow maps."
msgstr ""
-#: doc/classes/Viewport.xml:283
+#: doc/classes/Viewport.xml:288
msgid ""
"This quadrant will be split 256 ways and used by up to 256 shadow maps. "
"Unless the [member shadow_atlas_size] is very high, the shadows in this "
"quadrant will be very low resolution."
msgstr ""
-#: doc/classes/Viewport.xml:286
+#: doc/classes/Viewport.xml:291
msgid ""
"This quadrant will be split 1024 ways and used by up to 1024 shadow maps. "
"Unless the [member shadow_atlas_size] is very high, the shadows in this "
"quadrant will be very low resolution."
msgstr ""
-#: doc/classes/Viewport.xml:289
+#: doc/classes/Viewport.xml:294
msgid "Represents the size of the [enum ShadowAtlasQuadrantSubdiv] enum."
msgstr ""
-#: doc/classes/Viewport.xml:292
-msgid "Amount of objects in frame."
+#: doc/classes/Viewport.xml:297
+msgid ""
+"Multisample antialiasing mode disabled. This is the default value, and also "
+"the fastest setting."
msgstr ""
-#: doc/classes/Viewport.xml:295
-msgid "Amount of vertices in frame."
+#: doc/classes/Viewport.xml:300
+msgid "Use 2x Multisample Antialiasing."
msgstr ""
-#: doc/classes/Viewport.xml:298
-msgid "Amount of material changes in frame."
+#: doc/classes/Viewport.xml:303
+msgid "Use 4x Multisample Antialiasing."
msgstr ""
-#: doc/classes/Viewport.xml:301
-msgid "Amount of shader changes in frame."
+#: doc/classes/Viewport.xml:306
+msgid ""
+"Use 8x Multisample Antialiasing. Likely unsupported on low-end and older "
+"hardware."
msgstr ""
-#: doc/classes/Viewport.xml:304
-msgid "Amount of surface changes in frame."
+#: doc/classes/Viewport.xml:309
+msgid ""
+"Use 16x Multisample Antialiasing. Likely unsupported on medium and low-end "
+"hardware."
msgstr ""
-#: doc/classes/Viewport.xml:307
-msgid "Amount of draw calls in frame."
+#: doc/classes/Viewport.xml:312
+msgid "Represents the size of the [enum MSAA] enum."
msgstr ""
-#: doc/classes/Viewport.xml:310
-msgid "Represents the size of the [enum RenderInfo] enum."
+#: doc/classes/Viewport.xml:315
+msgid "Do not perform any antialiasing in the full screen post-process."
msgstr ""
-#: doc/classes/Viewport.xml:313
-msgid "Objects are displayed normally."
+#: doc/classes/Viewport.xml:318
+msgid ""
+"Use fast approximate antialiasing. FXAA is a popular screen-space "
+"antialising method, which is fast but will make the image look blurry, "
+"especially at lower resolutions. It can still work relatively well at large "
+"resolutions such as 1440p and 4K."
msgstr ""
-#: doc/classes/Viewport.xml:316
-msgid "Objects are displayed without light information."
+#: doc/classes/Viewport.xml:321
+msgid "Represents the size of the [enum ScreenSpaceAA] enum."
msgstr ""
-#: doc/classes/Viewport.xml:319
-msgid ""
-"Objected are displayed semi-transparent with additive blending so you can "
-"see where they intersect."
+#: doc/classes/Viewport.xml:324
+msgid "Amount of objects in frame."
msgstr ""
-#: doc/classes/Viewport.xml:322
-msgid "Objects are displayed in wireframe style."
+#: doc/classes/Viewport.xml:327
+msgid "Amount of vertices in frame."
+msgstr ""
+
+#: doc/classes/Viewport.xml:330
+msgid "Amount of material changes in frame."
+msgstr ""
+
+#: doc/classes/Viewport.xml:333
+msgid "Amount of shader changes in frame."
+msgstr ""
+
+#: doc/classes/Viewport.xml:336
+msgid "Amount of surface changes in frame."
msgstr ""
#: doc/classes/Viewport.xml:339
-msgid "Multisample anti-aliasing mode disabled. This is the default value."
+msgid "Amount of draw calls in frame."
msgstr ""
#: doc/classes/Viewport.xml:342
-msgid "Use 2x Multisample Antialiasing."
+msgid "Represents the size of the [enum RenderInfo] enum."
msgstr ""
#: doc/classes/Viewport.xml:345
-msgid "Use 4x Multisample Antialiasing."
+msgid "Objects are displayed normally."
msgstr ""
-#: doc/classes/Viewport.xml:348
+#: doc/classes/Viewport.xml:356
+msgid "Objects are displayed in wireframe style."
+msgstr ""
+
+#: doc/classes/Viewport.xml:378
msgid ""
-"Use 8x Multisample Antialiasing. Likely unsupported on low-end and older "
-"hardware."
+"Draws the screen-space ambient occlusion texture instead of the scene so "
+"that you can clearly see how it is affecting objects. In order for this "
+"display mode to work, you must have [member Environment.ssao_enabled] set in "
+"your [WorldEnvironment]."
msgstr ""
-#: doc/classes/Viewport.xml:351
+#: doc/classes/Viewport.xml:384
msgid ""
-"Use 16x Multisample Antialiasing. Likely unsupported on medium and low-end "
-"hardware."
+"Colors each PSSM split for the [DirectionalLight3D]s in the scene a "
+"different color so you can see where the splits are. In order, they will be "
+"colored red, green, blue, and yellow."
+msgstr ""
+
+#: doc/classes/Viewport.xml:387
+msgid ""
+"Draws the decal atlas used by [Decal]s and light projector textures in the "
+"upper left quadrant of the [Viewport]."
+msgstr ""
+
+#: doc/classes/Viewport.xml:402
+msgid "Max value for [enum DefaultCanvasItemTextureFilter] enum."
+msgstr ""
+
+#: doc/classes/Viewport.xml:414
+msgid "Max value for [enum DefaultCanvasItemTextureRepeat] enum."
msgstr ""
#: doc/classes/ViewportTexture.xml:4
@@ -53680,7 +54026,7 @@ msgid ""
msgstr ""
#: doc/classes/VisibilityEnabler2D.xml:4 doc/classes/VisibilityEnabler3D.xml:4
-msgid "Enables certain nodes only when visible."
+msgid "Enables certain nodes only when approximately visible."
msgstr ""
#: doc/classes/VisibilityEnabler2D.xml:7
@@ -53688,78 +54034,82 @@ msgid ""
"The VisibilityEnabler2D will disable [RigidBody2D], [AnimationPlayer], and "
"other nodes when they are not visible. It will only affect nodes with the "
"same root node as the VisibilityEnabler2D, and the root node itself.\n"
-"Note that VisibilityEnabler2D will not affect nodes added after scene "
+"[b]Note:[/b] For performance reasons, VisibilityEnabler2D uses an "
+"approximate heuristic with precision determined by [member ProjectSettings."
+"world/2d/cell_size]. If you need exact visibility checking, use another "
+"method such as adding an [Area2D] node as a child of a [Camera2D] node.\n"
+"[b]Note:[/b] VisibilityEnabler2D will not affect nodes added after scene "
"initialization."
msgstr ""
-#: doc/classes/VisibilityEnabler2D.xml:19
-#: doc/classes/VisibilityEnabler3D.xml:19
+#: doc/classes/VisibilityEnabler2D.xml:20
+#: doc/classes/VisibilityEnabler3D.xml:20
msgid ""
"Returns whether the enabler identified by given [enum Enabler] constant is "
"active."
msgstr ""
-#: doc/classes/VisibilityEnabler2D.xml:30
-#: doc/classes/VisibilityEnabler3D.xml:30
+#: doc/classes/VisibilityEnabler2D.xml:31
+#: doc/classes/VisibilityEnabler3D.xml:31
msgid ""
"Sets active state of the enabler identified by given [enum Enabler] constant."
msgstr ""
-#: doc/classes/VisibilityEnabler2D.xml:36
+#: doc/classes/VisibilityEnabler2D.xml:37
msgid "If [code]true[/code], [RigidBody2D] nodes will be paused."
msgstr ""
-#: doc/classes/VisibilityEnabler2D.xml:39
+#: doc/classes/VisibilityEnabler2D.xml:40
msgid "If [code]true[/code], [AnimatedSprite2D] nodes will be paused."
msgstr ""
-#: doc/classes/VisibilityEnabler2D.xml:42
-#: doc/classes/VisibilityEnabler3D.xml:39
+#: doc/classes/VisibilityEnabler2D.xml:43
+#: doc/classes/VisibilityEnabler3D.xml:40
msgid "If [code]true[/code], [AnimationPlayer] nodes will be paused."
msgstr ""
-#: doc/classes/VisibilityEnabler2D.xml:45
+#: doc/classes/VisibilityEnabler2D.xml:46
msgid "If [code]true[/code], [GPUParticles2D] nodes will be paused."
msgstr ""
-#: doc/classes/VisibilityEnabler2D.xml:48
+#: doc/classes/VisibilityEnabler2D.xml:49
msgid ""
"If [code]true[/code], the parent's [method Node._physics_process] will be "
"stopped."
msgstr ""
-#: doc/classes/VisibilityEnabler2D.xml:51
+#: doc/classes/VisibilityEnabler2D.xml:52
msgid ""
"If [code]true[/code], the parent's [method Node._process] will be stopped."
msgstr ""
-#: doc/classes/VisibilityEnabler2D.xml:56
-#: doc/classes/VisibilityEnabler3D.xml:44
+#: doc/classes/VisibilityEnabler2D.xml:57
+#: doc/classes/VisibilityEnabler3D.xml:45
msgid "This enabler will pause [AnimationPlayer] nodes."
msgstr ""
-#: doc/classes/VisibilityEnabler2D.xml:59
+#: doc/classes/VisibilityEnabler2D.xml:60
msgid "This enabler will freeze [RigidBody2D] nodes."
msgstr ""
-#: doc/classes/VisibilityEnabler2D.xml:62
+#: doc/classes/VisibilityEnabler2D.xml:63
msgid "This enabler will stop [GPUParticles2D] nodes."
msgstr ""
-#: doc/classes/VisibilityEnabler2D.xml:65
+#: doc/classes/VisibilityEnabler2D.xml:66
msgid "This enabler will stop the parent's _process function."
msgstr ""
-#: doc/classes/VisibilityEnabler2D.xml:68
+#: doc/classes/VisibilityEnabler2D.xml:69
msgid "This enabler will stop the parent's _physics_process function."
msgstr ""
-#: doc/classes/VisibilityEnabler2D.xml:71
+#: doc/classes/VisibilityEnabler2D.xml:72
msgid "This enabler will stop [AnimatedSprite2D] nodes animations."
msgstr ""
-#: doc/classes/VisibilityEnabler2D.xml:74
-#: doc/classes/VisibilityEnabler3D.xml:50
+#: doc/classes/VisibilityEnabler2D.xml:75
+#: doc/classes/VisibilityEnabler3D.xml:51
msgid "Represents the size of the [enum Enabler] enum."
msgstr ""
@@ -53768,31 +54118,39 @@ msgid ""
"The VisibilityEnabler3D will disable [RigidBody3D] and [AnimationPlayer] "
"nodes when they are not visible. It will only affect other nodes within the "
"same scene as the VisibilityEnabler3D itself.\n"
-"Note that VisibilityEnabler3D will not affect nodes added after scene "
+"[b]Note:[/b] VisibilityEnabler3D uses an approximate heuristic for "
+"performance reasons. It doesn't take walls and other occlusion into account. "
+"If you need exact visibility checking, use another method such as adding an "
+"[Area3D] node as a child of a [Camera3D] node.\n"
+"[b]Note:[/b] VisibilityEnabler3D will not affect nodes added after scene "
"initialization."
msgstr ""
-#: doc/classes/VisibilityEnabler3D.xml:36
+#: doc/classes/VisibilityEnabler3D.xml:37
msgid "If [code]true[/code], [RigidBody3D] nodes will be paused."
msgstr ""
-#: doc/classes/VisibilityEnabler3D.xml:47
+#: doc/classes/VisibilityEnabler3D.xml:48
msgid "This enabler will freeze [RigidBody3D] nodes."
msgstr ""
#: doc/classes/VisibilityNotifier2D.xml:4
#: doc/classes/VisibilityNotifier3D.xml:4
-msgid "Detects when the node is visible on screen."
+msgid "Detects approximately when the node is visible on screen."
msgstr ""
#: doc/classes/VisibilityNotifier2D.xml:7
msgid ""
"The VisibilityNotifier2D detects when it is visible on the screen. It also "
"notifies when its bounding rectangle enters or exits the screen or a "
-"viewport."
+"viewport.\n"
+"[b]Note:[/b] For performance reasons, VisibilityNotifier2D uses an "
+"approximate heuristic with precision determined by [member ProjectSettings."
+"world/2d/cell_size]. If you need exact visibility checking, use another "
+"method such as adding an [Area2D] node as a child of a [Camera2D] node."
msgstr ""
-#: doc/classes/VisibilityNotifier2D.xml:16
+#: doc/classes/VisibilityNotifier2D.xml:17
msgid ""
"If [code]true[/code], the bounding rectangle is on the screen.\n"
"[b]Note:[/b] It takes one frame for the node's visibility to be assessed "
@@ -53801,23 +54159,23 @@ msgid ""
"pass."
msgstr ""
-#: doc/classes/VisibilityNotifier2D.xml:23
+#: doc/classes/VisibilityNotifier2D.xml:24
msgid "The VisibilityNotifier2D's bounding rectangle."
msgstr ""
-#: doc/classes/VisibilityNotifier2D.xml:29
+#: doc/classes/VisibilityNotifier2D.xml:30
msgid "Emitted when the VisibilityNotifier2D enters the screen."
msgstr ""
-#: doc/classes/VisibilityNotifier2D.xml:34
+#: doc/classes/VisibilityNotifier2D.xml:35
msgid "Emitted when the VisibilityNotifier2D exits the screen."
msgstr ""
-#: doc/classes/VisibilityNotifier2D.xml:41
+#: doc/classes/VisibilityNotifier2D.xml:42
msgid "Emitted when the VisibilityNotifier2D enters a [Viewport]'s view."
msgstr ""
-#: doc/classes/VisibilityNotifier2D.xml:48
+#: doc/classes/VisibilityNotifier2D.xml:49
msgid "Emitted when the VisibilityNotifier2D exits a [Viewport]'s view."
msgstr ""
@@ -53825,10 +54183,14 @@ msgstr ""
msgid ""
"The VisibilityNotifier3D detects when it is visible on the screen. It also "
"notifies when its bounding rectangle enters or exits the screen or a "
-"[Camera3D]'s view."
+"[Camera3D]'s view.\n"
+"[b]Note:[/b] VisibilityNotifier3D uses an approximate heuristic for "
+"performance reasons. It doesn't take walls and other occlusion into account. "
+"If you need exact visibility checking, use another method such as adding an "
+"[Area3D] node as a child of a [Camera3D] node."
msgstr ""
-#: doc/classes/VisibilityNotifier3D.xml:16
+#: doc/classes/VisibilityNotifier3D.xml:17
msgid ""
"If [code]true[/code], the bounding box is on the screen.\n"
"[b]Note:[/b] It takes one frame for the node's visibility to be assessed "
@@ -53837,23 +54199,23 @@ msgid ""
"pass."
msgstr ""
-#: doc/classes/VisibilityNotifier3D.xml:23
+#: doc/classes/VisibilityNotifier3D.xml:24
msgid "The VisibilityNotifier3D's bounding box."
msgstr ""
-#: doc/classes/VisibilityNotifier3D.xml:31
+#: doc/classes/VisibilityNotifier3D.xml:32
msgid "Emitted when the VisibilityNotifier3D enters a [Camera3D]'s view."
msgstr ""
-#: doc/classes/VisibilityNotifier3D.xml:38
+#: doc/classes/VisibilityNotifier3D.xml:39
msgid "Emitted when the VisibilityNotifier3D exits a [Camera3D]'s view."
msgstr ""
-#: doc/classes/VisibilityNotifier3D.xml:43
+#: doc/classes/VisibilityNotifier3D.xml:44
msgid "Emitted when the VisibilityNotifier3D enters the screen."
msgstr ""
-#: doc/classes/VisibilityNotifier3D.xml:48
+#: doc/classes/VisibilityNotifier3D.xml:49
msgid "Emitted when the VisibilityNotifier3D exits the screen."
msgstr ""
@@ -56445,7 +56807,7 @@ msgstr ""
msgid "The background of the area below the grabber."
msgstr ""
-#: doc/classes/VSlider.xml:33
+#: doc/classes/VSlider.xml:35
msgid ""
"The background for the whole slider. Determines the width of the "
"[code]grabber_area[/code]."
@@ -57427,6 +57789,667 @@ msgstr ""
msgid "Unknown node."
msgstr ""
+#: doc/classes/XRAnchor3D.xml:4
+msgid "An anchor point in AR space."
+msgstr ""
+
+#: doc/classes/XRAnchor3D.xml:7
+msgid ""
+"The [XRAnchor3D] point is a spatial node that maps a real world location "
+"identified by the AR platform to a position within the game world. For "
+"example, as long as plane detection in ARKit is on, ARKit will identify and "
+"update the position of planes (tables, floors, etc) and create anchors for "
+"them.\n"
+"This node is mapped to one of the anchors through its unique ID. When you "
+"receive a signal that a new anchor is available, you should add this node to "
+"your scene for that anchor. You can predefine nodes and set the ID; the "
+"nodes will simply remain on 0,0,0 until a plane is recognized.\n"
+"Keep in mind that, as long as plane detection is enabled, the size, placing "
+"and orientation of an anchor will be updated as the detection logic learns "
+"more about the real world out there especially if only part of the surface "
+"is in view."
+msgstr ""
+
+#: doc/classes/XRAnchor3D.xml:18
+msgid "Returns the name given to this anchor."
+msgstr ""
+
+#: doc/classes/XRAnchor3D.xml:25
+msgid ""
+"Returns [code]true[/code] if the anchor is being tracked and [code]false[/"
+"code] if no anchor with this ID is currently known."
+msgstr ""
+
+#: doc/classes/XRAnchor3D.xml:32
+msgid ""
+"If provided by the [XRInterface], this returns a mesh object for the anchor. "
+"For an anchor, this can be a shape related to the object being tracked or it "
+"can be a mesh that provides topology related to the anchor and can be used "
+"to create shadows/reflections on surfaces or for generating collision shapes."
+msgstr ""
+
+#: doc/classes/XRAnchor3D.xml:39
+msgid ""
+"Returns a plane aligned with our anchor; handy for intersection testing."
+msgstr ""
+
+#: doc/classes/XRAnchor3D.xml:46
+msgid ""
+"Returns the estimated size of the plane that was detected. Say when the "
+"anchor relates to a table in the real world, this is the estimated size of "
+"the surface of that table."
+msgstr ""
+
+#: doc/classes/XRAnchor3D.xml:52
+msgid ""
+"The anchor's ID. You can set this before the anchor itself exists. The first "
+"anchor gets an ID of [code]1[/code], the second an ID of [code]2[/code], "
+"etc. When anchors get removed, the engine can then assign the corresponding "
+"ID to new anchors. The most common situation where anchors \"disappear\" is "
+"when the AR server identifies that two anchors represent different parts of "
+"the same plane and merges them."
+msgstr ""
+
+#: doc/classes/XRAnchor3D.xml:60
+msgid ""
+"Emitted when the mesh associated with the anchor changes or when one becomes "
+"available. This is especially important for topology that is constantly "
+"being [code]mesh_updated[/code]."
+msgstr ""
+
+#: doc/classes/XRCamera3D.xml:4
+msgid ""
+"A camera node with a few overrules for AR/VR applied, such as location "
+"tracking."
+msgstr ""
+
+#: doc/classes/XRCamera3D.xml:7
+msgid ""
+"This is a helper spatial node for our camera; note that, if stereoscopic "
+"rendering is applicable (VR-HMD), most of the camera properties are ignored, "
+"as the HMD information overrides them. The only properties that can be "
+"trusted are the near and far planes.\n"
+"The position and orientation of this node is automatically updated by the XR "
+"Server to represent the location of the HMD if such tracking is available "
+"and can thus be used by game logic. Note that, in contrast to the XR "
+"Controller, the render thread has access to the most up-to-date tracking "
+"data of the HMD and the location of the XRCamera3D can lag a few "
+"milliseconds behind what is used for rendering as a result."
+msgstr ""
+
+#: doc/classes/XRCamera3D.xml:11 doc/classes/XRController3D.xml:12
+#: doc/classes/XRInterface.xml:11 doc/classes/XROrigin3D.xml:13
+#: doc/classes/XRPositionalTracker.xml:12 doc/classes/XRServer.xml:10
+msgid "https://docs.godotengine.org/en/latest/tutorials/vr/index.html"
+msgstr ""
+
+#: doc/classes/XRController3D.xml:4
+msgid "A spatial node representing a spatially-tracked controller."
+msgstr ""
+
+#: doc/classes/XRController3D.xml:7
+msgid ""
+"This is a helper spatial node that is linked to the tracking of controllers. "
+"It also offers several handy passthroughs to the state of buttons and such "
+"on the controllers.\n"
+"Controllers are linked by their ID. You can create controller nodes before "
+"the controllers are available. If your game always uses two controllers (one "
+"for each hand), you can predefine the controllers with ID 1 and 2; they will "
+"become active as soon as the controllers are identified. If you expect "
+"additional controllers to be used, you should react to the signals and add "
+"XRController3D nodes to your scene.\n"
+"The position of the controller node is automatically updated by the "
+"[XRServer]. This makes this node ideal to add child nodes to visualize the "
+"controller."
+msgstr ""
+
+#: doc/classes/XRController3D.xml:19
+msgid ""
+"If active, returns the name of the associated controller if provided by the "
+"AR/VR SDK used."
+msgstr ""
+
+#: doc/classes/XRController3D.xml:26
+msgid ""
+"Returns the hand holding this controller, if known. See [enum "
+"XRPositionalTracker.TrackerHand]."
+msgstr ""
+
+#: doc/classes/XRController3D.xml:33
+msgid ""
+"Returns [code]true[/code] if the bound controller is active. XR systems "
+"attempt to track active controllers."
+msgstr ""
+
+#: doc/classes/XRController3D.xml:42
+msgid ""
+"Returns the value of the given axis for things like triggers, touchpads, "
+"etc. that are embedded into the controller."
+msgstr ""
+
+#: doc/classes/XRController3D.xml:49
+msgid ""
+"Returns the ID of the joystick object bound to this. Every controller "
+"tracked by the [XRServer] that has buttons and axis will also be registered "
+"as a joystick within Godot. This means that all the normal joystick tracking "
+"and input mapping will work for buttons and axis found on the AR/VR "
+"controllers. This ID is purely offered as information so you can link up the "
+"controller with its joystick entry."
+msgstr ""
+
+#: doc/classes/XRController3D.xml:56
+msgid ""
+"If provided by the [XRInterface], this returns a mesh associated with the "
+"controller. This can be used to visualize the controller."
+msgstr ""
+
+#: doc/classes/XRController3D.xml:65
+msgid ""
+"Returns [code]true[/code] if the button at index [code]button[/code] is "
+"pressed. See [enum JoystickList], in particular the [code]JOY_VR_*[/code] "
+"constants."
+msgstr ""
+
+#: doc/classes/XRController3D.xml:71
+msgid ""
+"The controller's ID.\n"
+"A controller ID of 0 is unbound and will always result in an inactive node. "
+"Controller ID 1 is reserved for the first controller that identifies itself "
+"as the left-hand controller and ID 2 is reserved for the first controller "
+"that identifies itself as the right-hand controller.\n"
+"For any other controller that the [XRServer] detects, we continue with "
+"controller ID 3.\n"
+"When a controller is turned off, its slot is freed. This ensures controllers "
+"will keep the same ID even when controllers with lower IDs are turned off."
+msgstr ""
+
+#: doc/classes/XRController3D.xml:77
+msgid ""
+"The degree to which the controller vibrates. Ranges from [code]0.0[/code] to "
+"[code]1.0[/code] with precision [code].01[/code]. If changed, updates "
+"[member XRPositionalTracker.rumble] accordingly.\n"
+"This is a useful property to animate if you want the controller to vibrate "
+"for a limited duration."
+msgstr ""
+
+#: doc/classes/XRController3D.xml:86
+msgid "Emitted when a button on this controller is pressed."
+msgstr ""
+
+#: doc/classes/XRController3D.xml:93
+msgid "Emitted when a button on this controller is released."
+msgstr ""
+
+#: doc/classes/XRController3D.xml:100
+msgid ""
+"Emitted when the mesh associated with the controller changes or when one "
+"becomes available. Generally speaking this will be a static mesh after "
+"becoming available."
+msgstr ""
+
+#: doc/classes/XRInterface.xml:4
+msgid "Base class for an AR/VR interface implementation."
+msgstr ""
+
+#: doc/classes/XRInterface.xml:7
+msgid ""
+"This class needs to be implemented to make an AR or VR platform available to "
+"Godot and these should be implemented as C++ modules or GDNative modules "
+"(note that for GDNative the subclass XRScriptInterface should be used). Part "
+"of the interface is exposed to GDScript so you can detect, enable and "
+"configure an AR or VR platform.\n"
+"Interfaces should be written in such a way that simply enabling them will "
+"give us a working setup. You can query the available interfaces through "
+"[XRServer]."
+msgstr ""
+
+#: doc/classes/XRInterface.xml:18
+msgid ""
+"If this is an AR interface that requires displaying a camera feed as the "
+"background, this method returns the feed ID in the [CameraServer] for this "
+"interface."
+msgstr ""
+
+#: doc/classes/XRInterface.xml:25
+msgid ""
+"Returns a combination of [enum Capabilities] flags providing information "
+"about the capabilities of this interface."
+msgstr ""
+
+#: doc/classes/XRInterface.xml:32
+msgid "Returns the name of this interface (OpenVR, OpenHMD, ARKit, etc)."
+msgstr ""
+
+#: doc/classes/XRInterface.xml:39
+msgid ""
+"Returns the resolution at which we should render our intermediate results "
+"before things like lens distortion are applied by the VR platform."
+msgstr ""
+
+#: doc/classes/XRInterface.xml:46
+msgid ""
+"If supported, returns the status of our tracking. This will allow you to "
+"provide feedback to the user whether there are issues with positional "
+"tracking."
+msgstr ""
+
+#: doc/classes/XRInterface.xml:53
+msgid ""
+"Call this to initialize this interface. The first interface that is "
+"initialized is identified as the primary interface and it will be used for "
+"rendering output.\n"
+"After initializing the interface you want to use you then need to enable the "
+"AR/VR mode of a viewport and rendering should commence.\n"
+"[b]Note:[/b] You must enable the AR/VR mode on the main viewport for any "
+"device that uses the main output of Godot, such as for mobile VR.\n"
+"If you do this for a platform that handles its own output (such as OpenVR) "
+"Godot will show just one eye without distortion on screen. Alternatively, "
+"you can add a separate viewport node to your scene and enable AR/VR on that "
+"viewport. It will be used to output to the HMD, leaving you free to do "
+"anything you like in the main window, such as using a separate camera as a "
+"spectator camera or rendering something completely different.\n"
+"While currently not used, you can activate additional interfaces. You may "
+"wish to do this if you want to track controllers from other platforms. "
+"However, at this point in time only one interface can render to an HMD."
+msgstr ""
+
+#: doc/classes/XRInterface.xml:64
+msgid ""
+"Returns [code]true[/code] if the current output of this interface is in "
+"stereo."
+msgstr ""
+
+#: doc/classes/XRInterface.xml:71
+msgid "Turns the interface off."
+msgstr ""
+
+#: doc/classes/XRInterface.xml:77
+msgid "On an AR interface, [code]true[/code] if anchor detection is enabled."
+msgstr ""
+
+#: doc/classes/XRInterface.xml:80
+msgid "[code]true[/code] if this interface been initialized."
+msgstr ""
+
+#: doc/classes/XRInterface.xml:83
+msgid "[code]true[/code] if this is the primary interface."
+msgstr ""
+
+#: doc/classes/XRInterface.xml:88
+msgid "No XR capabilities."
+msgstr ""
+
+#: doc/classes/XRInterface.xml:91
+msgid ""
+"This interface can work with normal rendering output (non-HMD based AR)."
+msgstr ""
+
+#: doc/classes/XRInterface.xml:94
+msgid "This interface supports stereoscopic rendering."
+msgstr ""
+
+#: doc/classes/XRInterface.xml:97
+msgid "This interface supports AR (video background and real world tracking)."
+msgstr ""
+
+#: doc/classes/XRInterface.xml:100
+msgid ""
+"This interface outputs to an external device. If the main viewport is used, "
+"the on screen output is an unmodified buffer of either the left or right eye "
+"(stretched if the viewport size is not changed to the same aspect ratio of "
+"[method get_render_targetsize]). Using a separate viewport node frees up the "
+"main viewport for other purposes."
+msgstr ""
+
+#: doc/classes/XRInterface.xml:103
+msgid ""
+"Mono output, this is mostly used internally when retrieving positioning "
+"information for our camera node or when stereo scopic rendering is not "
+"supported."
+msgstr ""
+
+#: doc/classes/XRInterface.xml:106
+msgid ""
+"Left eye output, this is mostly used internally when rendering the image for "
+"the left eye and obtaining positioning and projection information."
+msgstr ""
+
+#: doc/classes/XRInterface.xml:109
+msgid ""
+"Right eye output, this is mostly used internally when rendering the image "
+"for the right eye and obtaining positioning and projection information."
+msgstr ""
+
+#: doc/classes/XRInterface.xml:112
+msgid "Tracking is behaving as expected."
+msgstr ""
+
+#: doc/classes/XRInterface.xml:115
+msgid ""
+"Tracking is hindered by excessive motion (the player is moving faster than "
+"tracking can keep up)."
+msgstr ""
+
+#: doc/classes/XRInterface.xml:118
+msgid ""
+"Tracking is hindered by insufficient features, it's too dark (for camera-"
+"based tracking), player is blocked, etc."
+msgstr ""
+
+#: doc/classes/XRInterface.xml:121
+msgid ""
+"We don't know the status of the tracking or this interface does not provide "
+"feedback."
+msgstr ""
+
+#: doc/classes/XRInterface.xml:124
+msgid ""
+"Tracking is not functional (camera not plugged in or obscured, lighthouses "
+"turned off, etc.)."
+msgstr ""
+
+#: modules/gdnative/doc_classes/XRInterfaceGDNative.xml:4
+msgid "GDNative wrapper for an XR interface."
+msgstr ""
+
+#: modules/gdnative/doc_classes/XRInterfaceGDNative.xml:7
+msgid ""
+"This is a wrapper class for GDNative implementations of the XR interface. To "
+"use a GDNative XR interface, simply instantiate this object and set your "
+"GDNative library containing the XR interface implementation."
+msgstr ""
+
+#: doc/classes/XROrigin3D.xml:4
+msgid "The origin point in AR/VR."
+msgstr ""
+
+#: doc/classes/XROrigin3D.xml:7
+msgid ""
+"This is a special node within the AR/VR system that maps the physical "
+"location of the center of our tracking space to the virtual location within "
+"our game world.\n"
+"There should be only one of these nodes in your scene and you must have one. "
+"All the XRCamera3D, XRController3D and XRAnchor3D nodes should be direct "
+"children of this node for spatial tracking to work correctly.\n"
+"It is the position of this node that you update when your character needs to "
+"move through your game world while we're not moving in the real world. "
+"Movement in the real world is always in relation to this origin point.\n"
+"For example, if your character is driving a car, the XROrigin3D node should "
+"be a child node of this car. Or, if you're implementing a teleport system to "
+"move your character, you should change the position of this node."
+msgstr ""
+
+#: doc/classes/XROrigin3D.xml:19
+msgid ""
+"Allows you to adjust the scale to your game's units. Most AR/VR platforms "
+"assume a scale of 1 game world unit = 1 real world meter.\n"
+"[b]Note:[/b] This method is a passthrough to the [XRServer] itself."
+msgstr ""
+
+#: doc/classes/XRPositionalTracker.xml:4
+msgid "A tracked object."
+msgstr ""
+
+#: doc/classes/XRPositionalTracker.xml:7
+msgid ""
+"An instance of this object represents a device that is tracked, such as a "
+"controller or anchor point. HMDs aren't represented here as they are handled "
+"internally.\n"
+"As controllers are turned on and the AR/VR interface detects them, instances "
+"of this object are automatically added to this list of active tracking "
+"objects accessible through the [XRServer].\n"
+"The [XRController3D] and [XRAnchor3D] both consume objects of this type and "
+"should be used in your project. The positional trackers are just under-the-"
+"hood objects that make this all work. These are mostly exposed so that "
+"GDNative-based interfaces can interact with them."
+msgstr ""
+
+#: doc/classes/XRPositionalTracker.xml:19
+msgid ""
+"Returns the hand holding this tracker, if known. See [enum TrackerHand] "
+"constants."
+msgstr ""
+
+#: doc/classes/XRPositionalTracker.xml:26
+msgid ""
+"If this is a controller that is being tracked, the controller will also be "
+"represented by a joystick entry with this ID."
+msgstr ""
+
+#: doc/classes/XRPositionalTracker.xml:33
+msgid ""
+"Returns the mesh related to a controller or anchor point if one is available."
+msgstr ""
+
+#: doc/classes/XRPositionalTracker.xml:40
+msgid "Returns the controller or anchor point's name if available."
+msgstr ""
+
+#: doc/classes/XRPositionalTracker.xml:47
+msgid "Returns the controller's orientation matrix."
+msgstr ""
+
+#: doc/classes/XRPositionalTracker.xml:54
+msgid "Returns the world-space controller position."
+msgstr ""
+
+#: doc/classes/XRPositionalTracker.xml:61
+msgid ""
+"Returns the internal tracker ID. This uniquely identifies the tracker per "
+"tracker type and matches the ID you need to specify for nodes such as the "
+"[XRController3D] and [XRAnchor3D] nodes."
+msgstr ""
+
+#: doc/classes/XRPositionalTracker.xml:68
+msgid "Returns [code]true[/code] if this device tracks orientation."
+msgstr ""
+
+#: doc/classes/XRPositionalTracker.xml:75
+msgid "Returns [code]true[/code] if this device tracks position."
+msgstr ""
+
+#: doc/classes/XRPositionalTracker.xml:84
+msgid "Returns the transform combining this device's orientation and position."
+msgstr ""
+
+#: doc/classes/XRPositionalTracker.xml:91
+msgid "Returns the tracker's type."
+msgstr ""
+
+#: doc/classes/XRPositionalTracker.xml:97
+msgid ""
+"The degree to which the tracker rumbles. Ranges from [code]0.0[/code] to "
+"[code]1.0[/code] with precision [code].01[/code]."
+msgstr ""
+
+#: doc/classes/XRPositionalTracker.xml:102
+msgid "The hand this tracker is held in is unknown or not applicable."
+msgstr ""
+
+#: doc/classes/XRPositionalTracker.xml:105
+msgid "This tracker is the left hand controller."
+msgstr ""
+
+#: doc/classes/XRPositionalTracker.xml:108
+msgid "This tracker is the right hand controller."
+msgstr ""
+
+#: doc/classes/XRServer.xml:4
+msgid "Server for AR and VR features."
+msgstr ""
+
+#: doc/classes/XRServer.xml:7
+msgid ""
+"The AR/VR server is the heart of our Advanced and Virtual Reality solution "
+"and handles all the processing."
+msgstr ""
+
+#: doc/classes/XRServer.xml:21
+msgid ""
+"This is an important function to understand correctly. AR and VR platforms "
+"all handle positioning slightly differently.\n"
+"For platforms that do not offer spatial tracking, our origin point (0,0,0) "
+"is the location of our HMD, but you have little control over the direction "
+"the player is facing in the real world.\n"
+"For platforms that do offer spatial tracking, our origin point depends very "
+"much on the system. For OpenVR, our origin point is usually the center of "
+"the tracking space, on the ground. For other platforms, it's often the "
+"location of the tracking camera.\n"
+"This method allows you to center your tracker on the location of the HMD. It "
+"will take the current location of the HMD and use that to adjust all your "
+"tracking data; in essence, realigning the real world to your player's "
+"current position in the game world.\n"
+"For this method to produce usable results, tracking information must be "
+"available. This often takes a few frames after starting your game.\n"
+"You should call this method after a few seconds have passed. For instance, "
+"when the user requests a realignment of the display holding a designated "
+"button on a controller for a short period of time, or when implementing a "
+"teleport mechanism."
+msgstr ""
+
+#: doc/classes/XRServer.xml:35
+msgid ""
+"Finds an interface by its name. For instance, if your project uses "
+"capabilities of an AR/VR platform, you can find the interface for that "
+"platform by name and initialize it."
+msgstr ""
+
+#: doc/classes/XRServer.xml:42
+msgid "Returns the primary interface's transformation."
+msgstr ""
+
+#: doc/classes/XRServer.xml:51
+msgid ""
+"Returns the interface registered at a given index in our list of interfaces."
+msgstr ""
+
+#: doc/classes/XRServer.xml:58
+msgid ""
+"Returns the number of interfaces currently registered with the AR/VR server. "
+"If your project supports multiple AR/VR platforms, you can look through the "
+"available interface, and either present the user with a selection or simply "
+"try to initialize each interface and use the first one that returns "
+"[code]true[/code]."
+msgstr ""
+
+#: doc/classes/XRServer.xml:65
+msgid ""
+"Returns a list of available interfaces the ID and name of each interface."
+msgstr ""
+
+#: doc/classes/XRServer.xml:72
+msgid ""
+"Returns the absolute timestamp (in μs) of the last [XRServer] commit of the "
+"AR/VR eyes to [RenderingServer]. The value comes from an internal call to "
+"[method OS.get_ticks_usec]."
+msgstr ""
+
+#: doc/classes/XRServer.xml:79
+msgid ""
+"Returns the duration (in μs) of the last frame. This is computed as the "
+"difference between [method get_last_commit_usec] and [method "
+"get_last_process_usec] when committing."
+msgstr ""
+
+#: doc/classes/XRServer.xml:86
+msgid ""
+"Returns the absolute timestamp (in μs) of the last [XRServer] process "
+"callback. The value comes from an internal call to [method OS."
+"get_ticks_usec]."
+msgstr ""
+
+#: doc/classes/XRServer.xml:93
+msgid ""
+"Returns the reference frame transform. Mostly used internally and exposed "
+"for GDNative build interfaces."
+msgstr ""
+
+#: doc/classes/XRServer.xml:102
+msgid "Returns the positional tracker at the given ID."
+msgstr ""
+
+#: doc/classes/XRServer.xml:109
+msgid "Returns the number of trackers currently registered."
+msgstr ""
+
+#: doc/classes/XRServer.xml:115
+msgid "The primary [XRInterface] currently bound to the [XRServer]."
+msgstr ""
+
+#: doc/classes/XRServer.xml:118
+msgid ""
+"Allows you to adjust the scale to your game's units. Most AR/VR platforms "
+"assume a scale of 1 game world unit = 1 real world meter."
+msgstr ""
+
+#: doc/classes/XRServer.xml:126
+msgid "Emitted when a new interface has been added."
+msgstr ""
+
+#: doc/classes/XRServer.xml:133
+msgid "Emitted when an interface is removed."
+msgstr ""
+
+#: doc/classes/XRServer.xml:144
+msgid ""
+"Emitted when a new tracker has been added. If you don't use a fixed number "
+"of controllers or if you're using [XRAnchor3D]s for an AR solution, it is "
+"important to react to this signal to add the appropriate [XRController3D] or "
+"[XRAnchor3D] nodes related to this new tracker."
+msgstr ""
+
+#: doc/classes/XRServer.xml:155
+msgid ""
+"Emitted when a tracker is removed. You should remove any [XRController3D] or "
+"[XRAnchor3D] points if applicable. This is not mandatory, the nodes simply "
+"become inactive and will be made active again when a new tracker becomes "
+"available (i.e. a new controller is switched on that takes the place of the "
+"previous one)."
+msgstr ""
+
+#: doc/classes/XRServer.xml:161
+msgid "The tracker tracks the location of a controller."
+msgstr ""
+
+#: doc/classes/XRServer.xml:164
+msgid "The tracker tracks the location of a base station."
+msgstr ""
+
+#: doc/classes/XRServer.xml:167
+msgid "The tracker tracks the location and size of an AR anchor."
+msgstr ""
+
+#: doc/classes/XRServer.xml:170
+msgid "Used internally to filter trackers of any known type."
+msgstr ""
+
+#: doc/classes/XRServer.xml:173
+msgid "Used internally if we haven't set the tracker type yet."
+msgstr ""
+
+#: doc/classes/XRServer.xml:176
+msgid "Used internally to select all trackers."
+msgstr ""
+
+#: doc/classes/XRServer.xml:179
+msgid ""
+"Fully reset the orientation of the HMD. Regardless of what direction the "
+"user is looking to in the real world. The user will look dead ahead in the "
+"virtual world."
+msgstr ""
+
+#: doc/classes/XRServer.xml:182
+msgid ""
+"Resets the orientation but keeps the tilt of the device. So if we're looking "
+"down, we keep looking down but heading will be reset."
+msgstr ""
+
+#: doc/classes/XRServer.xml:185
+msgid ""
+"Does not reset the orientation of the HMD, only the position of the player "
+"gets centered."
+msgstr ""
+
#: doc/classes/YSort.xml:4
msgid "Sort all child nodes based on their Y positions."
msgstr ""
diff --git a/doc/translations/fr.po b/doc/translations/fr.po
index 6926376c05..d39ab5f248 100644
--- a/doc/translations/fr.po
+++ b/doc/translations/fr.po
@@ -9,15 +9,15 @@ msgid ""
msgstr ""
"Project-Id-Version: Godot Engine class reference\n"
"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
"POT-Creation-Date: \n"
"PO-Revision-Date: \n"
"Last-Translator: Rémi Verschelde <remi@godotengine.org>\n"
"Language-Team: French <https://hosted.weblate.org/projects/godot-engine/"
"godot-classes/fr/>\n"
"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.3\n"
#: doc/tools/makerst.py
@@ -490,7 +490,7 @@ msgid ""
"[float], the return value is a [float].\n"
"If both are of the same vector type ([Vector2], [Vector3] or [Color]), the "
"return value will be of the same type ([code]lerp[/code] then calls the "
-"vector type's [code]linear_interpolate[/code] method).\n"
+"vector type's [code]lerp[/code] method).\n"
"[codeblock]\n"
"lerp(0, 4, 0.75) # Returns 3.0\n"
"lerp(Vector2(1, 5), Vector2(3, 2), 0.5) # Returns Vector2(2, 3.5)\n"
@@ -1214,19 +1214,19 @@ msgid ""
msgstr ""
#: doc/classes/@GlobalScope.xml:16
-msgid "The [ARVRServer] singleton."
+msgid "The [AudioServer] singleton."
msgstr ""
#: doc/classes/@GlobalScope.xml:19
-msgid "The [AudioServer] singleton."
+msgid "The [CameraServer] singleton."
msgstr ""
#: doc/classes/@GlobalScope.xml:22
-msgid "The [CameraServer] singleton."
+msgid "The [ClassDB] singleton."
msgstr ""
#: doc/classes/@GlobalScope.xml:25
-msgid "The [ClassDB] singleton."
+msgid "The [DisplayServer] singleton."
msgstr ""
#: doc/classes/@GlobalScope.xml:28
@@ -1238,90 +1238,89 @@ msgid "The [Geometry] singleton."
msgstr ""
#: doc/classes/@GlobalScope.xml:34
-msgid ""
-"The [GodotSharp] singleton. Only available when using Godot's Mono build."
+msgid "The [IP] singleton."
msgstr ""
#: doc/classes/@GlobalScope.xml:37
-msgid "The [IP] singleton."
+msgid "The [Input] singleton."
msgstr ""
#: doc/classes/@GlobalScope.xml:40
-msgid "The [InputFilter] singleton."
-msgstr ""
-
-#: doc/classes/@GlobalScope.xml:43
msgid "The [InputMap] singleton."
msgstr ""
-#: doc/classes/@GlobalScope.xml:46
+#: doc/classes/@GlobalScope.xml:43
msgid "The [JSON] singleton."
msgstr ""
-#: doc/classes/@GlobalScope.xml:49
+#: doc/classes/@GlobalScope.xml:46
msgid ""
"The [JavaClassWrapper] singleton.\n"
"[b]Note:[/b] Only implemented on Android."
msgstr ""
-#: doc/classes/@GlobalScope.xml:53
+#: doc/classes/@GlobalScope.xml:50
msgid ""
"The [JavaScript] singleton.\n"
"[b]Note:[/b] Only implemented on HTML5."
msgstr ""
-#: doc/classes/@GlobalScope.xml:57
+#: doc/classes/@GlobalScope.xml:54
msgid "The [Marshalls] singleton."
msgstr ""
-#: doc/classes/@GlobalScope.xml:60
+#: doc/classes/@GlobalScope.xml:57
msgid "The [NavigationMeshGenerator] singleton."
msgstr ""
-#: doc/classes/@GlobalScope.xml:63 doc/classes/@GlobalScope.xml:66
+#: doc/classes/@GlobalScope.xml:60 doc/classes/@GlobalScope.xml:63
msgid "The [NavigationServer2D] singleton."
msgstr ""
-#: doc/classes/@GlobalScope.xml:69
+#: doc/classes/@GlobalScope.xml:66
msgid "The [OS] singleton."
msgstr ""
-#: doc/classes/@GlobalScope.xml:72
+#: doc/classes/@GlobalScope.xml:69
msgid "The [Performance] singleton."
msgstr ""
-#: doc/classes/@GlobalScope.xml:75
+#: doc/classes/@GlobalScope.xml:72
msgid "The [PhysicsServer2D] singleton."
msgstr ""
-#: doc/classes/@GlobalScope.xml:78
+#: doc/classes/@GlobalScope.xml:75
msgid "The [PhysicsServer3D] singleton."
msgstr ""
-#: doc/classes/@GlobalScope.xml:81
+#: doc/classes/@GlobalScope.xml:78
msgid "The [ProjectSettings] singleton."
msgstr ""
-#: doc/classes/@GlobalScope.xml:84
+#: doc/classes/@GlobalScope.xml:81
msgid "The [RenderingServer] singleton."
msgstr ""
-#: doc/classes/@GlobalScope.xml:87
+#: doc/classes/@GlobalScope.xml:84
msgid "The [ResourceLoader] singleton."
msgstr ""
-#: doc/classes/@GlobalScope.xml:90
+#: doc/classes/@GlobalScope.xml:87
msgid "The [ResourceSaver] singleton."
msgstr ""
-#: doc/classes/@GlobalScope.xml:93
+#: doc/classes/@GlobalScope.xml:90
msgid "The [TranslationServer] singleton."
msgstr ""
-#: doc/classes/@GlobalScope.xml:96
+#: doc/classes/@GlobalScope.xml:93
msgid "The [VisualScriptEditor] singleton."
msgstr ""
+#: doc/classes/@GlobalScope.xml:96
+msgid "The [XRServer] singleton."
+msgstr ""
+
#: doc/classes/@GlobalScope.xml:101
msgid "Left margin, usually used for [Control] or [StyleBox]-derived classes."
msgstr ""
@@ -1404,7 +1403,7 @@ msgid "Tab key."
msgstr ""
#: doc/classes/@GlobalScope.xml:158
-msgid "Shift+Tab key."
+msgid "Shift + Tab key."
msgstr ""
#: doc/classes/@GlobalScope.xml:161
@@ -3134,305 +3133,311 @@ msgid "Used to categorize properties together in the editor."
msgstr ""
#: doc/classes/@GlobalScope.xml:1424
-msgid "The property does not save its state in [PackedScene]."
+msgid ""
+"Used to group properties together in the editor in a subgroup (under a "
+"group)."
msgstr ""
#: doc/classes/@GlobalScope.xml:1427
-msgid "Editing the property prompts the user for restarting the editor."
+msgid "The property does not save its state in [PackedScene]."
msgstr ""
#: doc/classes/@GlobalScope.xml:1430
+msgid "Editing the property prompts the user for restarting the editor."
+msgstr ""
+
+#: doc/classes/@GlobalScope.xml:1433
msgid ""
"The property is a script variable which should be serialized and saved in "
"the scene file."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1433
+#: doc/classes/@GlobalScope.xml:1436
msgid "Default usage (storage, editor and network)."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1436
+#: doc/classes/@GlobalScope.xml:1439
msgid ""
"Default usage for translatable strings (storage, editor, network and "
"internationalized)."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1439
+#: doc/classes/@GlobalScope.xml:1442
msgid ""
"Default usage but without showing the property in the editor (storage, "
"network)."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1442
+#: doc/classes/@GlobalScope.xml:1445
msgid "Flag for a normal method."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1445
+#: doc/classes/@GlobalScope.xml:1448
msgid "Flag for an editor method."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1448 doc/classes/@GlobalScope.xml:1454
-#: doc/classes/@GlobalScope.xml:1460
+#: doc/classes/@GlobalScope.xml:1451 doc/classes/@GlobalScope.xml:1457
+#: doc/classes/@GlobalScope.xml:1463
msgid "Deprecated method flag, unused."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1451
+#: doc/classes/@GlobalScope.xml:1454
msgid "Flag for a constant method."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1457
+#: doc/classes/@GlobalScope.xml:1460
msgid "Flag for a virtual method."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1463
+#: doc/classes/@GlobalScope.xml:1466
msgid "Default method flags."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1466
+#: doc/classes/@GlobalScope.xml:1469
msgid "Variable is [code]null[/code]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1469
+#: doc/classes/@GlobalScope.xml:1472
msgid "Variable is of type [bool]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1472
+#: doc/classes/@GlobalScope.xml:1475
msgid "Variable is of type [int]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1475
+#: doc/classes/@GlobalScope.xml:1478
msgid "Variable is of type [float] (real)."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1478
+#: doc/classes/@GlobalScope.xml:1481
msgid "Variable is of type [String]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1481
+#: doc/classes/@GlobalScope.xml:1484
msgid "Variable is of type [Vector2]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1484
+#: doc/classes/@GlobalScope.xml:1487
msgid "Variable is of type [Vector2i]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1487
+#: doc/classes/@GlobalScope.xml:1490
msgid "Variable is of type [Rect2]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1490
+#: doc/classes/@GlobalScope.xml:1493
msgid "Variable is of type [Rect2i]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1493
+#: doc/classes/@GlobalScope.xml:1496
msgid "Variable is of type [Vector3]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1496
+#: doc/classes/@GlobalScope.xml:1499
msgid "Variable is of type [Vector3i]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1499
+#: doc/classes/@GlobalScope.xml:1502
msgid "Variable is of type [Transform2D]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1502
+#: doc/classes/@GlobalScope.xml:1505
msgid "Variable is of type [Plane]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1505
+#: doc/classes/@GlobalScope.xml:1508
msgid "Variable is of type [Quat]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1508
+#: doc/classes/@GlobalScope.xml:1511
msgid "Variable is of type [AABB]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1511
+#: doc/classes/@GlobalScope.xml:1514
msgid "Variable is of type [Basis]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1514
+#: doc/classes/@GlobalScope.xml:1517
msgid "Variable is of type [Transform]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1517
+#: doc/classes/@GlobalScope.xml:1520
msgid "Variable is of type [Color]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1520
+#: doc/classes/@GlobalScope.xml:1523
msgid "Variable is of type [StringName]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1523
+#: doc/classes/@GlobalScope.xml:1526
msgid "Variable is of type [NodePath]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1526
+#: doc/classes/@GlobalScope.xml:1529
msgid "Variable is of type [RID]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1529
+#: doc/classes/@GlobalScope.xml:1532
msgid "Variable is of type [Object]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1532
+#: doc/classes/@GlobalScope.xml:1535
msgid "Variable is of type [Callable]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1535
+#: doc/classes/@GlobalScope.xml:1538
msgid "Variable is of type [Signal]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1538
+#: doc/classes/@GlobalScope.xml:1541
msgid "Variable is of type [Dictionary]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1541
+#: doc/classes/@GlobalScope.xml:1544
msgid "Variable is of type [Array]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1544
+#: doc/classes/@GlobalScope.xml:1547
msgid "Variable is of type [PackedByteArray]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1547
+#: doc/classes/@GlobalScope.xml:1550
msgid "Variable is of type [PackedInt32Array]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1550
+#: doc/classes/@GlobalScope.xml:1553
msgid "Variable is of type [PackedInt64Array]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1553
+#: doc/classes/@GlobalScope.xml:1556
msgid "Variable is of type [PackedFloat32Array]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1556
+#: doc/classes/@GlobalScope.xml:1559
msgid "Variable is of type [PackedFloat64Array]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1559
+#: doc/classes/@GlobalScope.xml:1562
msgid "Variable is of type [PackedStringArray]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1562
+#: doc/classes/@GlobalScope.xml:1565
msgid "Variable is of type [PackedVector2Array]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1565
+#: doc/classes/@GlobalScope.xml:1568
msgid "Variable is of type [PackedVector3Array]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1568
+#: doc/classes/@GlobalScope.xml:1571
msgid "Variable is of type [PackedColorArray]."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1571
+#: doc/classes/@GlobalScope.xml:1574
msgid "Represents the size of the [enum Variant.Type] enum."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1574
+#: doc/classes/@GlobalScope.xml:1577
msgid "Equality operator ([code]==[/code])."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1577
+#: doc/classes/@GlobalScope.xml:1580
msgid "Inequality operator ([code]!=[/code])."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1580
+#: doc/classes/@GlobalScope.xml:1583
msgid "Less than operator ([code]<[/code])."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1583
+#: doc/classes/@GlobalScope.xml:1586
msgid "Less than or equal operator ([code]<=[/code])."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1586
+#: doc/classes/@GlobalScope.xml:1589
msgid "Greater than operator ([code]>[/code])."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1589
+#: doc/classes/@GlobalScope.xml:1592
msgid "Greater than or equal operator ([code]>=[/code])."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1592
+#: doc/classes/@GlobalScope.xml:1595
msgid "Addition operator ([code]+[/code])."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1595
+#: doc/classes/@GlobalScope.xml:1598
msgid "Subtraction operator ([code]-[/code])."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1598
+#: doc/classes/@GlobalScope.xml:1601
msgid "Multiplication operator ([code]*[/code])."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1601
+#: doc/classes/@GlobalScope.xml:1604
msgid "Division operator ([code]/[/code])."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1604
+#: doc/classes/@GlobalScope.xml:1607
msgid "Unary negation operator ([code]-[/code])."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1607
+#: doc/classes/@GlobalScope.xml:1610
msgid "Unary plus operator ([code]+[/code])."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1610
+#: doc/classes/@GlobalScope.xml:1613
msgid "Remainder/modulo operator ([code]%[/code])."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1613
+#: doc/classes/@GlobalScope.xml:1616
msgid "String concatenation operator ([code]+[/code])."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1616
+#: doc/classes/@GlobalScope.xml:1619
msgid "Left shift operator ([code]<<[/code])."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1619
+#: doc/classes/@GlobalScope.xml:1622
msgid "Right shift operator ([code]>>[/code])."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1622
+#: doc/classes/@GlobalScope.xml:1625
msgid "Bitwise AND operator ([code]&[/code])."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1625
+#: doc/classes/@GlobalScope.xml:1628
msgid "Bitwise OR operator ([code]|[/code])."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1628
+#: doc/classes/@GlobalScope.xml:1631
msgid "Bitwise XOR operator ([code]^[/code])."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1631
+#: doc/classes/@GlobalScope.xml:1634
msgid "Bitwise NOT operator ([code]~[/code])."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1634
+#: doc/classes/@GlobalScope.xml:1637
msgid "Logical AND operator ([code]and[/code] or [code]&&[/code])."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1637
+#: doc/classes/@GlobalScope.xml:1640
msgid "Logical OR operator ([code]or[/code] or [code]||[/code])."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1640
+#: doc/classes/@GlobalScope.xml:1643
msgid "Logical XOR operator (not implemented in GDScript)."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1643
+#: doc/classes/@GlobalScope.xml:1646
msgid "Logical NOT operator ([code]not[/code] or [code]![/code])."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1646
+#: doc/classes/@GlobalScope.xml:1649
msgid "Logical IN operator ([code]in[/code])."
msgstr ""
-#: doc/classes/@GlobalScope.xml:1649
+#: doc/classes/@GlobalScope.xml:1652
msgid "Represents the size of the [enum Variant.Operator] enum."
msgstr ""
@@ -3804,6 +3809,10 @@ msgid ""
msgstr ""
#: doc/classes/AnimatedTexture.xml:65
+msgid "Sets the currently visible frame of the texture."
+msgstr ""
+
+#: doc/classes/AnimatedTexture.xml:68
msgid ""
"Animation speed in frames per second. This value defines the default time "
"interval between two frames of the animation, and thus the overall duration "
@@ -3814,7 +3823,7 @@ msgid ""
"code] value of 2 will run for 4 seconds, with each frame lasting 0.5 seconds."
msgstr ""
-#: doc/classes/AnimatedTexture.xml:69
+#: doc/classes/AnimatedTexture.xml:72
msgid ""
"Number of frames to use in the animation. While you can create the frames "
"independently with [method set_frame_texture], you need to set this value "
@@ -3822,7 +3831,21 @@ msgid ""
"frames is [constant MAX_FRAMES]."
msgstr ""
-#: doc/classes/AnimatedTexture.xml:74
+#: doc/classes/AnimatedTexture.xml:75
+msgid ""
+"If [code]true[/code], the animation will only play once and will not loop "
+"back to the first frame after reaching the end. Note that reaching the end "
+"will not set [member pause] to [code]true[/code]."
+msgstr ""
+
+#: doc/classes/AnimatedTexture.xml:78
+msgid ""
+"If [code]true[/code], the animation will pause where it currently is (i.e. "
+"at [member current_frame]). The animation will continue from where it was "
+"paused when changing this property to [code]false[/code]."
+msgstr ""
+
+#: doc/classes/AnimatedTexture.xml:83
msgid ""
"The maximum number of frames supported by [AnimatedTexture]. If you need "
"more frames in your animation, use [AnimationPlayer] or [AnimatedSprite2D]."
@@ -6102,22 +6125,27 @@ msgid ""
"var m = MeshInstance3D.new()\n"
"m.mesh = arr_mesh\n"
"[/codeblock]\n"
-"The [MeshInstance3D] is ready to be added to the [SceneTree] to be shown."
+"The [MeshInstance3D] is ready to be added to the [SceneTree] to be shown.\n"
+"See also [ImmediateGeometry3D], [MeshDataTool] and [SurfaceTool] for "
+"procedural geometry generation.\n"
+"[b]Note:[/b] Godot uses clockwise [url=https://learnopengl.com/Advanced-"
+"OpenGL/Face-culling]winding order[/url] for front faces of triangle "
+"primitive modes."
msgstr ""
-#: doc/classes/ArrayMesh.xml:27
+#: doc/classes/ArrayMesh.xml:29
msgid ""
"https://docs.godotengine.org/en/latest/tutorials/content/procedural_geometry/"
"arraymesh.html"
msgstr ""
-#: doc/classes/ArrayMesh.xml:36
+#: doc/classes/ArrayMesh.xml:38
msgid ""
"Adds name for a blend shape that will be added with [method "
"add_surface_from_arrays]. Must be called before surface is added."
msgstr ""
-#: doc/classes/ArrayMesh.xml:55
+#: doc/classes/ArrayMesh.xml:57
msgid ""
"Creates a new surface.\n"
"Surfaces are created to be rendered using a [code]primitive[/code], which "
@@ -6135,141 +6163,139 @@ msgid ""
"it is used.\n"
"Adding an index array puts this function into \"index mode\" where the "
"vertex and other arrays become the sources of data, and the index array "
-"defines the order of the vertices.\n"
-"Godot uses clockwise winding order for front faces of triangle primitive "
-"modes."
+"defines the order of the vertices."
msgstr ""
-#: doc/classes/ArrayMesh.xml:66
+#: doc/classes/ArrayMesh.xml:67
msgid "Removes all blend shapes from this [ArrayMesh]."
msgstr ""
-#: doc/classes/ArrayMesh.xml:73
+#: doc/classes/ArrayMesh.xml:74
msgid "Removes all surfaces from this [ArrayMesh]."
msgstr ""
-#: doc/classes/ArrayMesh.xml:80
+#: doc/classes/ArrayMesh.xml:81
msgid "Returns the number of blend shapes that the [ArrayMesh] holds."
msgstr ""
-#: doc/classes/ArrayMesh.xml:89
+#: doc/classes/ArrayMesh.xml:90
msgid "Returns the name of the blend shape at this index."
msgstr ""
-#: doc/classes/ArrayMesh.xml:100
+#: doc/classes/ArrayMesh.xml:101
msgid ""
"Will perform a UV unwrap on the [ArrayMesh] to prepare the mesh for "
"lightmapping."
msgstr ""
-#: doc/classes/ArrayMesh.xml:107
+#: doc/classes/ArrayMesh.xml:108
msgid "Will regenerate normal maps for the [ArrayMesh]."
msgstr ""
-#: doc/classes/ArrayMesh.xml:116
+#: doc/classes/ArrayMesh.xml:117
msgid ""
"Returns the index of the first surface with this name held within this "
"[ArrayMesh]. If none are found, -1 is returned."
msgstr ""
-#: doc/classes/ArrayMesh.xml:125
+#: doc/classes/ArrayMesh.xml:126
msgid ""
"Returns the length in indices of the index array in the requested surface "
"(see [method add_surface_from_arrays])."
msgstr ""
-#: doc/classes/ArrayMesh.xml:134
+#: doc/classes/ArrayMesh.xml:135
msgid ""
"Returns the length in vertices of the vertex array in the requested surface "
"(see [method add_surface_from_arrays])."
msgstr ""
-#: doc/classes/ArrayMesh.xml:143
+#: doc/classes/ArrayMesh.xml:144
msgid ""
"Returns the format mask of the requested surface (see [method "
"add_surface_from_arrays])."
msgstr ""
-#: doc/classes/ArrayMesh.xml:152
+#: doc/classes/ArrayMesh.xml:153
msgid "Gets the name assigned to this surface."
msgstr ""
-#: doc/classes/ArrayMesh.xml:161
+#: doc/classes/ArrayMesh.xml:162
msgid ""
"Returns the primitive type of the requested surface (see [method "
"add_surface_from_arrays])."
msgstr ""
-#: doc/classes/ArrayMesh.xml:172
+#: doc/classes/ArrayMesh.xml:173
msgid "Sets a name for a given surface."
msgstr ""
-#: doc/classes/ArrayMesh.xml:185
+#: doc/classes/ArrayMesh.xml:186
msgid ""
"Updates a specified region of mesh arrays on the GPU.\n"
"[b]Warning:[/b] Only use if you know what you are doing. You can easily "
"cause crashes by calling this function with improper arguments."
msgstr ""
-#: doc/classes/ArrayMesh.xml:192
+#: doc/classes/ArrayMesh.xml:193
msgid "Sets the blend shape mode to one of [enum Mesh.BlendShapeMode]."
msgstr ""
-#: doc/classes/ArrayMesh.xml:195
+#: doc/classes/ArrayMesh.xml:196
msgid ""
"Overrides the [AABB] with one defined by user for use with frustum culling. "
"Especially useful to avoid unexpected culling when using a shader to offset "
"vertices."
msgstr ""
-#: doc/classes/ArrayMesh.xml:200
+#: doc/classes/ArrayMesh.xml:201
msgid "Default value used for index_array_len when no indices are present."
msgstr ""
-#: doc/classes/ArrayMesh.xml:203
+#: doc/classes/ArrayMesh.xml:204
msgid "Amount of weights/bone indices per vertex (always 4)."
msgstr ""
-#: doc/classes/ArrayMesh.xml:206
+#: doc/classes/ArrayMesh.xml:207
msgid ""
"[PackedVector3Array], [PackedVector2Array], or [Array] of vertex positions."
msgstr ""
-#: doc/classes/ArrayMesh.xml:209
+#: doc/classes/ArrayMesh.xml:210
msgid "[PackedVector3Array] of vertex normals."
msgstr ""
-#: doc/classes/ArrayMesh.xml:212
+#: doc/classes/ArrayMesh.xml:213
msgid ""
"[PackedFloat32Array] of vertex tangents. Each element in groups of 4 floats, "
"first 3 floats determine the tangent, and the last the binormal direction as "
"-1 or 1."
msgstr ""
-#: doc/classes/ArrayMesh.xml:215
+#: doc/classes/ArrayMesh.xml:216
msgid "[PackedColorArray] of vertex colors."
msgstr ""
-#: doc/classes/ArrayMesh.xml:218
+#: doc/classes/ArrayMesh.xml:219
msgid "[PackedVector2Array] for UV coordinates."
msgstr ""
-#: doc/classes/ArrayMesh.xml:221
+#: doc/classes/ArrayMesh.xml:222
msgid "[PackedVector2Array] for second UV coordinates."
msgstr ""
-#: doc/classes/ArrayMesh.xml:224
+#: doc/classes/ArrayMesh.xml:225
msgid ""
"[PackedFloat32Array] or [PackedInt32Array] of bone indices. Each element in "
"groups of 4 floats."
msgstr ""
-#: doc/classes/ArrayMesh.xml:227
+#: doc/classes/ArrayMesh.xml:228
msgid ""
"[PackedFloat32Array] of bone weights. Each element in groups of 4 floats."
msgstr ""
-#: doc/classes/ArrayMesh.xml:230
+#: doc/classes/ArrayMesh.xml:231
msgid ""
"[PackedInt32Array] of integers used as indices referencing vertices, colors, "
"normals, tangents, and textures. All of those arrays must have the same "
@@ -6283,709 +6309,47 @@ msgid ""
"the start and end of each line."
msgstr ""
-#: doc/classes/ArrayMesh.xml:234 doc/classes/Mesh.xml:210
-#: doc/classes/RenderingServer.xml:3180
+#: doc/classes/ArrayMesh.xml:235 doc/classes/Mesh.xml:210
+#: doc/classes/RenderingServer.xml:3232
msgid "Represents the size of the [enum ArrayType] enum."
msgstr ""
-#: doc/classes/ArrayMesh.xml:237
+#: doc/classes/ArrayMesh.xml:238
msgid "Array format will include vertices (mandatory)."
msgstr ""
-#: doc/classes/ArrayMesh.xml:240
+#: doc/classes/ArrayMesh.xml:241
msgid "Array format will include normals."
msgstr ""
-#: doc/classes/ArrayMesh.xml:243
+#: doc/classes/ArrayMesh.xml:244
msgid "Array format will include tangents."
msgstr ""
-#: doc/classes/ArrayMesh.xml:246
+#: doc/classes/ArrayMesh.xml:247
msgid "Array format will include a color array."
msgstr ""
-#: doc/classes/ArrayMesh.xml:249
+#: doc/classes/ArrayMesh.xml:250
msgid "Array format will include UVs."
msgstr ""
-#: doc/classes/ArrayMesh.xml:252
+#: doc/classes/ArrayMesh.xml:253
msgid "Array format will include another set of UVs."
msgstr ""
-#: doc/classes/ArrayMesh.xml:255
+#: doc/classes/ArrayMesh.xml:256
msgid "Array format will include bone indices."
msgstr ""
-#: doc/classes/ArrayMesh.xml:258
+#: doc/classes/ArrayMesh.xml:259
msgid "Array format will include bone weights."
msgstr ""
-#: doc/classes/ArrayMesh.xml:261
+#: doc/classes/ArrayMesh.xml:262
msgid "Index array will be used."
msgstr ""
-#: doc/classes/ARVRAnchor.xml:4
-msgid "An anchor point in AR space."
-msgstr ""
-
-#: doc/classes/ARVRAnchor.xml:7
-msgid ""
-"The [ARVRAnchor] point is a spatial node that maps a real world location "
-"identified by the AR platform to a position within the game world. For "
-"example, as long as plane detection in ARKit is on, ARKit will identify and "
-"update the position of planes (tables, floors, etc) and create anchors for "
-"them.\n"
-"This node is mapped to one of the anchors through its unique ID. When you "
-"receive a signal that a new anchor is available, you should add this node to "
-"your scene for that anchor. You can predefine nodes and set the ID; the "
-"nodes will simply remain on 0,0,0 until a plane is recognized.\n"
-"Keep in mind that, as long as plane detection is enabled, the size, placing "
-"and orientation of an anchor will be updated as the detection logic learns "
-"more about the real world out there especially if only part of the surface "
-"is in view."
-msgstr ""
-
-#: doc/classes/ARVRAnchor.xml:18
-msgid "Returns the name given to this anchor."
-msgstr ""
-
-#: doc/classes/ARVRAnchor.xml:25
-msgid ""
-"Returns [code]true[/code] if the anchor is being tracked and [code]false[/"
-"code] if no anchor with this ID is currently known."
-msgstr ""
-
-#: doc/classes/ARVRAnchor.xml:32
-msgid ""
-"If provided by the [ARVRInterface], this returns a mesh object for the "
-"anchor. For an anchor, this can be a shape related to the object being "
-"tracked or it can be a mesh that provides topology related to the anchor and "
-"can be used to create shadows/reflections on surfaces or for generating "
-"collision shapes."
-msgstr ""
-
-#: doc/classes/ARVRAnchor.xml:39
-msgid ""
-"Returns a plane aligned with our anchor; handy for intersection testing."
-msgstr ""
-
-#: doc/classes/ARVRAnchor.xml:46
-msgid ""
-"Returns the estimated size of the plane that was detected. Say when the "
-"anchor relates to a table in the real world, this is the estimated size of "
-"the surface of that table."
-msgstr ""
-
-#: doc/classes/ARVRAnchor.xml:52
-msgid ""
-"The anchor's ID. You can set this before the anchor itself exists. The first "
-"anchor gets an ID of [code]1[/code], the second an ID of [code]2[/code], "
-"etc. When anchors get removed, the engine can then assign the corresponding "
-"ID to new anchors. The most common situation where anchors \"disappear\" is "
-"when the AR server identifies that two anchors represent different parts of "
-"the same plane and merges them."
-msgstr ""
-
-#: doc/classes/ARVRAnchor.xml:60
-msgid ""
-"Emitted when the mesh associated with the anchor changes or when one becomes "
-"available. This is especially important for topology that is constantly "
-"being [code]mesh_updated[/code]."
-msgstr ""
-
-#: doc/classes/ARVRCamera.xml:4
-msgid ""
-"A camera node with a few overrules for AR/VR applied, such as location "
-"tracking."
-msgstr ""
-
-#: doc/classes/ARVRCamera.xml:7
-msgid ""
-"This is a helper spatial node for our camera; note that, if stereoscopic "
-"rendering is applicable (VR-HMD), most of the camera properties are ignored, "
-"as the HMD information overrides them. The only properties that can be "
-"trusted are the near and far planes.\n"
-"The position and orientation of this node is automatically updated by the "
-"ARVR Server to represent the location of the HMD if such tracking is "
-"available and can thus be used by game logic. Note that, in contrast to the "
-"ARVR Controller, the render thread has access to the most up-to-date "
-"tracking data of the HMD and the location of the ARVRCamera can lag a few "
-"milliseconds behind what is used for rendering as a result."
-msgstr ""
-
-#: doc/classes/ARVRCamera.xml:11 doc/classes/ARVRController.xml:12
-#: doc/classes/ARVRInterface.xml:11 doc/classes/ARVROrigin.xml:13
-#: doc/classes/ARVRPositionalTracker.xml:12 doc/classes/ARVRServer.xml:10
-msgid "https://docs.godotengine.org/en/latest/tutorials/vr/index.html"
-msgstr ""
-
-#: doc/classes/ARVRController.xml:4
-msgid "A spatial node representing a spatially-tracked controller."
-msgstr ""
-
-#: doc/classes/ARVRController.xml:7
-msgid ""
-"This is a helper spatial node that is linked to the tracking of controllers. "
-"It also offers several handy passthroughs to the state of buttons and such "
-"on the controllers.\n"
-"Controllers are linked by their ID. You can create controller nodes before "
-"the controllers are available. If your game always uses two controllers (one "
-"for each hand), you can predefine the controllers with ID 1 and 2; they will "
-"become active as soon as the controllers are identified. If you expect "
-"additional controllers to be used, you should react to the signals and add "
-"ARVRController nodes to your scene.\n"
-"The position of the controller node is automatically updated by the "
-"[ARVRServer]. This makes this node ideal to add child nodes to visualize the "
-"controller."
-msgstr ""
-
-#: doc/classes/ARVRController.xml:19
-msgid ""
-"If active, returns the name of the associated controller if provided by the "
-"AR/VR SDK used."
-msgstr ""
-
-#: doc/classes/ARVRController.xml:26
-msgid ""
-"Returns the hand holding this controller, if known. See [enum "
-"ARVRPositionalTracker.TrackerHand]."
-msgstr ""
-
-#: doc/classes/ARVRController.xml:33
-msgid ""
-"Returns [code]true[/code] if the bound controller is active. ARVR systems "
-"attempt to track active controllers."
-msgstr ""
-
-#: doc/classes/ARVRController.xml:42
-msgid ""
-"Returns the value of the given axis for things like triggers, touchpads, "
-"etc. that are embedded into the controller."
-msgstr ""
-
-#: doc/classes/ARVRController.xml:49
-msgid ""
-"Returns the ID of the joystick object bound to this. Every controller "
-"tracked by the [ARVRServer] that has buttons and axis will also be "
-"registered as a joystick within Godot. This means that all the normal "
-"joystick tracking and input mapping will work for buttons and axis found on "
-"the AR/VR controllers. This ID is purely offered as information so you can "
-"link up the controller with its joystick entry."
-msgstr ""
-
-#: doc/classes/ARVRController.xml:56
-msgid ""
-"If provided by the [ARVRInterface], this returns a mesh associated with the "
-"controller. This can be used to visualize the controller."
-msgstr ""
-
-#: doc/classes/ARVRController.xml:65
-msgid ""
-"Returns [code]true[/code] if the button at index [code]button[/code] is "
-"pressed. See [enum JoystickList], in particular the [code]JOY_VR_*[/code] "
-"constants."
-msgstr ""
-
-#: doc/classes/ARVRController.xml:71
-msgid ""
-"The controller's ID.\n"
-"A controller ID of 0 is unbound and will always result in an inactive node. "
-"Controller ID 1 is reserved for the first controller that identifies itself "
-"as the left-hand controller and ID 2 is reserved for the first controller "
-"that identifies itself as the right-hand controller.\n"
-"For any other controller that the [ARVRServer] detects, we continue with "
-"controller ID 3.\n"
-"When a controller is turned off, its slot is freed. This ensures controllers "
-"will keep the same ID even when controllers with lower IDs are turned off."
-msgstr ""
-
-#: doc/classes/ARVRController.xml:77
-msgid ""
-"The degree to which the controller vibrates. Ranges from [code]0.0[/code] to "
-"[code]1.0[/code] with precision [code].01[/code]. If changed, updates "
-"[member ARVRPositionalTracker.rumble] accordingly.\n"
-"This is a useful property to animate if you want the controller to vibrate "
-"for a limited duration."
-msgstr ""
-
-#: doc/classes/ARVRController.xml:86
-msgid "Emitted when a button on this controller is pressed."
-msgstr ""
-
-#: doc/classes/ARVRController.xml:93
-msgid "Emitted when a button on this controller is released."
-msgstr ""
-
-#: doc/classes/ARVRController.xml:100
-msgid ""
-"Emitted when the mesh associated with the controller changes or when one "
-"becomes available. Generally speaking this will be a static mesh after "
-"becoming available."
-msgstr ""
-
-#: doc/classes/ARVRInterface.xml:4
-msgid "Base class for an AR/VR interface implementation."
-msgstr ""
-
-#: doc/classes/ARVRInterface.xml:7
-msgid ""
-"This class needs to be implemented to make an AR or VR platform available to "
-"Godot and these should be implemented as C++ modules or GDNative modules "
-"(note that for GDNative the subclass ARVRScriptInterface should be used). "
-"Part of the interface is exposed to GDScript so you can detect, enable and "
-"configure an AR or VR platform.\n"
-"Interfaces should be written in such a way that simply enabling them will "
-"give us a working setup. You can query the available interfaces through "
-"[ARVRServer]."
-msgstr ""
-
-#: doc/classes/ARVRInterface.xml:18
-msgid ""
-"If this is an AR interface that requires displaying a camera feed as the "
-"background, this method returns the feed ID in the [CameraServer] for this "
-"interface."
-msgstr ""
-
-#: doc/classes/ARVRInterface.xml:25
-msgid ""
-"Returns a combination of [enum Capabilities] flags providing information "
-"about the capabilities of this interface."
-msgstr ""
-
-#: doc/classes/ARVRInterface.xml:32
-msgid "Returns the name of this interface (OpenVR, OpenHMD, ARKit, etc)."
-msgstr ""
-
-#: doc/classes/ARVRInterface.xml:39
-msgid ""
-"Returns the resolution at which we should render our intermediate results "
-"before things like lens distortion are applied by the VR platform."
-msgstr ""
-
-#: doc/classes/ARVRInterface.xml:46
-msgid ""
-"If supported, returns the status of our tracking. This will allow you to "
-"provide feedback to the user whether there are issues with positional "
-"tracking."
-msgstr ""
-
-#: doc/classes/ARVRInterface.xml:53
-msgid ""
-"Call this to initialize this interface. The first interface that is "
-"initialized is identified as the primary interface and it will be used for "
-"rendering output.\n"
-"After initializing the interface you want to use you then need to enable the "
-"AR/VR mode of a viewport and rendering should commence.\n"
-"[b]Note:[/b] You must enable the AR/VR mode on the main viewport for any "
-"device that uses the main output of Godot, such as for mobile VR.\n"
-"If you do this for a platform that handles its own output (such as OpenVR) "
-"Godot will show just one eye without distortion on screen. Alternatively, "
-"you can add a separate viewport node to your scene and enable AR/VR on that "
-"viewport. It will be used to output to the HMD, leaving you free to do "
-"anything you like in the main window, such as using a separate camera as a "
-"spectator camera or rendering something completely different.\n"
-"While currently not used, you can activate additional interfaces. You may "
-"wish to do this if you want to track controllers from other platforms. "
-"However, at this point in time only one interface can render to an HMD."
-msgstr ""
-
-#: doc/classes/ARVRInterface.xml:64
-msgid ""
-"Returns [code]true[/code] if the current output of this interface is in "
-"stereo."
-msgstr ""
-
-#: doc/classes/ARVRInterface.xml:71
-msgid "Turns the interface off."
-msgstr ""
-
-#: doc/classes/ARVRInterface.xml:77
-msgid "On an AR interface, [code]true[/code] if anchor detection is enabled."
-msgstr ""
-
-#: doc/classes/ARVRInterface.xml:80
-msgid "[code]true[/code] if this interface been initialized."
-msgstr ""
-
-#: doc/classes/ARVRInterface.xml:83
-msgid "[code]true[/code] if this is the primary interface."
-msgstr ""
-
-#: doc/classes/ARVRInterface.xml:88
-msgid "No ARVR capabilities."
-msgstr ""
-
-#: doc/classes/ARVRInterface.xml:91
-msgid ""
-"This interface can work with normal rendering output (non-HMD based AR)."
-msgstr ""
-
-#: doc/classes/ARVRInterface.xml:94
-msgid "This interface supports stereoscopic rendering."
-msgstr ""
-
-#: doc/classes/ARVRInterface.xml:97
-msgid "This interface supports AR (video background and real world tracking)."
-msgstr ""
-
-#: doc/classes/ARVRInterface.xml:100
-msgid ""
-"This interface outputs to an external device. If the main viewport is used, "
-"the on screen output is an unmodified buffer of either the left or right eye "
-"(stretched if the viewport size is not changed to the same aspect ratio of "
-"[method get_render_targetsize]). Using a separate viewport node frees up the "
-"main viewport for other purposes."
-msgstr ""
-
-#: doc/classes/ARVRInterface.xml:103
-msgid ""
-"Mono output, this is mostly used internally when retrieving positioning "
-"information for our camera node or when stereo scopic rendering is not "
-"supported."
-msgstr ""
-
-#: doc/classes/ARVRInterface.xml:106
-msgid ""
-"Left eye output, this is mostly used internally when rendering the image for "
-"the left eye and obtaining positioning and projection information."
-msgstr ""
-
-#: doc/classes/ARVRInterface.xml:109
-msgid ""
-"Right eye output, this is mostly used internally when rendering the image "
-"for the right eye and obtaining positioning and projection information."
-msgstr ""
-
-#: doc/classes/ARVRInterface.xml:112
-msgid "Tracking is behaving as expected."
-msgstr ""
-
-#: doc/classes/ARVRInterface.xml:115
-msgid ""
-"Tracking is hindered by excessive motion (the player is moving faster than "
-"tracking can keep up)."
-msgstr ""
-
-#: doc/classes/ARVRInterface.xml:118
-msgid ""
-"Tracking is hindered by insufficient features, it's too dark (for camera-"
-"based tracking), player is blocked, etc."
-msgstr ""
-
-#: doc/classes/ARVRInterface.xml:121
-msgid ""
-"We don't know the status of the tracking or this interface does not provide "
-"feedback."
-msgstr ""
-
-#: doc/classes/ARVRInterface.xml:124
-msgid ""
-"Tracking is not functional (camera not plugged in or obscured, lighthouses "
-"turned off, etc.)."
-msgstr ""
-
-#: modules/gdnative/doc_classes/ARVRInterfaceGDNative.xml:4
-msgid "GDNative wrapper for an ARVR interface."
-msgstr ""
-
-#: modules/gdnative/doc_classes/ARVRInterfaceGDNative.xml:7
-msgid ""
-"This is a wrapper class for GDNative implementations of the ARVR interface. "
-"To use a GDNative ARVR interface, simply instantiate this object and set "
-"your GDNative library containing the ARVR interface implementation."
-msgstr ""
-
-#: doc/classes/ARVROrigin.xml:4
-msgid "The origin point in AR/VR."
-msgstr ""
-
-#: doc/classes/ARVROrigin.xml:7
-msgid ""
-"This is a special node within the AR/VR system that maps the physical "
-"location of the center of our tracking space to the virtual location within "
-"our game world.\n"
-"There should be only one of these nodes in your scene and you must have one. "
-"All the ARVRCamera, ARVRController and ARVRAnchor nodes should be direct "
-"children of this node for spatial tracking to work correctly.\n"
-"It is the position of this node that you update when your character needs to "
-"move through your game world while we're not moving in the real world. "
-"Movement in the real world is always in relation to this origin point.\n"
-"For example, if your character is driving a car, the ARVROrigin node should "
-"be a child node of this car. Or, if you're implementing a teleport system to "
-"move your character, you should change the position of this node."
-msgstr ""
-
-#: doc/classes/ARVROrigin.xml:19
-msgid ""
-"Allows you to adjust the scale to your game's units. Most AR/VR platforms "
-"assume a scale of 1 game world unit = 1 real world meter.\n"
-"[b]Note:[/b] This method is a passthrough to the [ARVRServer] itself."
-msgstr ""
-
-#: doc/classes/ARVRPositionalTracker.xml:4
-msgid "A tracked object."
-msgstr ""
-
-#: doc/classes/ARVRPositionalTracker.xml:7
-msgid ""
-"An instance of this object represents a device that is tracked, such as a "
-"controller or anchor point. HMDs aren't represented here as they are handled "
-"internally.\n"
-"As controllers are turned on and the AR/VR interface detects them, instances "
-"of this object are automatically added to this list of active tracking "
-"objects accessible through the [ARVRServer].\n"
-"The [ARVRController] and [ARVRAnchor] both consume objects of this type and "
-"should be used in your project. The positional trackers are just under-the-"
-"hood objects that make this all work. These are mostly exposed so that "
-"GDNative-based interfaces can interact with them."
-msgstr ""
-
-#: doc/classes/ARVRPositionalTracker.xml:19
-msgid ""
-"Returns the hand holding this tracker, if known. See [enum TrackerHand] "
-"constants."
-msgstr ""
-
-#: doc/classes/ARVRPositionalTracker.xml:26
-msgid ""
-"If this is a controller that is being tracked, the controller will also be "
-"represented by a joystick entry with this ID."
-msgstr ""
-
-#: doc/classes/ARVRPositionalTracker.xml:33
-msgid ""
-"Returns the mesh related to a controller or anchor point if one is available."
-msgstr ""
-
-#: doc/classes/ARVRPositionalTracker.xml:40
-msgid "Returns the controller or anchor point's name if available."
-msgstr ""
-
-#: doc/classes/ARVRPositionalTracker.xml:47
-msgid "Returns the controller's orientation matrix."
-msgstr ""
-
-#: doc/classes/ARVRPositionalTracker.xml:54
-msgid "Returns the world-space controller position."
-msgstr ""
-
-#: doc/classes/ARVRPositionalTracker.xml:61
-msgid ""
-"Returns the internal tracker ID. This uniquely identifies the tracker per "
-"tracker type and matches the ID you need to specify for nodes such as the "
-"[ARVRController] and [ARVRAnchor] nodes."
-msgstr ""
-
-#: doc/classes/ARVRPositionalTracker.xml:68
-msgid "Returns [code]true[/code] if this device tracks orientation."
-msgstr ""
-
-#: doc/classes/ARVRPositionalTracker.xml:75
-msgid "Returns [code]true[/code] if this device tracks position."
-msgstr ""
-
-#: doc/classes/ARVRPositionalTracker.xml:84
-msgid "Returns the transform combining this device's orientation and position."
-msgstr ""
-
-#: doc/classes/ARVRPositionalTracker.xml:91
-msgid "Returns the tracker's type."
-msgstr ""
-
-#: doc/classes/ARVRPositionalTracker.xml:97
-msgid ""
-"The degree to which the tracker rumbles. Ranges from [code]0.0[/code] to "
-"[code]1.0[/code] with precision [code].01[/code]."
-msgstr ""
-
-#: doc/classes/ARVRPositionalTracker.xml:102
-msgid "The hand this tracker is held in is unknown or not applicable."
-msgstr ""
-
-#: doc/classes/ARVRPositionalTracker.xml:105
-msgid "This tracker is the left hand controller."
-msgstr ""
-
-#: doc/classes/ARVRPositionalTracker.xml:108
-msgid "This tracker is the right hand controller."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:4
-msgid "Server for AR and VR features."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:7
-msgid ""
-"The AR/VR server is the heart of our Advanced and Virtual Reality solution "
-"and handles all the processing."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:21
-msgid ""
-"This is an important function to understand correctly. AR and VR platforms "
-"all handle positioning slightly differently.\n"
-"For platforms that do not offer spatial tracking, our origin point (0,0,0) "
-"is the location of our HMD, but you have little control over the direction "
-"the player is facing in the real world.\n"
-"For platforms that do offer spatial tracking, our origin point depends very "
-"much on the system. For OpenVR, our origin point is usually the center of "
-"the tracking space, on the ground. For other platforms, it's often the "
-"location of the tracking camera.\n"
-"This method allows you to center your tracker on the location of the HMD. It "
-"will take the current location of the HMD and use that to adjust all your "
-"tracking data; in essence, realigning the real world to your player's "
-"current position in the game world.\n"
-"For this method to produce usable results, tracking information must be "
-"available. This often takes a few frames after starting your game.\n"
-"You should call this method after a few seconds have passed. For instance, "
-"when the user requests a realignment of the display holding a designated "
-"button on a controller for a short period of time, or when implementing a "
-"teleport mechanism."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:35
-msgid ""
-"Finds an interface by its name. For instance, if your project uses "
-"capabilities of an AR/VR platform, you can find the interface for that "
-"platform by name and initialize it."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:42
-msgid "Returns the primary interface's transformation."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:51
-msgid ""
-"Returns the interface registered at a given index in our list of interfaces."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:58
-msgid ""
-"Returns the number of interfaces currently registered with the AR/VR server. "
-"If your project supports multiple AR/VR platforms, you can look through the "
-"available interface, and either present the user with a selection or simply "
-"try to initialize each interface and use the first one that returns "
-"[code]true[/code]."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:65
-msgid ""
-"Returns a list of available interfaces the ID and name of each interface."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:72
-msgid ""
-"Returns the absolute timestamp (in μs) of the last [ARVRServer] commit of "
-"the AR/VR eyes to [RenderingServer]. The value comes from an internal call "
-"to [method OS.get_ticks_usec]."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:79
-msgid ""
-"Returns the duration (in μs) of the last frame. This is computed as the "
-"difference between [method get_last_commit_usec] and [method "
-"get_last_process_usec] when committing."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:86
-msgid ""
-"Returns the absolute timestamp (in μs) of the last [ARVRServer] process "
-"callback. The value comes from an internal call to [method OS."
-"get_ticks_usec]."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:93
-msgid ""
-"Returns the reference frame transform. Mostly used internally and exposed "
-"for GDNative build interfaces."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:102
-msgid "Returns the positional tracker at the given ID."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:109
-msgid "Returns the number of trackers currently registered."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:115
-msgid "The primary [ARVRInterface] currently bound to the [ARVRServer]."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:118
-msgid ""
-"Allows you to adjust the scale to your game's units. Most AR/VR platforms "
-"assume a scale of 1 game world unit = 1 real world meter."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:126
-msgid "Emitted when a new interface has been added."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:133
-msgid "Emitted when an interface is removed."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:144
-msgid ""
-"Emitted when a new tracker has been added. If you don't use a fixed number "
-"of controllers or if you're using [ARVRAnchor]s for an AR solution, it is "
-"important to react to this signal to add the appropriate [ARVRController] or "
-"[ARVRAnchor] nodes related to this new tracker."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:155
-msgid ""
-"Emitted when a tracker is removed. You should remove any [ARVRController] or "
-"[ARVRAnchor] points if applicable. This is not mandatory, the nodes simply "
-"become inactive and will be made active again when a new tracker becomes "
-"available (i.e. a new controller is switched on that takes the place of the "
-"previous one)."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:161
-msgid "The tracker tracks the location of a controller."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:164
-msgid "The tracker tracks the location of a base station."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:167
-msgid "The tracker tracks the location and size of an AR anchor."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:170
-msgid "Used internally to filter trackers of any known type."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:173
-msgid "Used internally if we haven't set the tracker type yet."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:176
-msgid "Used internally to select all trackers."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:179
-msgid ""
-"Fully reset the orientation of the HMD. Regardless of what direction the "
-"user is looking to in the real world. The user will look dead ahead in the "
-"virtual world."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:182
-msgid ""
-"Resets the orientation but keeps the tilt of the device. So if we're looking "
-"down, we keep looking down but heading will be reset."
-msgstr ""
-
-#: doc/classes/ARVRServer.xml:185
-msgid ""
-"Does not reset the orientation of the HMD, only the position of the player "
-"gets centered."
-msgstr ""
-
#: doc/classes/AStar.xml:4
msgid ""
"An implementation of A* to find shortest paths among connected points in "
@@ -8387,7 +7751,9 @@ msgstr ""
#: doc/classes/AudioStreamPlayer.xml:64 doc/classes/AudioStreamPlayer2D.xml:70
#: doc/classes/AudioStreamPlayer3D.xml:94
-msgid "Changes the pitch and the tempo of the audio."
+msgid ""
+"The pitch and the tempo of the audio, as a multiplier of the audio sample's "
+"sample rate."
msgstr ""
#: doc/classes/AudioStreamPlayer.xml:67 doc/classes/AudioStreamPlayer2D.xml:73
@@ -8632,15 +7998,23 @@ msgid "Audio format. See [enum Format] constants for values."
msgstr ""
#: doc/classes/AudioStreamSample.xml:33
-msgid "Loop start in bytes."
+msgid ""
+"The loop start point (in number of samples, relative to the beginning of the "
+"sample). This information will be imported automatically from the WAV file "
+"if present."
msgstr ""
#: doc/classes/AudioStreamSample.xml:36
-msgid "Loop end in bytes."
+msgid ""
+"The loop end point (in number of samples, relative to the beginning of the "
+"sample). This information will be imported automatically from the WAV file "
+"if present."
msgstr ""
#: doc/classes/AudioStreamSample.xml:39
-msgid "Loop mode. See [enum LoopMode] constants for values."
+msgid ""
+"The loop mode. This information will be imported automatically from the WAV "
+"file if present. See [enum LoopMode] constants for values."
msgstr ""
#: doc/classes/AudioStreamSample.xml:42
@@ -8669,19 +8043,19 @@ msgstr ""
#: doc/classes/AudioStreamSample.xml:62
msgid ""
-"Audio loops the data between [member loop_begin] and [member loop_end] "
+"Audio loops the data between [member loop_begin] and [member loop_end], "
"playing forward only."
msgstr ""
#: doc/classes/AudioStreamSample.xml:65
msgid ""
-"Audio loops the data between [member loop_begin] and [member loop_end] "
+"Audio loops the data between [member loop_begin] and [member loop_end], "
"playing back and forth."
msgstr ""
#: doc/classes/AudioStreamSample.xml:68
msgid ""
-"Audio loops the data between [member loop_begin] and [member loop_end] "
+"Audio loops the data between [member loop_begin] and [member loop_end], "
"playing backward only."
msgstr ""
@@ -8698,30 +8072,35 @@ msgid ""
"in the BackBufferCopy node is bufferized with the content of the screen it "
"covers, or the entire screen according to the copy mode set. Use the "
"[code]texture(SCREEN_TEXTURE, ...)[/code] function in your shader scripts to "
-"access the buffer."
+"access the buffer.\n"
+"[b]Note:[/b] Since this node inherits from [Node2D] (and not [Control]), "
+"anchors and margins won't apply to child [Control]-derived nodes. This can "
+"be problematic when resizing the window. To avoid this, add [Control]-"
+"derived nodes as [i]siblings[/i] to the BackBufferCopy node instead of "
+"adding them as children."
msgstr ""
-#: doc/classes/BackBufferCopy.xml:15
+#: doc/classes/BackBufferCopy.xml:16
msgid "Buffer mode. See [enum CopyMode] constants."
msgstr ""
-#: doc/classes/BackBufferCopy.xml:18
+#: doc/classes/BackBufferCopy.xml:19
msgid ""
"The area covered by the BackBufferCopy. Only used if [member copy_mode] is "
"[constant COPY_MODE_RECT]."
msgstr ""
-#: doc/classes/BackBufferCopy.xml:23
+#: doc/classes/BackBufferCopy.xml:24
msgid ""
"Disables the buffering mode. This means the BackBufferCopy node will "
"directly use the portion of screen it covers."
msgstr ""
-#: doc/classes/BackBufferCopy.xml:26
+#: doc/classes/BackBufferCopy.xml:27
msgid "BackBufferCopy buffers a rectangular region."
msgstr ""
-#: doc/classes/BackBufferCopy.xml:29
+#: doc/classes/BackBufferCopy.xml:30
msgid "BackBufferCopy buffers the entire screen."
msgstr ""
@@ -8791,80 +8170,83 @@ msgstr ""
#: doc/classes/BaseButton.xml:62
msgid ""
"If [code]true[/code], the button stays pressed when moving the cursor "
-"outside the button while pressing it."
+"outside the button while pressing it.\n"
+"[b]Note:[/b] This property only affects the button's visual appearance. "
+"Signals will be emitted at the same moment regardless of this property's "
+"value."
msgstr ""
-#: doc/classes/BaseButton.xml:65
+#: doc/classes/BaseButton.xml:66
msgid ""
"If [code]true[/code], the button's state is pressed. Means the button is "
"pressed down or toggled (if [member toggle_mode] is active)."
msgstr ""
-#: doc/classes/BaseButton.xml:68
+#: doc/classes/BaseButton.xml:69
msgid "[ShortCut] associated to the button."
msgstr ""
-#: doc/classes/BaseButton.xml:71
+#: doc/classes/BaseButton.xml:72
msgid ""
"If [code]true[/code], the button will add information about its shortcut in "
"the tooltip."
msgstr ""
-#: doc/classes/BaseButton.xml:74
+#: doc/classes/BaseButton.xml:75
msgid ""
"If [code]true[/code], the button is in toggle mode. Makes the button flip "
"state between pressed and unpressed each time its area is clicked."
msgstr ""
-#: doc/classes/BaseButton.xml:80
+#: doc/classes/BaseButton.xml:81
msgid "Emitted when the button starts being held down."
msgstr ""
-#: doc/classes/BaseButton.xml:85
+#: doc/classes/BaseButton.xml:86
msgid "Emitted when the button stops being held down."
msgstr ""
-#: doc/classes/BaseButton.xml:90
+#: doc/classes/BaseButton.xml:91
msgid ""
"Emitted when the button is toggled or pressed. This is on [signal "
"button_down] if [member action_mode] is [constant ACTION_MODE_BUTTON_PRESS] "
"and on [signal button_up] otherwise."
msgstr ""
-#: doc/classes/BaseButton.xml:97
+#: doc/classes/BaseButton.xml:98
msgid ""
"Emitted when the button was just toggled between pressed and normal states "
"(only if [member toggle_mode] is active). The new state is contained in the "
"[code]button_pressed[/code] argument."
msgstr ""
-#: doc/classes/BaseButton.xml:103
+#: doc/classes/BaseButton.xml:104
msgid ""
"The normal state (i.e. not pressed, not hovered, not toggled and enabled) of "
"buttons."
msgstr ""
-#: doc/classes/BaseButton.xml:106
+#: doc/classes/BaseButton.xml:107
msgid "The state of buttons are pressed."
msgstr ""
-#: doc/classes/BaseButton.xml:109
+#: doc/classes/BaseButton.xml:110
msgid "The state of buttons are hovered."
msgstr ""
-#: doc/classes/BaseButton.xml:112
+#: doc/classes/BaseButton.xml:113
msgid "The state of buttons are disabled."
msgstr ""
-#: doc/classes/BaseButton.xml:115
+#: doc/classes/BaseButton.xml:116
msgid "The state of buttons are both hovered and pressed."
msgstr ""
-#: doc/classes/BaseButton.xml:118
+#: doc/classes/BaseButton.xml:119
msgid "Require just a press to consider the button clicked."
msgstr ""
-#: doc/classes/BaseButton.xml:121
+#: doc/classes/BaseButton.xml:122
msgid ""
"Require a press and a subsequent release before considering the button "
"clicked."
@@ -8988,8 +8370,8 @@ msgid ""
"the object."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:109 doc/classes/BaseMaterial3D.xml:275
-#: doc/classes/BaseMaterial3D.xml:296
+#: doc/classes/BaseMaterial3D.xml:109 doc/classes/BaseMaterial3D.xml:284
+#: doc/classes/BaseMaterial3D.xml:305
msgid ""
"Specifies the channel of the [member ao_texture] in which the ambient "
"occlusion information is stored. This is useful when you store the "
@@ -9000,29 +8382,45 @@ msgstr ""
#: doc/classes/BaseMaterial3D.xml:112
msgid ""
+"The color used by the backlight effect. Represents the light passing through "
+"an object."
+msgstr ""
+
+#: doc/classes/BaseMaterial3D.xml:115
+msgid "If [code]true[/code], the backlight effect is enabled."
+msgstr ""
+
+#: doc/classes/BaseMaterial3D.xml:118
+msgid ""
+"Texture used to control the backlight effect per-pixel. Added to [member "
+"backlight]."
+msgstr ""
+
+#: doc/classes/BaseMaterial3D.xml:121
+msgid ""
"If [code]true[/code], the shader will keep the scale set for the mesh. "
"Otherwise the scale is lost when billboarding. Only applies when [member "
"billboard_mode] is [constant BILLBOARD_ENABLED]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:115
+#: doc/classes/BaseMaterial3D.xml:124
msgid "Controls how the object faces the camera. See [enum BillboardMode]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:118
+#: doc/classes/BaseMaterial3D.xml:127
msgid ""
"The material's blend mode.\n"
"[b]Note:[/b] Values other than [code]Mix[/code] force the object into the "
"transparent pipeline. See [enum BlendMode]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:122
+#: doc/classes/BaseMaterial3D.xml:131
msgid ""
"Sets the strength of the clearcoat effect. Setting to [code]0[/code] looks "
"the same as disabling the clearcoat effect."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:125
+#: doc/classes/BaseMaterial3D.xml:134
msgid ""
"If [code]true[/code], clearcoat rendering is enabled. Adds a secondary "
"transparent pass to the lighting calculation resulting in an added specular "
@@ -9030,42 +8428,42 @@ msgid ""
"can be either glossy or rough."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:128
+#: doc/classes/BaseMaterial3D.xml:137
msgid ""
"Sets the roughness of the clearcoat pass. A higher value results in a "
"smoother clearcoat while a lower value results in a rougher clearcoat."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:131
+#: doc/classes/BaseMaterial3D.xml:140
msgid ""
"Texture that defines the strength of the clearcoat effect and the glossiness "
"of the clearcoat. Strength is specified in the red channel while glossiness "
"is specified in the green channel."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:134
+#: doc/classes/BaseMaterial3D.xml:143
msgid ""
"Which side of the object is not drawn when backfaces are rendered. See [enum "
"CullMode]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:137
+#: doc/classes/BaseMaterial3D.xml:146
msgid ""
"Determines when depth rendering takes place. See [enum DepthDrawMode]. See "
"also [member transparency]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:140
+#: doc/classes/BaseMaterial3D.xml:149
msgid "Texture that specifies the color of the detail overlay."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:143
+#: doc/classes/BaseMaterial3D.xml:152
msgid ""
"Specifies how the [member detail_albedo] should blend with the current "
"[code]ALBEDO[/code]. See [enum BlendMode] for options."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:146
+#: doc/classes/BaseMaterial3D.xml:155
msgid ""
"If [code]true[/code], enables the detail overlay. Detail is a second texture "
"that gets mixed over the surface of the object based on [member "
@@ -9073,99 +8471,99 @@ msgid ""
"between two different albedo/normal textures."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:149
+#: doc/classes/BaseMaterial3D.xml:158
msgid ""
"Texture used to specify how the detail textures get blended with the base "
"textures."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:152
+#: doc/classes/BaseMaterial3D.xml:161
msgid "Texture that specifies the per-pixel normal of the detail overlay."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:155
+#: doc/classes/BaseMaterial3D.xml:164
msgid ""
"Specifies whether to use [code]UV[/code] or [code]UV2[/code] for the detail "
"layer. See [enum DetailUV] for options."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:158
+#: doc/classes/BaseMaterial3D.xml:167
msgid ""
"The algorithm used for diffuse light scattering. See [enum DiffuseMode]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:161
+#: doc/classes/BaseMaterial3D.xml:170
msgid "If [code]true[/code], the object receives no ambient light."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:164
+#: doc/classes/BaseMaterial3D.xml:173
msgid ""
"If [code]true[/code], the object receives no shadow that would otherwise be "
"cast onto it."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:167
+#: doc/classes/BaseMaterial3D.xml:176
msgid "Distance at which the object fades fully and is no longer visible."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:170
+#: doc/classes/BaseMaterial3D.xml:179
msgid ""
"Distance at which the object starts to fade. If the object is less than this "
"distance away it will appear normal."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:173
+#: doc/classes/BaseMaterial3D.xml:182
msgid ""
"Specifies which type of fade to use. Can be any of the [enum "
"DistanceFadeMode]s."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:176
+#: doc/classes/BaseMaterial3D.xml:185
msgid "The emitted light's color. See [member emission_enabled]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:179
+#: doc/classes/BaseMaterial3D.xml:188
msgid ""
"If [code]true[/code], the body emits light. Emitting light makes the object "
"appear brighter. The object can also cast light on other objects if a "
"[GIProbe] is used and this object is used in baked lighting."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:182
+#: doc/classes/BaseMaterial3D.xml:191
msgid "The emitted light's strength. See [member emission_enabled]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:185
+#: doc/classes/BaseMaterial3D.xml:194
msgid "Use [code]UV2[/code] to read from the [member emission_texture]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:188
+#: doc/classes/BaseMaterial3D.xml:197
msgid ""
"Sets how [member emission] interacts with [member emission_texture]. Can "
"either add or multiply. See [enum EmissionOperator] for options."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:191
+#: doc/classes/BaseMaterial3D.xml:200
msgid "Texture that specifies how much surface emits light at a given point."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:194
+#: doc/classes/BaseMaterial3D.xml:203
msgid ""
"If [code]true[/code], the object is rendered at the same size regardless of "
"distance."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:197
+#: doc/classes/BaseMaterial3D.xml:206
msgid ""
"If [code]true[/code], enables the vertex grow setting. See [member "
"grow_amount]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:200
+#: doc/classes/BaseMaterial3D.xml:209
msgid "Grows object vertices in the direction of their normals."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:221
+#: doc/classes/BaseMaterial3D.xml:230
msgid ""
"A high value makes the material appear more like a metal. Non-metals use "
"their albedo as the diffuse color and add diffuse to the specular "
@@ -9178,7 +8576,7 @@ msgid ""
"roughness]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:224
+#: doc/classes/BaseMaterial3D.xml:233
msgid ""
"Sets the size of the specular lobe. The specular lobe is the bright spot "
"that is reflected from light sources.\n"
@@ -9187,13 +8585,13 @@ msgid ""
"roughness]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:228
+#: doc/classes/BaseMaterial3D.xml:237
msgid ""
"Texture used to specify metallic for an object. This is multiplied by "
"[member metallic]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:231
+#: doc/classes/BaseMaterial3D.xml:240
msgid ""
"Specifies the channel of the [member metallic_texture] in which the metallic "
"information is stored. This is useful when you store the information for "
@@ -9202,21 +8600,21 @@ msgid ""
"you could reduce the number of textures you use."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:234
+#: doc/classes/BaseMaterial3D.xml:243
msgid ""
"If [code]true[/code], depth testing is disabled and the object will be drawn "
"in render order."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:237
+#: doc/classes/BaseMaterial3D.xml:246
msgid "If [code]true[/code], normal mapping is enabled."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:240
+#: doc/classes/BaseMaterial3D.xml:249
msgid "The strength of the normal map's effect."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:243
+#: doc/classes/BaseMaterial3D.xml:252
msgid ""
"Texture used to specify the normal at a given pixel. The "
"[code]normal_texture[/code] only uses the red and green channels. The normal "
@@ -9224,93 +8622,100 @@ msgid ""
"provided by the [Mesh]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:248
+#: doc/classes/BaseMaterial3D.xml:257
msgid ""
"The number of horizontal frames in the particle sprite sheet. Only enabled "
"when using [constant BILLBOARD_PARTICLES]. See [member billboard_mode]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:251
+#: doc/classes/BaseMaterial3D.xml:260
msgid ""
"If [code]true[/code], particle animations are looped. Only enabled when "
"using [constant BILLBOARD_PARTICLES]. See [member billboard_mode]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:254
+#: doc/classes/BaseMaterial3D.xml:263
msgid ""
"The number of vertical frames in the particle sprite sheet. Only enabled "
"when using [constant BILLBOARD_PARTICLES]. See [member billboard_mode]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:257
+#: doc/classes/BaseMaterial3D.xml:266
msgid "The point size in pixels. See [member use_point_size]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:260
+#: doc/classes/BaseMaterial3D.xml:269
msgid ""
"Distance over which the fade effect takes place. The larger the distance the "
"longer it takes for an object to fade."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:263
+#: doc/classes/BaseMaterial3D.xml:272
msgid ""
"If [code]true[/code], the proximity fade effect is enabled. The proximity "
"fade effect fades out each pixel based on its distance to another object."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:266
+#: doc/classes/BaseMaterial3D.xml:275
msgid ""
"If [code]true[/code], the refraction effect is enabled. Distorts "
"transparency based on light from behind the object."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:269
+#: doc/classes/BaseMaterial3D.xml:278
msgid "The strength of the refraction effect."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:272
+#: doc/classes/BaseMaterial3D.xml:281
msgid ""
"Texture that controls the strength of the refraction per-pixel. Multiplied "
"by [member refraction_scale]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:278
+#: doc/classes/BaseMaterial3D.xml:287
msgid "Sets the strength of the rim lighting effect."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:281
+#: doc/classes/BaseMaterial3D.xml:290
msgid ""
"If [code]true[/code], rim effect is enabled. Rim lighting increases the "
"brightness at glancing angles on an object."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:284
+#: doc/classes/BaseMaterial3D.xml:293
msgid ""
"Texture used to set the strength of the rim lighting effect per-pixel. "
"Multiplied by [member rim]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:287
+#: doc/classes/BaseMaterial3D.xml:296
msgid ""
"The amount of to blend light and albedo color when rendering rim effect. If "
"[code]0[/code] the light color is used, while [code]1[/code] means albedo "
"color is used. An intermediate value generally works best."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:290
+#: doc/classes/BaseMaterial3D.xml:299
msgid ""
"Surface reflection. A value of [code]0[/code] represents a perfect mirror "
"while a value of [code]1[/code] completely blurs the reflection. See also "
"[member metallic]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:293
+#: doc/classes/BaseMaterial3D.xml:302
msgid ""
"Texture used to control the roughness per-pixel. Multiplied by [member "
"roughness]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:301
+#: doc/classes/BaseMaterial3D.xml:308
+msgid ""
+"Sets whether the shading takes place per-pixel or per-vertex. Per-vertex "
+"lighting is faster, making it the best choice for mobile applications, "
+"however it looks considerably worse than per-pixel."
+msgstr ""
+
+#: doc/classes/BaseMaterial3D.xml:311
msgid ""
"If [code]true[/code], enables the \"shadow to opacity\" render mode where "
"lighting modifies the alpha so shadowed areas are opaque and non-shadowed "
@@ -9318,77 +8723,67 @@ msgid ""
"AR."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:304
+#: doc/classes/BaseMaterial3D.xml:314
msgid "The method for rendering the specular blob. See [enum SpecularMode]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:307
+#: doc/classes/BaseMaterial3D.xml:317
msgid ""
"If [code]true[/code], subsurface scattering is enabled. Emulates light that "
"penetrates an object's surface, is scattered, and then emerges."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:312
+#: doc/classes/BaseMaterial3D.xml:320
+msgid ""
+"If [code]true[/code], subsurface scattering will use a special mode "
+"optimized for the color and density of human skin."
+msgstr ""
+
+#: doc/classes/BaseMaterial3D.xml:323
msgid "The strength of the subsurface scattering effect."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:315
+#: doc/classes/BaseMaterial3D.xml:326
msgid ""
"Texture used to control the subsurface scattering strength. Stored in the "
"red texture channel. Multiplied by [member subsurf_scatter_strength]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:318
+#: doc/classes/BaseMaterial3D.xml:341
msgid "Filter flags for the texture. See [enum TextureFilter] for options."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:321
+#: doc/classes/BaseMaterial3D.xml:344
msgid "Repeat flags for the texture. See [enum TextureFilter] for options."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:324
-msgid ""
-"The color used by the transmission effect. Represents the light passing "
-"through an object."
-msgstr ""
-
-#: doc/classes/BaseMaterial3D.xml:327
-msgid "If [code]true[/code], the transmission effect is enabled."
-msgstr ""
-
-#: doc/classes/BaseMaterial3D.xml:330
-msgid ""
-"Texture used to control the transmission effect per-pixel. Added to [member "
-"transmission]."
-msgstr ""
-
-#: doc/classes/BaseMaterial3D.xml:333
+#: doc/classes/BaseMaterial3D.xml:347
msgid ""
"If [code]true[/code], transparency is enabled on the body. See also [member "
"blend_mode]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:336
+#: doc/classes/BaseMaterial3D.xml:350
msgid ""
"If [code]true[/code], render point size can be changed.\n"
"[b]Note:[/b] this is only effective for objects whose geometry is point-"
"based rather than triangle-based. See also [member point_size]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:340
+#: doc/classes/BaseMaterial3D.xml:354
msgid ""
"How much to offset the [code]UV[/code] coordinates. This amount will be "
"added to [code]UV[/code] in the vertex function. This can be used to offset "
"a texture."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:343
+#: doc/classes/BaseMaterial3D.xml:357
msgid ""
"How much to scale the [code]UV[/code] coordinates. This is multiplied by "
"[code]UV[/code] in the vertex function."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:346
+#: doc/classes/BaseMaterial3D.xml:360
msgid ""
"If [code]true[/code], instead of using [code]UV[/code] textures will use a "
"triplanar texture lookup to determine how to apply textures. Triplanar uses "
@@ -9402,32 +8797,32 @@ msgid ""
"when you are trying to achieve crisp texturing."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:349 doc/classes/BaseMaterial3D.xml:364
+#: doc/classes/BaseMaterial3D.xml:363 doc/classes/BaseMaterial3D.xml:378
msgid ""
"A lower number blends the texture more softly while a higher number blends "
"the texture more sharply."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:352
+#: doc/classes/BaseMaterial3D.xml:366
msgid ""
"If [code]true[/code], triplanar mapping for [code]UV[/code] is calculated in "
"world space rather than object local space. See also [member uv1_triplanar]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:355
+#: doc/classes/BaseMaterial3D.xml:369
msgid ""
"How much to offset the [code]UV2[/code] coordinates. This amount will be "
"added to [code]UV2[/code] in the vertex function. This can be used to offset "
"a texture."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:358
+#: doc/classes/BaseMaterial3D.xml:372
msgid ""
"How much to scale the [code]UV2[/code] coordinates. This is multiplied by "
"[code]UV2[/code] in the vertex function."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:361
+#: doc/classes/BaseMaterial3D.xml:375
msgid ""
"If [code]true[/code], instead of using [code]UV2[/code] textures will use a "
"triplanar texture lookup to determine how to apply textures. Triplanar uses "
@@ -9441,368 +8836,443 @@ msgid ""
"when you are trying to achieve crisp texturing."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:367
+#: doc/classes/BaseMaterial3D.xml:381
msgid ""
"If [code]true[/code], triplanar mapping for [code]UV2[/code] is calculated "
"in world space rather than object local space. See also [member "
"uv2_triplanar]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:370
+#: doc/classes/BaseMaterial3D.xml:384
msgid ""
"If [code]true[/code], the model's vertex colors are processed as sRGB mode."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:373
+#: doc/classes/BaseMaterial3D.xml:387
msgid "If [code]true[/code], the vertex color is used as albedo color."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:378
+#: doc/classes/BaseMaterial3D.xml:392
msgid "Texture specifying per-pixel color."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:381
+#: doc/classes/BaseMaterial3D.xml:395
msgid "Texture specifying per-pixel metallic value."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:384
+#: doc/classes/BaseMaterial3D.xml:398
msgid "Texture specifying per-pixel roughness value."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:387
+#: doc/classes/BaseMaterial3D.xml:401
msgid "Texture specifying per-pixel emission color."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:390
+#: doc/classes/BaseMaterial3D.xml:404
msgid "Texture specifying per-pixel normal vector."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:393
+#: doc/classes/BaseMaterial3D.xml:407
msgid "Texture specifying per-pixel rim value."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:396
+#: doc/classes/BaseMaterial3D.xml:410
msgid "Texture specifying per-pixel clearcoat value."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:399
+#: doc/classes/BaseMaterial3D.xml:413
msgid ""
"Texture specifying per-pixel flowmap direction for use with [member "
"anisotropy]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:402
+#: doc/classes/BaseMaterial3D.xml:416
msgid "Texture specifying per-pixel ambient occlusion value."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:405
+#: doc/classes/BaseMaterial3D.xml:419
msgid "Texture specifying per-pixel height."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:408
+#: doc/classes/BaseMaterial3D.xml:422
msgid "Texture specifying per-pixel subsurface scattering."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:411
-msgid "Texture specifying per-pixel transmission color."
+#: doc/classes/BaseMaterial3D.xml:425
+msgid "Texture specifying per-pixel transmittance for subsurface scattering."
+msgstr ""
+
+#: doc/classes/BaseMaterial3D.xml:428
+msgid "Texture specifying per-pixel backlight color."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:414
+#: doc/classes/BaseMaterial3D.xml:431
msgid "Texture specifying per-pixel refraction strength."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:417
+#: doc/classes/BaseMaterial3D.xml:434
msgid "Texture specifying per-pixel detail mask blending value."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:420
+#: doc/classes/BaseMaterial3D.xml:437
msgid "Texture specifying per-pixel detail color."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:423
+#: doc/classes/BaseMaterial3D.xml:440
msgid "Texture specifying per-pixel detail normal."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:428
+#: doc/classes/BaseMaterial3D.xml:443
+msgid "Texture holding ambient occlusion, roughness, and metallic."
+msgstr ""
+
+#: doc/classes/BaseMaterial3D.xml:446
msgid "Represents the size of the [enum TextureParam] enum."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:431
+#: doc/classes/BaseMaterial3D.xml:449 doc/classes/RenderingServer.xml:3774
+#: doc/classes/Viewport.xml:390
msgid ""
"The texture filter reads from the nearest pixel only. The simplest and "
"fastest method of filtering, but the texture will look pixelized."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:434 doc/classes/CanvasItem.xml:665
+#: doc/classes/BaseMaterial3D.xml:452 doc/classes/RenderingServer.xml:3777
+#: doc/classes/Viewport.xml:393
msgid ""
-"The texture filter blends between the nearest four pixels. Use this for most "
-"cases where you want to avoid a pixelated style."
+"The texture filter blends between the nearest 4 pixels. Use this when you "
+"want to avoid a pixelated style, but do not want mipmaps."
+msgstr ""
+
+#: doc/classes/BaseMaterial3D.xml:455 doc/classes/RenderingServer.xml:3780
+#: doc/classes/Viewport.xml:396
+msgid ""
+"The texture filter reads from the nearest pixel in the nearest mipmap. The "
+"fastest way to read from textures with mipmaps."
+msgstr ""
+
+#: doc/classes/BaseMaterial3D.xml:458
+msgid ""
+"The texture filter blends between the nearest 4 pixels and between the "
+"nearest 2 mipmaps. Use this for most cases as mipmaps are important to "
+"smooth out pixels that are far from the camera."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:445 doc/classes/CanvasItem.xml:676
+#: doc/classes/BaseMaterial3D.xml:461 doc/classes/RenderingServer.xml:3786
+msgid ""
+"The texture filter reads from the nearest pixel, but selects a mipmap based "
+"on the angle between the surface and the camera view. This reduces artifacts "
+"on surfaces that are almost in line with the camera."
+msgstr ""
+
+#: doc/classes/BaseMaterial3D.xml:464 doc/classes/RenderingServer.xml:3789
+msgid ""
+"The texture filter blends between the nearest 4 pixels and selects a mipmap "
+"based on the angle between the surface and the camera view. This reduces "
+"artifacts on surfaces that are almost in line with the camera. This is the "
+"slowest of the filtering options, but results in the highest quality "
+"texturing."
+msgstr ""
+
+#: doc/classes/BaseMaterial3D.xml:467 doc/classes/CanvasItem.xml:677
msgid "Represents the size of the [enum TextureFilter] enum."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:448
+#: doc/classes/BaseMaterial3D.xml:470
msgid "Use [code]UV[/code] with the detail texture."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:451
+#: doc/classes/BaseMaterial3D.xml:473
msgid "Use [code]UV2[/code] with the detail texture."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:454
+#: doc/classes/BaseMaterial3D.xml:476
msgid "The material will not use transparency."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:457
+#: doc/classes/BaseMaterial3D.xml:479
msgid "The material will use the texture's alpha values for transparency."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:464
+#: doc/classes/BaseMaterial3D.xml:482
+msgid ""
+"The material will cut off all values below a threshold, the rest will remain "
+"opaque."
+msgstr ""
+
+#: doc/classes/BaseMaterial3D.xml:485
+msgid ""
+"The material will use the texture's alpha value for transparency, but will "
+"still be rendered in the pre-pass."
+msgstr ""
+
+#: doc/classes/BaseMaterial3D.xml:488
msgid "Represents the size of the [enum Transparency] enum."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:467
+#: doc/classes/BaseMaterial3D.xml:491
msgid "The object will not receive shadows."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:470
+#: doc/classes/BaseMaterial3D.xml:494
msgid ""
"The object will be shaded per pixel. Useful for realistic shading effect."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:473
+#: doc/classes/BaseMaterial3D.xml:497
msgid ""
"The object will be shaded per vertex. Useful when you want cheaper shaders "
"and do not care about visual quality."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:476
+#: doc/classes/BaseMaterial3D.xml:500
msgid "Represents the size of the [enum ShadingMode] enum."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:479
+#: doc/classes/BaseMaterial3D.xml:503
msgid "Constant for setting [member emission_enabled]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:482
+#: doc/classes/BaseMaterial3D.xml:506
msgid "Constant for setting [member normal_enabled]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:485
+#: doc/classes/BaseMaterial3D.xml:509
msgid "Constant for setting [member rim_enabled]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:488
+#: doc/classes/BaseMaterial3D.xml:512
msgid "Constant for setting [member clearcoat_enabled]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:491
+#: doc/classes/BaseMaterial3D.xml:515
msgid "Constant for setting [member anisotropy_enabled]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:494
+#: doc/classes/BaseMaterial3D.xml:518
msgid "Constant for setting [member ao_enabled]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:499
+#: doc/classes/BaseMaterial3D.xml:521
+msgid "Constant for setting [member heightmap_enabled]."
+msgstr ""
+
+#: doc/classes/BaseMaterial3D.xml:524
msgid "Constant for setting [member subsurf_scatter_enabled]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:502
-msgid "Constant for setting [member transmission_enabled]."
+#: doc/classes/BaseMaterial3D.xml:527
+msgid "Constant for setting [member subsurf_scatter_transmittance_enabled]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:505
+#: doc/classes/BaseMaterial3D.xml:530
+msgid "Constant for setting [member backlight_enabled]."
+msgstr ""
+
+#: doc/classes/BaseMaterial3D.xml:533
msgid "Constant for setting [member refraction_enabled]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:508
+#: doc/classes/BaseMaterial3D.xml:536
msgid "Constant for setting [member detail_enabled]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:511 doc/classes/EditorFeatureProfile.xml:148
+#: doc/classes/BaseMaterial3D.xml:539 doc/classes/EditorFeatureProfile.xml:148
msgid "Represents the size of the [enum Feature] enum."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:514
+#: doc/classes/BaseMaterial3D.xml:542
msgid ""
"Default blend mode. The color of the object is blended over the background "
"based on the object's alpha value."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:517
+#: doc/classes/BaseMaterial3D.xml:545
msgid "The color of the object is added to the background."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:520
+#: doc/classes/BaseMaterial3D.xml:548
msgid "The color of the object is subtracted from the background."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:523
+#: doc/classes/BaseMaterial3D.xml:551
msgid "The color of the object is multiplied by the background."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:526
+#: doc/classes/BaseMaterial3D.xml:554
msgid "Default depth draw mode. Depth is drawn only for opaque objects."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:529
+#: doc/classes/BaseMaterial3D.xml:557
msgid "Depth draw is calculated for both opaque and transparent objects."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:532
+#: doc/classes/BaseMaterial3D.xml:560
msgid "No depth draw."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:535
+#: doc/classes/BaseMaterial3D.xml:563
msgid "Default cull mode. The back of the object is culled when not visible."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:538
+#: doc/classes/BaseMaterial3D.xml:566
msgid "The front of the object is culled when not visible."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:541
+#: doc/classes/BaseMaterial3D.xml:569
msgid "No culling is performed."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:544
+#: doc/classes/BaseMaterial3D.xml:572
msgid ""
"Disables the depth test, so this object is drawn on top of all others. "
"However, objects drawn after it in the draw order may cover it."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:547
+#: doc/classes/BaseMaterial3D.xml:575
msgid "Set [code]ALBEDO[/code] to the per-vertex color specified in the mesh."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:550
+#: doc/classes/BaseMaterial3D.xml:578
msgid ""
"Vertex color is in sRGB space and needs to be converted to linear. Only "
"applies in the Vulkan renderer."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:553
+#: doc/classes/BaseMaterial3D.xml:581
msgid ""
"Uses point size to alter the size of primitive points. Also changes the "
"albedo texture lookup to use [code]POINT_COORD[/code] instead of [code]UV[/"
"code]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:556
+#: doc/classes/BaseMaterial3D.xml:584
msgid ""
"Object is scaled by depth so that it always appears the same size on screen."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:559
+#: doc/classes/BaseMaterial3D.xml:587
msgid ""
"Shader will keep the scale set for the mesh. Otherwise the scale is lost "
"when billboarding. Only applies when [member billboard_mode] is [constant "
"BILLBOARD_ENABLED]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:562 doc/classes/BaseMaterial3D.xml:568
+#: doc/classes/BaseMaterial3D.xml:590 doc/classes/BaseMaterial3D.xml:596
msgid ""
"Use triplanar texture lookup for all texture lookups that would normally use "
"[code]UV[/code]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:565 doc/classes/BaseMaterial3D.xml:571
+#: doc/classes/BaseMaterial3D.xml:593 doc/classes/BaseMaterial3D.xml:599
msgid ""
"Use triplanar texture lookup for all texture lookups that would normally use "
"[code]UV2[/code]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:574
+#: doc/classes/BaseMaterial3D.xml:602
msgid ""
"Use [code]UV2[/code] coordinates to look up from the [member ao_texture]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:577
+#: doc/classes/BaseMaterial3D.xml:605
msgid ""
"Use [code]UV2[/code] coordinates to look up from the [member "
"emission_texture]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:580
+#: doc/classes/BaseMaterial3D.xml:608
msgid "Forces the shader to convert albedo from sRGB space to linear space."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:583
+#: doc/classes/BaseMaterial3D.xml:611
msgid "Disables receiving shadows from other objects."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:586
+#: doc/classes/BaseMaterial3D.xml:614
msgid "Disables receiving ambient light."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:589
+#: doc/classes/BaseMaterial3D.xml:617
msgid "Enables the shadow to opacity feature."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:594
+#: doc/classes/BaseMaterial3D.xml:620 doc/classes/RenderingServer.xml:3801
+#: doc/classes/Viewport.xml:408
+msgid ""
+"Enables the texture to repeat when UV coordinates are outside the 0-1 range. "
+"If using one of the linear filtering modes, this can result in artifacts at "
+"the edges of a texture when the sampler filters across the edges of the "
+"texture."
+msgstr ""
+
+#: doc/classes/BaseMaterial3D.xml:623
msgid ""
"Invert values read from a depth texture to convert them to height values "
"(heightmap)."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:599 doc/classes/CPUParticles2D.xml:355
-#: doc/classes/CPUParticles3D.xml:364 doc/classes/GeometryInstance3D.xml:100
+#: doc/classes/BaseMaterial3D.xml:626
+msgid ""
+"Enables the skin mode for subsurface scattering which is used to improve the "
+"look of subsurface scattering when used for human skin."
+msgstr ""
+
+#: doc/classes/BaseMaterial3D.xml:629 doc/classes/CPUParticles2D.xml:355
+#: doc/classes/CPUParticles3D.xml:364 doc/classes/GeometryInstance3D.xml:118
#: doc/classes/ParticlesMaterial.xml:315
msgid "Represents the size of the [enum Flags] enum."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:602
+#: doc/classes/BaseMaterial3D.xml:632
msgid "Default diffuse scattering algorithm."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:605
+#: doc/classes/BaseMaterial3D.xml:635
msgid "Diffuse scattering ignores roughness."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:608
+#: doc/classes/BaseMaterial3D.xml:638
msgid "Extends Lambert to cover more than 90 degrees when roughness increases."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:611
+#: doc/classes/BaseMaterial3D.xml:641
msgid "Attempts to use roughness to emulate microsurfacing."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:614
+#: doc/classes/BaseMaterial3D.xml:644
msgid "Uses a hard cut for lighting, with smoothing affected by roughness."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:617
+#: doc/classes/BaseMaterial3D.xml:647
msgid "Default specular blob."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:620 doc/classes/BaseMaterial3D.xml:623
+#: doc/classes/BaseMaterial3D.xml:650 doc/classes/BaseMaterial3D.xml:653
msgid "Older specular algorithm, included for compatibility."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:626
+#: doc/classes/BaseMaterial3D.xml:656
msgid "Toon blob which changes size based on roughness."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:629
+#: doc/classes/BaseMaterial3D.xml:659
msgid "No specular blob."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:632
+#: doc/classes/BaseMaterial3D.xml:662
msgid "Billboard mode is disabled."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:635
+#: doc/classes/BaseMaterial3D.xml:665
msgid "The object's Z axis will always face the camera."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:638
+#: doc/classes/BaseMaterial3D.xml:668
msgid "The object's X axis will always face the camera."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:641
+#: doc/classes/BaseMaterial3D.xml:671
msgid ""
"Used for particle systems when assigned to [GPUParticles3D] and "
"[CPUParticles3D] nodes. Enables [code]particles_anim_*[/code] properties.\n"
@@ -9810,45 +9280,45 @@ msgid ""
"anim_speed] should also be set to a positive value for the animation to play."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:645
+#: doc/classes/BaseMaterial3D.xml:675
msgid "Used to read from the red channel of a texture."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:648
+#: doc/classes/BaseMaterial3D.xml:678
msgid "Used to read from the green channel of a texture."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:651
+#: doc/classes/BaseMaterial3D.xml:681
msgid "Used to read from the blue channel of a texture."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:654
+#: doc/classes/BaseMaterial3D.xml:684
msgid "Used to read from the alpha channel of a texture."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:657
+#: doc/classes/BaseMaterial3D.xml:687
msgid "Currently unused."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:660
+#: doc/classes/BaseMaterial3D.xml:690
msgid "Adds the emission color to the color from the emission texture."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:663
+#: doc/classes/BaseMaterial3D.xml:693
msgid "Multiplies the emission color by the color from the emission texture."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:666
+#: doc/classes/BaseMaterial3D.xml:696
msgid "Do not use distance fade."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:669
+#: doc/classes/BaseMaterial3D.xml:699
msgid ""
"Smoothly fades the object out based on each pixel's distance from the camera "
"using the alpha channel."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:672
+#: doc/classes/BaseMaterial3D.xml:702
msgid ""
"Smoothly fades the object out based on each pixel's distance from the camera "
"using a dither approach. Dithering discards pixels based on a set pattern to "
@@ -9856,7 +9326,7 @@ msgid ""
"faster than [constant DISTANCE_FADE_PIXEL_ALPHA]."
msgstr ""
-#: doc/classes/BaseMaterial3D.xml:675
+#: doc/classes/BaseMaterial3D.xml:705
msgid ""
"Smoothly fades the object out based on the object's distance from the camera "
"using a dither approach. Dithering discards pixels based on a set pattern to "
@@ -10530,176 +10000,181 @@ msgid ""
"scenes than manually changing the position of [CanvasItem]-based nodes.\n"
"This node is intended to be a simple helper to get things going quickly and "
"it may happen that more functionality is desired to change how the camera "
-"works. To make your own custom camera node, simply inherit from [Node2D] and "
-"change the transform of the canvas by calling get_viewport()."
-"set_canvas_transform(m) in [Viewport]."
+"works. To make your own custom camera node, inherit from [Node2D] and change "
+"the transform of the canvas by setting [member Viewport.canvas_transform] in "
+"[Viewport] (you can obtain the current [Viewport] by using [method Node."
+"get_viewport]).\n"
+"Note that the [Camera2D] node's [code]position[/code] doesn't represent the "
+"actual position of the screen, which may differ due to applied smoothing or "
+"limits. You can use [method get_camera_screen_center] to get the real "
+"position."
msgstr ""
-#: doc/classes/Camera2D.xml:17
+#: doc/classes/Camera2D.xml:18
msgid "Aligns the camera to the tracked node."
msgstr ""
-#: doc/classes/Camera2D.xml:24
+#: doc/classes/Camera2D.xml:25
msgid ""
"Removes any [Camera2D] from the ancestor [Viewport]'s internal currently-"
"assigned camera."
msgstr ""
-#: doc/classes/Camera2D.xml:31
+#: doc/classes/Camera2D.xml:32
msgid "Forces the camera to update scroll immediately."
msgstr ""
-#: doc/classes/Camera2D.xml:38
+#: doc/classes/Camera2D.xml:39
msgid "Returns the camera position."
msgstr ""
-#: doc/classes/Camera2D.xml:45
+#: doc/classes/Camera2D.xml:46
msgid ""
"Returns the location of the [Camera2D]'s screen-center, relative to the "
"origin."
msgstr ""
-#: doc/classes/Camera2D.xml:54
+#: doc/classes/Camera2D.xml:55
msgid ""
"Returns the specified margin. See also [member drag_margin_bottom], [member "
"drag_margin_top], [member drag_margin_left], and [member drag_margin_right]."
msgstr ""
-#: doc/classes/Camera2D.xml:63
+#: doc/classes/Camera2D.xml:64
msgid ""
"Returns the specified camera limit. See also [member limit_bottom], [member "
"limit_top], [member limit_left], and [member limit_right]."
msgstr ""
-#: doc/classes/Camera2D.xml:70
+#: doc/classes/Camera2D.xml:71
msgid ""
"Make this the current 2D camera for the scene (viewport and layer), in case "
"there are many cameras in the scene."
msgstr ""
-#: doc/classes/Camera2D.xml:77
+#: doc/classes/Camera2D.xml:78
msgid ""
"Sets the camera's position immediately to its current smoothing "
"destination.\n"
"This has no effect if smoothing is disabled."
msgstr ""
-#: doc/classes/Camera2D.xml:89
+#: doc/classes/Camera2D.xml:90
msgid ""
"Sets the specified margin. See also [member drag_margin_bottom], [member "
"drag_margin_top], [member drag_margin_left], and [member drag_margin_right]."
msgstr ""
-#: doc/classes/Camera2D.xml:100
+#: doc/classes/Camera2D.xml:101
msgid ""
"Sets the specified camera limit. See also [member limit_bottom], [member "
"limit_top], [member limit_left], and [member limit_right]."
msgstr ""
-#: doc/classes/Camera2D.xml:106
+#: doc/classes/Camera2D.xml:107
msgid "The Camera2D's anchor point. See [enum AnchorMode] constants."
msgstr ""
-#: doc/classes/Camera2D.xml:109
+#: doc/classes/Camera2D.xml:110
msgid ""
"If [code]true[/code], the camera is the active camera for the current scene. "
"Only one camera can be current, so setting a different camera [code]current[/"
"code] will disable this one."
msgstr ""
-#: doc/classes/Camera2D.xml:112
+#: doc/classes/Camera2D.xml:113
msgid ""
"The custom [Viewport] node attached to the [Camera2D]. If [code]null[/code] "
"or not a [Viewport], uses the default viewport instead."
msgstr ""
-#: doc/classes/Camera2D.xml:115
+#: doc/classes/Camera2D.xml:116
msgid ""
"Bottom margin needed to drag the camera. A value of [code]1[/code] makes the "
"camera move only when reaching the edge of the screen."
msgstr ""
-#: doc/classes/Camera2D.xml:118
+#: doc/classes/Camera2D.xml:119
msgid ""
"If [code]true[/code], the camera only moves when reaching the horizontal "
"drag margins. If [code]false[/code], the camera moves horizontally "
"regardless of margins."
msgstr ""
-#: doc/classes/Camera2D.xml:121
+#: doc/classes/Camera2D.xml:122
msgid ""
"Left margin needed to drag the camera. A value of [code]1[/code] makes the "
"camera move only when reaching the edge of the screen."
msgstr ""
-#: doc/classes/Camera2D.xml:124
+#: doc/classes/Camera2D.xml:125
msgid ""
"Right margin needed to drag the camera. A value of [code]1[/code] makes the "
"camera move only when reaching the edge of the screen."
msgstr ""
-#: doc/classes/Camera2D.xml:127
+#: doc/classes/Camera2D.xml:128
msgid ""
"Top margin needed to drag the camera. A value of [code]1[/code] makes the "
"camera move only when reaching the edge of the screen."
msgstr ""
-#: doc/classes/Camera2D.xml:130
+#: doc/classes/Camera2D.xml:131
msgid ""
"If [code]true[/code], the camera only moves when reaching the vertical drag "
"margins. If [code]false[/code], the camera moves vertically regardless of "
"margins."
msgstr ""
-#: doc/classes/Camera2D.xml:133
+#: doc/classes/Camera2D.xml:134
msgid ""
"If [code]true[/code], draws the camera's drag margin rectangle in the editor."
msgstr ""
-#: doc/classes/Camera2D.xml:136
+#: doc/classes/Camera2D.xml:137
msgid ""
"If [code]true[/code], draws the camera's limits rectangle in the editor."
msgstr ""
-#: doc/classes/Camera2D.xml:139
+#: doc/classes/Camera2D.xml:140
msgid ""
"If [code]true[/code], draws the camera's screen rectangle in the editor."
msgstr ""
-#: doc/classes/Camera2D.xml:142
+#: doc/classes/Camera2D.xml:143
msgid ""
"Bottom scroll limit in pixels. The camera stops moving when reaching this "
"value."
msgstr ""
-#: doc/classes/Camera2D.xml:145
+#: doc/classes/Camera2D.xml:146
msgid ""
"Left scroll limit in pixels. The camera stops moving when reaching this "
"value."
msgstr ""
-#: doc/classes/Camera2D.xml:148
+#: doc/classes/Camera2D.xml:149
msgid ""
"Right scroll limit in pixels. The camera stops moving when reaching this "
"value."
msgstr ""
-#: doc/classes/Camera2D.xml:151
+#: doc/classes/Camera2D.xml:152
msgid ""
"If [code]true[/code], the camera smoothly stops when reaches its limits."
msgstr ""
-#: doc/classes/Camera2D.xml:154
+#: doc/classes/Camera2D.xml:155
msgid ""
"Top scroll limit in pixels. The camera stops moving when reaching this value."
msgstr ""
-#: doc/classes/Camera2D.xml:157
+#: doc/classes/Camera2D.xml:158
msgid ""
"The camera's offset, useful for looking around or camera shake animations."
msgstr ""
-#: doc/classes/Camera2D.xml:160
+#: doc/classes/Camera2D.xml:161
msgid ""
"The horizontal offset of the camera, relative to the drag margins.\n"
"[b]Note:[/b] Offset H is used only to force offset relative to margins. It's "
@@ -10707,33 +10182,33 @@ msgid ""
"initial offset."
msgstr ""
-#: doc/classes/Camera2D.xml:164
+#: doc/classes/Camera2D.xml:165
msgid ""
"The vertical offset of the camera, relative to the drag margins.\n"
"[b]Note:[/b] Used the same as [member offset_h]."
msgstr ""
-#: doc/classes/Camera2D.xml:168
+#: doc/classes/Camera2D.xml:169
msgid "The camera's process callback. See [enum Camera2DProcessMode]."
msgstr ""
-#: doc/classes/Camera2D.xml:171
+#: doc/classes/Camera2D.xml:172
msgid "If [code]true[/code], the camera rotates with the target."
msgstr ""
-#: doc/classes/Camera2D.xml:174
+#: doc/classes/Camera2D.xml:175
msgid ""
"If [code]true[/code], the camera smoothly moves towards the target at "
"[member smoothing_speed]."
msgstr ""
-#: doc/classes/Camera2D.xml:177
+#: doc/classes/Camera2D.xml:178
msgid ""
"Speed in pixels per second of the camera's smoothing effect when [member "
"smoothing_enabled] is [code]true[/code]."
msgstr ""
-#: doc/classes/Camera2D.xml:180
+#: doc/classes/Camera2D.xml:181
msgid ""
"The camera's zoom relative to the viewport. Values larger than "
"[code]Vector2(1, 1)[/code] zoom out and smaller values zoom in. For an "
@@ -10741,23 +10216,23 @@ msgid ""
"[code]Vector2(4, 4)[/code] for a 4× zoom-out."
msgstr ""
-#: doc/classes/Camera2D.xml:185
+#: doc/classes/Camera2D.xml:186
msgid ""
"The camera's position is fixed so that the top-left corner is always at the "
"origin."
msgstr ""
-#: doc/classes/Camera2D.xml:188
+#: doc/classes/Camera2D.xml:189
msgid ""
"The camera's position takes into account vertical/horizontal offsets and the "
"screen size."
msgstr ""
-#: doc/classes/Camera2D.xml:191 doc/classes/ClippedCamera3D.xml:104
+#: doc/classes/Camera2D.xml:192 doc/classes/ClippedCamera3D.xml:104
msgid "The camera updates with the [code]_physics_process[/code] callback."
msgstr ""
-#: doc/classes/Camera2D.xml:194 doc/classes/ClippedCamera3D.xml:107
+#: doc/classes/Camera2D.xml:195 doc/classes/ClippedCamera3D.xml:107
msgid "The camera updates with the [code]_process[/code] callback."
msgstr ""
@@ -11019,6 +10494,72 @@ msgid ""
"Audio's [code]pitch shift[/code])."
msgstr ""
+#: doc/classes/CameraEffects.xml:4
+msgid ""
+"Contains camera-specific effects such as depth of field and exposure "
+"override."
+msgstr ""
+
+#: doc/classes/CameraEffects.xml:7
+msgid ""
+"Contains camera-specific effects such as depth of field and exposure "
+"override.\n"
+"See also [Environment] for general 3D environment settings."
+msgstr ""
+
+#: doc/classes/CameraEffects.xml:16
+msgid ""
+"The amount of blur for both near and far depth-of-field effects. The amount "
+"of blur increases the radius of the blur effect, making the affected area "
+"blurrier. However, If the amount is too high, you might start to see lines "
+"appearing, especially when using a low quality blur."
+msgstr ""
+
+#: doc/classes/CameraEffects.xml:19
+msgid ""
+"The distance from the camera where the far blur effect affects the rendering."
+msgstr ""
+
+#: doc/classes/CameraEffects.xml:22
+msgid ""
+"If [code]true[/code], enables the depth-of-field far blur effect. This has a "
+"significant performance cost. Consider disabling it in scenes where there "
+"are no far away objects."
+msgstr ""
+
+#: doc/classes/CameraEffects.xml:25
+msgid "The length of the transition between the no-blur area and far blur."
+msgstr ""
+
+#: doc/classes/CameraEffects.xml:28
+msgid ""
+"Distance from the camera where the near blur effect affects the rendering."
+msgstr ""
+
+#: doc/classes/CameraEffects.xml:31
+msgid ""
+"If [code]true[/code], enables the depth-of-field near blur effect. This has "
+"a significant performance cost. Consider disabling it in scenes where there "
+"are no nearby objects."
+msgstr ""
+
+#: doc/classes/CameraEffects.xml:34
+msgid "The length of the transition between the near blur and no-blur area."
+msgstr ""
+
+#: doc/classes/CameraEffects.xml:37
+msgid ""
+"The exposure override value to use. Higher values will result in a brighter "
+"scene. Only effective if [member override_exposure_enable] is [code]true[/"
+"code]."
+msgstr ""
+
+#: doc/classes/CameraEffects.xml:40
+msgid ""
+"If [code]true[/code], overrides the manual or automatic exposure defined in "
+"the [Environment] with the value in [member override_exposure]."
+msgstr ""
+
#: doc/classes/CameraFeed.xml:4
msgid ""
"A camera feed gives you access to a single physical camera attached to your "
@@ -11029,7 +10570,7 @@ msgstr ""
msgid ""
"A camera feed gives you access to a single physical camera attached to your "
"device. When enabled, Godot will start capturing frames from the camera "
-"which can then be used.\n"
+"which can then be used. See also [CameraServer].\n"
"[b]Note:[/b] Many cameras will return YCbCr images which are split into two "
"textures and need to be combined in a shader. Godot does this automatically "
"for you if you set the environment to show the camera image in the "
@@ -11044,50 +10585,54 @@ msgstr ""
msgid ""
"The [CameraServer] keeps track of different cameras accessible in Godot. "
"These are external cameras such as webcams or the cameras on your phone.\n"
-"It is notably used to provide AR modules with a video feed from the camera."
+"It is notably used to provide AR modules with a video feed from the camera.\n"
+"[b]Note:[/b] This class is currently only implemented on macOS and iOS. On "
+"other platforms, no [CameraFeed]s will be available."
msgstr ""
-#: doc/classes/CameraServer.xml:19
-msgid "Adds a camera feed to the camera server."
+#: doc/classes/CameraServer.xml:20
+msgid "Adds the camera [code]feed[/code] to the camera server."
msgstr ""
-#: doc/classes/CameraServer.xml:26
+#: doc/classes/CameraServer.xml:27
msgid "Returns an array of [CameraFeed]s."
msgstr ""
-#: doc/classes/CameraServer.xml:35
-msgid "Returns the [CameraFeed] with this id."
+#: doc/classes/CameraServer.xml:36
+msgid ""
+"Returns the [CameraFeed] corresponding to the camera with the given "
+"[code]index[/code]."
msgstr ""
-#: doc/classes/CameraServer.xml:42
+#: doc/classes/CameraServer.xml:43
msgid "Returns the number of [CameraFeed]s registered."
msgstr ""
-#: doc/classes/CameraServer.xml:51
-msgid "Removes a [CameraFeed]."
+#: doc/classes/CameraServer.xml:52
+msgid "Removes the specified camera [code]feed[/code]."
msgstr ""
-#: doc/classes/CameraServer.xml:60
-msgid "Emitted when a [CameraFeed] is added (e.g. webcam is plugged in)."
+#: doc/classes/CameraServer.xml:61
+msgid "Emitted when a [CameraFeed] is added (e.g. a webcam is plugged in)."
msgstr ""
-#: doc/classes/CameraServer.xml:67
-msgid "Emitted when a [CameraFeed] is removed (e.g. webcam is unplugged)."
+#: doc/classes/CameraServer.xml:68
+msgid "Emitted when a [CameraFeed] is removed (e.g. a webcam is unplugged)."
msgstr ""
-#: doc/classes/CameraServer.xml:73
+#: doc/classes/CameraServer.xml:74
msgid "The RGBA camera image."
msgstr ""
-#: doc/classes/CameraServer.xml:76
-msgid "The YCbCr camera image."
+#: doc/classes/CameraServer.xml:77
+msgid "The [url=https://en.wikipedia.org/wiki/YCbCr]YCbCr[/url] camera image."
msgstr ""
-#: doc/classes/CameraServer.xml:79
+#: doc/classes/CameraServer.xml:80
msgid "The Y component camera image."
msgstr ""
-#: doc/classes/CameraServer.xml:82
+#: doc/classes/CameraServer.xml:83
msgid "The CbCr component camera image."
msgstr ""
@@ -11143,97 +10688,100 @@ msgid ""
"its children) and self modulation (only for itself), as well as its blend "
"mode.\n"
"Ultimately, a transform notification can be requested, which will notify the "
-"node that its global position changed in case the parent tree changed."
+"node that its global position changed in case the parent tree changed.\n"
+"[b]Note:[/b] Unless otherwise specified, all methods that have angle "
+"parameters must have angles specified as [i]radians[/i]. To convert degrees "
+"to radians, use [method @GDScript.deg2rad]."
msgstr ""
-#: doc/classes/CanvasItem.xml:14 doc/classes/CanvasLayer.xml:10
+#: doc/classes/CanvasItem.xml:15 doc/classes/CanvasLayer.xml:10
#: doc/classes/InputEvent.xml:11 doc/classes/Viewport.xml:15
msgid "https://docs.godotengine.org/en/latest/tutorials/2d/2d_transforms.html"
msgstr ""
-#: doc/classes/CanvasItem.xml:15 doc/classes/Control.xml:19
+#: doc/classes/CanvasItem.xml:16 doc/classes/Control.xml:19
#: doc/classes/Node2D.xml:10
msgid ""
"https://docs.godotengine.org/en/latest/tutorials/2d/custom_drawing_in_2d.html"
msgstr ""
-#: doc/classes/CanvasItem.xml:22
+#: doc/classes/CanvasItem.xml:23
msgid ""
"Overridable function called by the engine (if defined) to draw the canvas "
"item."
msgstr ""
-#: doc/classes/CanvasItem.xml:43
+#: doc/classes/CanvasItem.xml:44
msgid ""
"Draws an arc between the given angles. The larger the value of "
"[code]point_count[/code], the smoother the curve."
msgstr ""
-#: doc/classes/CanvasItem.xml:60
+#: doc/classes/CanvasItem.xml:61
msgid ""
"Draws a string character using a custom font. Returns the advance, depending "
"on the character width and kerning with an optional next character."
msgstr ""
-#: doc/classes/CanvasItem.xml:73
+#: doc/classes/CanvasItem.xml:74
msgid "Draws a colored circle."
msgstr ""
-#: doc/classes/CanvasItem.xml:98
+#: doc/classes/CanvasItem.xml:99
msgid "Draws a colored polygon of any amount of points, convex or concave."
msgstr ""
-#: doc/classes/CanvasItem.xml:113
+#: doc/classes/CanvasItem.xml:114
msgid "Draws a line from a 2D point to another, with a given color and width."
msgstr ""
-#: doc/classes/CanvasItem.xml:138
+#: doc/classes/CanvasItem.xml:139
msgid ""
"Draws a [Mesh] in 2D, using the provided texture. See [MeshInstance2D] for "
"related documentation."
msgstr ""
-#: doc/classes/CanvasItem.xml:151
+#: doc/classes/CanvasItem.xml:152
msgid "Draws multiple, parallel lines with a uniform [code]color[/code]."
msgstr ""
-#: doc/classes/CanvasItem.xml:164
+#: doc/classes/CanvasItem.xml:165
msgid ""
"Draws multiple, parallel lines with a uniform [code]width[/code] and segment-"
"by-segment coloring. Colors assigned to line segments match by index between "
"[code]points[/code] and [code]colors[/code]."
msgstr ""
-#: doc/classes/CanvasItem.xml:185
+#: doc/classes/CanvasItem.xml:186
msgid ""
"Draws a [MultiMesh] in 2D with the provided texture. See "
"[MultiMeshInstance2D] for related documentation."
msgstr ""
-#: doc/classes/CanvasItem.xml:210
+#: doc/classes/CanvasItem.xml:211
msgid "Draws a polygon of any amount of points, convex or concave."
msgstr ""
-#: doc/classes/CanvasItem.xml:223
+#: doc/classes/CanvasItem.xml:224
msgid ""
"Draws interconnected line segments with a uniform [code]color[/code] and "
"[code]width[/code]."
msgstr ""
-#: doc/classes/CanvasItem.xml:236
+#: doc/classes/CanvasItem.xml:237
msgid ""
"Draws interconnected line segments with a uniform [code]width[/code] and "
"segment-by-segment coloring. Colors assigned to line segments match by index "
"between [code]points[/code] and [code]colors[/code]."
msgstr ""
-#: doc/classes/CanvasItem.xml:263
+#: doc/classes/CanvasItem.xml:264
msgid ""
"Draws a custom primitive. 1 point for a point, 2 points for a line, 3 points "
"for a triangle, and 4 points for a quad."
msgstr ""
-#: doc/classes/CanvasItem.xml:278
+#: doc/classes/CanvasItem.xml:279
msgid ""
"Draws a rectangle. If [code]filled[/code] is [code]true[/code], the "
"rectangle will be filled with the [code]color[/code] specified. If "
@@ -11243,272 +10791,278 @@ msgid ""
"[code]false[/code]."
msgstr ""
-#: doc/classes/CanvasItem.xml:292
+#: doc/classes/CanvasItem.xml:293
msgid ""
"Sets a custom transform for drawing via components. Anything drawn "
"afterwards will be transformed by this."
msgstr ""
-#: doc/classes/CanvasItem.xml:301
+#: doc/classes/CanvasItem.xml:302
msgid ""
"Sets a custom transform for drawing via matrix. Anything drawn afterwards "
"will be transformed by this."
msgstr ""
-#: doc/classes/CanvasItem.xml:318
+#: doc/classes/CanvasItem.xml:319
msgid "Draws a string using a custom font."
msgstr ""
-#: doc/classes/CanvasItem.xml:329
+#: doc/classes/CanvasItem.xml:330
msgid "Draws a styled rectangle."
msgstr ""
-#: doc/classes/CanvasItem.xml:352
+#: doc/classes/CanvasItem.xml:353
msgid "Draws a texture at a given position."
msgstr ""
-#: doc/classes/CanvasItem.xml:379
+#: doc/classes/CanvasItem.xml:380
msgid ""
"Draws a textured rectangle at a given position, optionally modulated by a "
"color. If [code]transpose[/code] is [code]true[/code], the texture will have "
"its X and Y coordinates swapped."
msgstr ""
-#: doc/classes/CanvasItem.xml:408
+#: doc/classes/CanvasItem.xml:409
msgid ""
"Draws a textured rectangle region at a given position, optionally modulated "
"by a color. If [code]transpose[/code] is [code]true[/code], the texture will "
"have its X and Y coordinates swapped."
msgstr ""
-#: doc/classes/CanvasItem.xml:415 doc/classes/Node3D.xml:18
+#: doc/classes/CanvasItem.xml:416 doc/classes/Node3D.xml:19
msgid ""
"Forces the transform to update. Transform changes in physics are not instant "
"for performance reasons. Transforms are accumulated and then set. Use this "
"if you need an up-to-date transform when doing physics operations."
msgstr ""
-#: doc/classes/CanvasItem.xml:422
+#: doc/classes/CanvasItem.xml:423
msgid "Returns the [RID] of the [World2D] canvas where this item is in."
msgstr ""
-#: doc/classes/CanvasItem.xml:429
+#: doc/classes/CanvasItem.xml:430
msgid "Returns the canvas item RID used by [RenderingServer] for this item."
msgstr ""
-#: doc/classes/CanvasItem.xml:436
+#: doc/classes/CanvasItem.xml:437
msgid "Returns the transform matrix of this item's canvas."
msgstr ""
-#: doc/classes/CanvasItem.xml:443
+#: doc/classes/CanvasItem.xml:444
msgid "Returns the global position of the mouse."
msgstr ""
-#: doc/classes/CanvasItem.xml:450
+#: doc/classes/CanvasItem.xml:451
msgid "Returns the global transform matrix of this item."
msgstr ""
-#: doc/classes/CanvasItem.xml:457
+#: doc/classes/CanvasItem.xml:458
msgid ""
"Returns the global transform matrix of this item in relation to the canvas."
msgstr ""
-#: doc/classes/CanvasItem.xml:464
+#: doc/classes/CanvasItem.xml:465
msgid "Returns the mouse position relative to this item's position."
msgstr ""
-#: doc/classes/CanvasItem.xml:471
+#: doc/classes/CanvasItem.xml:472
msgid "Returns the transform matrix of this item."
msgstr ""
-#: doc/classes/CanvasItem.xml:478
+#: doc/classes/CanvasItem.xml:479
msgid "Returns the viewport's boundaries as a [Rect2]."
msgstr ""
-#: doc/classes/CanvasItem.xml:485
+#: doc/classes/CanvasItem.xml:486
msgid "Returns this item's transform in relation to the viewport."
msgstr ""
-#: doc/classes/CanvasItem.xml:492
+#: doc/classes/CanvasItem.xml:493
msgid "Returns the [World2D] where this item is in."
msgstr ""
-#: doc/classes/CanvasItem.xml:499
+#: doc/classes/CanvasItem.xml:500
msgid "Hide the [CanvasItem] if it's currently visible."
msgstr ""
-#: doc/classes/CanvasItem.xml:506
+#: doc/classes/CanvasItem.xml:507
msgid ""
"Returns [code]true[/code] if local transform notifications are communicated "
"to children."
msgstr ""
-#: doc/classes/CanvasItem.xml:513
+#: doc/classes/CanvasItem.xml:514
msgid ""
"Returns [code]true[/code] if the node is set as top-level. See [method "
"set_as_toplevel]."
msgstr ""
-#: doc/classes/CanvasItem.xml:520
+#: doc/classes/CanvasItem.xml:521
msgid ""
"Returns [code]true[/code] if global transform notifications are communicated "
"to children."
msgstr ""
-#: doc/classes/CanvasItem.xml:527
+#: doc/classes/CanvasItem.xml:528
msgid ""
"Returns [code]true[/code] if the node is present in the [SceneTree], its "
"[member visible] property is [code]true[/code] and its inherited visibility "
"is also [code]true[/code]."
msgstr ""
-#: doc/classes/CanvasItem.xml:536
+#: doc/classes/CanvasItem.xml:537
msgid "Assigns [code]screen_point[/code] as this node's new local transform."
msgstr ""
-#: doc/classes/CanvasItem.xml:545
+#: doc/classes/CanvasItem.xml:546
msgid ""
"Transformations issued by [code]event[/code]'s inputs are applied in local "
"space instead of global space."
msgstr ""
-#: doc/classes/CanvasItem.xml:554
+#: doc/classes/CanvasItem.xml:555
msgid ""
"If [code]enable[/code] is [code]true[/code], the node won't inherit its "
"transform from parent canvas items."
msgstr ""
-#: doc/classes/CanvasItem.xml:563
+#: doc/classes/CanvasItem.xml:564
msgid ""
"If [code]enable[/code] is [code]true[/code], children will be updated with "
"local transform data."
msgstr ""
-#: doc/classes/CanvasItem.xml:572
+#: doc/classes/CanvasItem.xml:573
msgid ""
"If [code]enable[/code] is [code]true[/code], children will be updated with "
"global transform data."
msgstr ""
-#: doc/classes/CanvasItem.xml:579
+#: doc/classes/CanvasItem.xml:580
msgid ""
"Show the [CanvasItem] if it's currently hidden. For controls that inherit "
"[Popup], the correct way to make them visible is to call one of the multiple "
"[code]popup*()[/code] functions instead."
msgstr ""
-#: doc/classes/CanvasItem.xml:586
+#: doc/classes/CanvasItem.xml:587
msgid ""
"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be "
"called on idle time to request redraw."
msgstr ""
-#: doc/classes/CanvasItem.xml:592
+#: doc/classes/CanvasItem.xml:593
msgid ""
"The rendering layers in which this [CanvasItem] responds to [Light2D] nodes."
msgstr ""
-#: doc/classes/CanvasItem.xml:595
+#: doc/classes/CanvasItem.xml:596
msgid "The material applied to textures on this [CanvasItem]."
msgstr ""
-#: doc/classes/CanvasItem.xml:598
+#: doc/classes/CanvasItem.xml:599
msgid "The color applied to textures on this [CanvasItem]."
msgstr ""
-#: doc/classes/CanvasItem.xml:601
+#: doc/classes/CanvasItem.xml:602
msgid ""
"The color applied to textures on this [CanvasItem]. This is not inherited by "
"children [CanvasItem]s."
msgstr ""
-#: doc/classes/CanvasItem.xml:604
+#: doc/classes/CanvasItem.xml:605
msgid "If [code]true[/code], the object draws behind its parent."
msgstr ""
-#: doc/classes/CanvasItem.xml:607
+#: doc/classes/CanvasItem.xml:608
msgid "If [code]true[/code], the object draws on top of its parent."
msgstr ""
-#: doc/classes/CanvasItem.xml:614
+#: doc/classes/CanvasItem.xml:615
msgid ""
"If [code]true[/code], the parent [CanvasItem]'s [member material] property "
"is used as this one's material."
msgstr ""
-#: doc/classes/CanvasItem.xml:617
+#: doc/classes/CanvasItem.xml:618
msgid ""
"If [code]true[/code], this [CanvasItem] is drawn. For controls that inherit "
"[Popup], the correct way to make them visible is to call one of the multiple "
"[code]popup*()[/code] functions instead."
msgstr ""
-#: doc/classes/CanvasItem.xml:623
+#: doc/classes/CanvasItem.xml:624
msgid ""
"Emitted when the [CanvasItem] must redraw. This can only be connected "
"realtime, as deferred will not allow drawing."
msgstr ""
-#: doc/classes/CanvasItem.xml:628
+#: doc/classes/CanvasItem.xml:629
msgid "Emitted when becoming hidden."
msgstr ""
-#: doc/classes/CanvasItem.xml:633
+#: doc/classes/CanvasItem.xml:634
msgid "Emitted when the item rect has changed."
msgstr ""
-#: doc/classes/CanvasItem.xml:638
+#: doc/classes/CanvasItem.xml:639
msgid "Emitted when the visibility (hidden/visible) changes."
msgstr ""
-#: doc/classes/CanvasItem.xml:644
+#: doc/classes/CanvasItem.xml:645
msgid ""
"The [CanvasItem]'s transform has changed. This notification is only received "
"if enabled by [method set_notify_transform] or [method "
"set_notify_local_transform]."
msgstr ""
-#: doc/classes/CanvasItem.xml:647
+#: doc/classes/CanvasItem.xml:648
msgid "The [CanvasItem] is requested to draw."
msgstr ""
-#: doc/classes/CanvasItem.xml:650
+#: doc/classes/CanvasItem.xml:651
msgid "The [CanvasItem]'s visibility has changed."
msgstr ""
-#: doc/classes/CanvasItem.xml:653
+#: doc/classes/CanvasItem.xml:654
msgid "The [CanvasItem] has entered the canvas."
msgstr ""
-#: doc/classes/CanvasItem.xml:656
+#: doc/classes/CanvasItem.xml:657
msgid "The [CanvasItem] has exited the canvas."
msgstr ""
-#: doc/classes/CanvasItem.xml:659 doc/classes/CanvasItem.xml:679
+#: doc/classes/CanvasItem.xml:660 doc/classes/CanvasItem.xml:680
msgid "The [CanvasItem] will inherit the filter from its parent."
msgstr ""
-#: doc/classes/CanvasItem.xml:662
+#: doc/classes/CanvasItem.xml:663
msgid ""
"The texture filter reads from the nearest pixel only. The simplest and "
"fastest method of filtering. Useful for pixel art."
msgstr ""
-#: doc/classes/CanvasItem.xml:682
+#: doc/classes/CanvasItem.xml:666
+msgid ""
+"The texture filter blends between the nearest four pixels. Use this for most "
+"cases where you want to avoid a pixelated style."
+msgstr ""
+
+#: doc/classes/CanvasItem.xml:683
msgid "Texture will not repeat."
msgstr ""
-#: doc/classes/CanvasItem.xml:685
+#: doc/classes/CanvasItem.xml:686
msgid "Texture will repeat normally."
msgstr ""
-#: doc/classes/CanvasItem.xml:688
+#: doc/classes/CanvasItem.xml:689
msgid ""
"Texture will repeat in a 2x2 tiled mode, where elements at even positions "
"are mirrored."
msgstr ""
-#: doc/classes/CanvasItem.xml:691
+#: doc/classes/CanvasItem.xml:692
msgid "Represents the size of the [enum TextureRepeat] enum."
msgstr ""
@@ -12696,25 +12250,24 @@ msgid ""
"component."
msgstr ""
-#: doc/classes/Color.xml:158
+#: doc/classes/Color.xml:160
msgid ""
-"Returns a new color resulting from making this color lighter by the "
-"specified percentage (ratio from 0 to 1).\n"
+"Returns the linear interpolation with another color. The interpolation "
+"factor [code]t[/code] is between 0 and 1.\n"
"[codeblock]\n"
-"var green = Color(0.0, 1.0, 0.0)\n"
-"var lightgreen = green.lightened(0.2) # 20% lighter than regular green\n"
+"var c1 = Color(1.0, 0.0, 0.0)\n"
+"var c2 = Color(0.0, 1.0, 0.0)\n"
+"var li_c = c1.lerp(c2, 0.5) # A color of an RGBA(128, 128, 0, 255)\n"
"[/codeblock]"
msgstr ""
-#: doc/classes/Color.xml:173
+#: doc/classes/Color.xml:174
msgid ""
-"Returns the linear interpolation with another color. The interpolation "
-"factor [code]t[/code] is between 0 and 1.\n"
+"Returns a new color resulting from making this color lighter by the "
+"specified percentage (ratio from 0 to 1).\n"
"[codeblock]\n"
-"var c1 = Color(1.0, 0.0, 0.0)\n"
-"var c2 = Color(0.0, 1.0, 0.0)\n"
-"var li_c = c1.linear_interpolate(c2, 0.5) # A color of an RGBA(128, 128, 0, "
-"255)\n"
+"var green = Color(0.0, 1.0, 0.0)\n"
+"var lightgreen = green.lightened(0.2) # 20% lighter than regular green\n"
"[/codeblock]"
msgstr ""
@@ -13736,7 +13289,7 @@ msgid ""
msgstr ""
#: doc/classes/ConeTwistJoint3D.xml:77 doc/classes/Generic6DOFJoint3D.xml:404
-#: doc/classes/HingeJoint3D.xml:109 doc/classes/Light3D.xml:124
+#: doc/classes/HingeJoint3D.xml:109 doc/classes/Light3D.xml:145
#: doc/classes/SliderJoint3D.xml:170
msgid "Represents the size of the [enum Param] enum."
msgstr ""
@@ -14620,8 +14173,8 @@ msgstr ""
#: doc/classes/Control.xml:801
msgid ""
"Tells Godot which node it should give keyboard focus to if the user presses "
-"Tab on a keyboard by default. You can change the key by editing the "
-"[code]ui_focus_next[/code] input action.\n"
+"[kbd]Tab[/kbd] on a keyboard by default. You can change the key by editing "
+"the [code]ui_focus_next[/code] input action.\n"
"If this property is not set, Godot will select a \"best guess\" based on "
"surrounding nodes in the scene tree."
msgstr ""
@@ -14629,8 +14182,8 @@ msgstr ""
#: doc/classes/Control.xml:805
msgid ""
"Tells Godot which node it should give keyboard focus to if the user presses "
-"Shift+Tab on a keyboard by default. You can change the key by editing the "
-"[code]ui_focus_prev[/code] input action.\n"
+"[kbd]Shift + Tab[/kbd] on a keyboard by default. You can change the key by "
+"editing the [code]ui_focus_prev[/code] input action.\n"
"If this property is not set, Godot will select a \"best guess\" based on "
"surrounding nodes in the scene tree."
msgstr ""
@@ -14712,9 +14265,9 @@ msgstr ""
#: doc/classes/Control.xml:841
msgid ""
-"Enables whether rendering of children should be clipped to this control's "
-"rectangle. If [code]true[/code], parts of a child which would be visibly "
-"outside of this control's rectangle will not be rendered."
+"Enables whether rendering of [CanvasItem] based children should be clipped "
+"to this control's rectangle. If [code]true[/code], parts of a child which "
+"would be visibly outside of this control's rectangle will not be rendered."
msgstr ""
#: doc/classes/Control.xml:844
@@ -16870,6 +16423,172 @@ msgid ""
"stiffness multiplied by the size difference from its resting length."
msgstr ""
+#: doc/classes/Decal.xml:4
+msgid "Node that projects a texture onto a [MeshInstance3D]."
+msgstr ""
+
+#: doc/classes/Decal.xml:7
+msgid ""
+"[Decal]s are used to project a texture onto a [Mesh] in the scene. Use "
+"Decals to add detail to a scene without affecting the underlying [Mesh]. "
+"They are often used to add weathering to building, add dirt or mud to the "
+"ground, or add variety to props. Decals can be moved at any time, making "
+"them suitable for things like blob shadows or laser sight dots.\n"
+"They are made of an [AABB] and a group of [Texture2D]s specifying [Color], "
+"normal, ORM (ambient occlusion, roughness, metallic), and emission. Decals "
+"are projected within their [AABB] so altering the orientation of the Decal "
+"affects the direction in which they are projected. By default, Decals are "
+"projected down (i.e. from positive Y to negative Y).\n"
+"The [Texture2D]s associated with the Decal are automatically stored in a "
+"texture atlas which is used for drawing the decals so all decals can be "
+"drawn at once. Godot uses clustered decals, meaning they are stored in "
+"cluster data and drawn when the mesh is drawn, they are not drawn as a "
+"postprocessing effect after."
+msgstr ""
+
+#: doc/classes/Decal.xml:20
+msgid ""
+"Returns the [Texture2D] associated with the specified [enum DecalTexture]. "
+"This is a convenience method, in most cases you should access the texture "
+"directly. \n"
+"For example, instead of [code]albedo_tex = $Decal.get_texture(Decal."
+"TEXTURE_ALBEDO)[/code], use [code]albedo_tex = $Decal.texture_albedo[/"
+"code].\n"
+"One case where this is better than accessing the texture directly is when "
+"you want to copy one Decal's textures to another. For example:\n"
+"[codeblock]\n"
+"for i in Decal.TEXTURE_MAX:\n"
+" $NewDecal.set_texture(i, $OldDecal.get_texture(i))\n"
+"[/codeblock]"
+msgstr ""
+
+#: doc/classes/Decal.xml:37
+msgid ""
+"Sets the [Texture2D] associated with the specified [enum DecalTexture]. This "
+"is a convenience method, in most cases you should access the texture "
+"directly. \n"
+"For example, instead of [code]$Decal.set_texture(Decal.TEXTURE_ALBEDO, "
+"albedo_tex)[/code], use [code]$Decal.texture_albedo = albedo_tex[/code].\n"
+"One case where this is better than accessing the texture directly is when "
+"you want to copy one Decal's textures to another. For example:\n"
+"[codeblock]\n"
+"for i in Decal.TEXTURE_MAX:\n"
+" $NewDecal.set_texture(i, $OldDecal.get_texture(i))\n"
+"[/codeblock]"
+msgstr ""
+
+#: doc/classes/Decal.xml:49
+msgid ""
+"Blends the albedo [Color] of the decal with albedo [Color] of the underlying "
+"mesh."
+msgstr ""
+
+#: doc/classes/Decal.xml:52
+msgid ""
+"Specifies which [member VisualInstance3D.layers] this decal will project on. "
+"By default, Decals affect all layers. This is used so you can specify which "
+"types of objects receive the Decal and which do not. This is especially "
+"useful so you an ensure that dynamic objects don't accidentally receive a "
+"Decal intended for the terrain under them."
+msgstr ""
+
+#: doc/classes/Decal.xml:55
+msgid "Distance from the camera at which the Decal begins to fade away."
+msgstr ""
+
+#: doc/classes/Decal.xml:58
+msgid ""
+"If [code]true[/code], decals will smoothly fade away when far from the "
+"active [Camera3D] starting at [member distance_fade_begin]. The Decal will "
+"fade out over [member distance_fade_length], after which it will be culled "
+"and not sent to the shader at all. Use this to reduce the number of active "
+"Decals in a scene and thus improve performance."
+msgstr ""
+
+#: doc/classes/Decal.xml:61
+msgid ""
+"Distance over which the Decal fades. The Decal becomes slowly more "
+"transparent over this distance and is completely invisible at the end."
+msgstr ""
+
+#: doc/classes/Decal.xml:64
+msgid ""
+"Energy multiplier for the emission texture. This will make the decal emit "
+"light at a higher intensity."
+msgstr ""
+
+#: doc/classes/Decal.xml:67
+msgid ""
+"Sets the size of the [AABB] used by the decal. The AABB goes from [code]-"
+"extents[/code] to [code]extents[/code]."
+msgstr ""
+
+#: doc/classes/Decal.xml:70 doc/classes/Decal.xml:91
+msgid ""
+"Sets the curve over which the decal will fade as the surface gets further "
+"from the center of the [AABB]."
+msgstr ""
+
+#: doc/classes/Decal.xml:73
+msgid "Changes the [Color] of the Decal by multiplying it with this value."
+msgstr ""
+
+#: doc/classes/Decal.xml:76
+msgid ""
+"Fades the Decal if the angle between the Decal's [AABB] and the target "
+"surface becomes too large. A value of [code]0[/code] projects the Decal "
+"regardless of angle, a value of [code]1[/code] limits the Decal to surfaces "
+"that are nearly perpendicular."
+msgstr ""
+
+#: doc/classes/Decal.xml:79
+msgid ""
+"[Texture2D] with the base [Color] of the Decal. Either this or the [member "
+"texture_emission] must be set for the Decal to be visible. Use the alpha "
+"channel like a mask to smoothly blend the edges of the decal with the "
+"underlying object."
+msgstr ""
+
+#: doc/classes/Decal.xml:82
+msgid ""
+"[Texture2D] with the emission [Color] of the Decal. Either this or the "
+"[member texture_emission] must be set for the Decal to be visible. Use the "
+"alpha channel like a mask to smoothly blend the edges of the decal with the "
+"underlying object."
+msgstr ""
+
+#: doc/classes/Decal.xml:85
+msgid ""
+"[Texture2D] with the per-pixel normalmap for the decal. Use this to add "
+"extra detail to decals."
+msgstr ""
+
+#: doc/classes/Decal.xml:88
+msgid ""
+"[Texture2D] storing ambient occlusion, roughness, and metallic for the "
+"decal. Use this to add extra detail to decals."
+msgstr ""
+
+#: doc/classes/Decal.xml:96
+msgid "[Texture2D] corresponding to [member texture_albedo]."
+msgstr ""
+
+#: doc/classes/Decal.xml:99
+msgid "[Texture2D] corresponding to [member texture_normal]."
+msgstr ""
+
+#: doc/classes/Decal.xml:102
+msgid "[Texture2D] corresponding to [member texture_orm]."
+msgstr ""
+
+#: doc/classes/Decal.xml:105
+msgid "[Texture2D] corresponding to [member texture_emission]."
+msgstr ""
+
+#: doc/classes/Decal.xml:108
+msgid "Max size of [enum DecalTexture] enum."
+msgstr ""
+
#: doc/classes/Dictionary.xml:4
msgid "Dictionary type."
msgstr ""
@@ -16877,30 +16596,40 @@ msgstr ""
#: doc/classes/Dictionary.xml:7
msgid ""
"Dictionary type. Associative container which contains values referenced by "
-"unique keys. Dictionary are composed of pairs of keys (which must be unique) "
-"and values. You can define a dictionary by placing a comma separated list of "
-"[code]key: value[/code] pairs in curly braces [code]{}[/code].\n"
-"Erasing elements while iterating over them [b]is not supported[/b].\n"
+"unique keys. Dictionaries are composed of pairs of keys (which must be "
+"unique) and values. Dictionaries will preserve the insertion order when "
+"adding elements, even though this may not be reflected when printing the "
+"dictionary. In other programming languages, this data structure is sometimes "
+"referred to as an hash map or associative array.\n"
+"You can define a dictionary by placing a comma-separated list of [code]key: "
+"value[/code] pairs in curly braces [code]{}[/code].\n"
+"Erasing elements while iterating over them [b]is not supported[/b] and will "
+"result in undefined behavior.\n"
"Creating a dictionary:\n"
"[codeblock]\n"
"var my_dir = {} # Creates an empty dictionary.\n"
"var points_dir = {\"White\": 50, \"Yellow\": 75, \"Orange\": 100}\n"
-"var my_dir = {\n"
+"var another_dir = {\n"
" key1: value1,\n"
" key2: value2,\n"
" key3: value3,\n"
"}\n"
"[/codeblock]\n"
-"You can access values of a dictionary by referencing appropriate key in "
-"above example [code]points_dir[\"White\"][/code] would return value of 50.\n"
+"You can access a dictionary's values by referencing the appropriate key. In "
+"the above example, [code]points_dir[\"White\"][/code] will return [code]50[/"
+"code]. You can also write [code]points_dir.White[/code], which is "
+"equivalent. However, you'll have to use the bracket syntax if the key you're "
+"accessing the dictionary with isn't a fixed string (such as a number or "
+"variable).\n"
"[codeblock]\n"
"export(String, \"White\", \"Yellow\", \"Orange\") var my_color\n"
"var points_dir = {\"White\": 50, \"Yellow\": 75, \"Orange\": 100}\n"
"\n"
"func _ready():\n"
+" # We can't use dot syntax here as `my_color` is a variable.\n"
" var points = points_dir[my_color]\n"
"[/codeblock]\n"
-"In the above code [code]points[/code] will be assigned the value that is "
+"In the above code, [code]points[/code] will be assigned the value that is "
"paired with the appropriate color selected in [code]my_color[/code].\n"
"Dictionaries can contain more complex data:\n"
"[codeblock]\n"
@@ -16911,16 +16640,24 @@ msgid ""
"assign to it:\n"
"[codeblock]\n"
"var points_dir = {\"White\": 50, \"Yellow\": 75, \"Orange\": 100}\n"
-"var points_dir[\"Blue\"] = 150 # Add \"Blue\" as a key and assign 150 as its "
+"points_dir[\"Blue\"] = 150 # Add \"Blue\" as a key and assign 150 as its "
"value.\n"
"[/codeblock]\n"
"Finally, dictionaries can contain different types of keys and values in the "
"same dictionary:\n"
"[codeblock]\n"
-"var my_dir = {\"String Key\": 5, 4: [1, 2, 3], 7: \"Hello\"} # This is a "
-"valid dictionary.\n"
+"# This is a valid dictionary.\n"
+"# To access the string \"Nested value\" below, use `my_dir.sub_dir.sub_key` "
+"or `my_dir[\"sub_dir\"][\"sub_key\"]`.\n"
+"# Indexing styles can be mixed and matched depending on your needs.\n"
+"var my_dir = {\n"
+" \"String Key\": 5,\n"
+" 4: [1, 2, 3],\n"
+" 7: \"Hello\",\n"
+" \"sub_dir\": {\"sub_key\": \"Nested value\"},\n"
+"}\n"
"[/codeblock]\n"
-"[b]Note:[/b] Unlike [Array]s you can't compare dictionaries directly:\n"
+"[b]Note:[/b] Unlike [Array]s, you can't compare dictionaries directly:\n"
"[codeblock]\n"
"array1 = [1, 2, 3]\n"
"array2 = [1, 2, 3]\n"
@@ -16945,49 +16682,52 @@ msgid ""
"[/codeblock]"
msgstr ""
-#: doc/classes/Dictionary.xml:65
+#: doc/classes/Dictionary.xml:75
msgid ""
"https://docs.godotengine.org/en/latest/getting_started/scripting/gdscript/"
"gdscript_basics.html#dictionary"
msgstr ""
-#: doc/classes/Dictionary.xml:72
+#: doc/classes/Dictionary.xml:82
msgid "Clear the dictionary, removing all key/value pairs."
msgstr ""
-#: doc/classes/Dictionary.xml:81
-msgid "Creates a copy of the dictionary, and returns it."
+#: doc/classes/Dictionary.xml:91
+msgid ""
+"Creates a copy of the dictionary, and returns it. The [code]deep[/code] "
+"parameter causes inner dictionaries and arrays to be copied recursively, but "
+"does not apply to objects."
msgstr ""
-#: doc/classes/Dictionary.xml:88
+#: doc/classes/Dictionary.xml:98
msgid "Returns [code]true[/code] if the dictionary is empty."
msgstr ""
-#: doc/classes/Dictionary.xml:97
+#: doc/classes/Dictionary.xml:107
msgid ""
"Erase a dictionary key/value pair by key. Returns [code]true[/code] if the "
"given key was present in the dictionary, [code]false[/code] otherwise. Does "
"not erase elements while iterating over the dictionary."
msgstr ""
-#: doc/classes/Dictionary.xml:108
+#: doc/classes/Dictionary.xml:118
msgid ""
"Returns the current value for the specified key in the [Dictionary]. If the "
"key does not exist, the method returns the value of the optional default "
"argument, or [code]null[/code] if it is omitted."
msgstr ""
-#: doc/classes/Dictionary.xml:117
+#: doc/classes/Dictionary.xml:127
msgid "Returns [code]true[/code] if the dictionary has a given key."
msgstr ""
-#: doc/classes/Dictionary.xml:126
+#: doc/classes/Dictionary.xml:136
msgid ""
"Returns [code]true[/code] if the dictionary has all of the keys in the given "
"array."
msgstr ""
-#: doc/classes/Dictionary.xml:133
+#: doc/classes/Dictionary.xml:143
msgid ""
"Returns a hashed integer value representing the dictionary contents. This "
"can be used to compare dictionaries by value:\n"
@@ -17000,15 +16740,15 @@ msgid ""
"[/codeblock]"
msgstr ""
-#: doc/classes/Dictionary.xml:146
+#: doc/classes/Dictionary.xml:156
msgid "Returns the list of keys in the [Dictionary]."
msgstr ""
-#: doc/classes/Dictionary.xml:153
+#: doc/classes/Dictionary.xml:163
msgid "Returns the size of the dictionary (in pairs)."
msgstr ""
-#: doc/classes/Dictionary.xml:160
+#: doc/classes/Dictionary.xml:170
msgid "Returns the list of values in the [Dictionary]."
msgstr ""
@@ -17034,37 +16774,42 @@ msgstr ""
#: doc/classes/DirectionalLight3D.xml:16
msgid ""
-"Amount of extra bias for shadow splits that are far away. If self-shadowing "
-"occurs only on the splits far away, increasing this value can fix them."
+"If [code]true[/code], shadow detail is sacrificed in exchange for smoother "
+"transitions between splits."
msgstr ""
#: doc/classes/DirectionalLight3D.xml:19
msgid ""
-"If [code]true[/code], shadow detail is sacrificed in exchange for smoother "
-"transitions between splits."
+"Optimizes shadow rendering for detail versus movement. See [enum "
+"ShadowDepthRange]."
msgstr ""
#: doc/classes/DirectionalLight3D.xml:22
msgid ""
-"Optimizes shadow rendering for detail versus movement. See [enum "
-"ShadowDepthRange]."
+"Proportion of [member directional_shadow_max_distance] at which point the "
+"shadow starts to fade. At [member directional_shadow_max_distance] the "
+"shadow will disappear."
msgstr ""
-#: doc/classes/DirectionalLight3D.xml:27
+#: doc/classes/DirectionalLight3D.xml:25
msgid "The maximum distance for shadow splits."
msgstr ""
-#: doc/classes/DirectionalLight3D.xml:30
+#: doc/classes/DirectionalLight3D.xml:28
msgid "The light's shadow rendering algorithm. See [enum ShadowMode]."
msgstr ""
-#: doc/classes/DirectionalLight3D.xml:33
+#: doc/classes/DirectionalLight3D.xml:31 doc/classes/RenderingServer.xml:3371
msgid ""
-"Can be used to fix special cases of self shadowing when objects are "
-"perpendicular to the light."
+"Sets the size of the directional shadow pancake. The pancake offsets the "
+"start of the shadow's camera frustum to provide a higher effective depth "
+"resolution for the shadow. However, a high pancake size can cause artifacts "
+"in the shadows of large objects that are close to the edge of the frustum. "
+"Reducing the pancake size can help. Setting the size to [code]0[/code] turns "
+"off the pancaking effect."
msgstr ""
-#: doc/classes/DirectionalLight3D.xml:36
+#: doc/classes/DirectionalLight3D.xml:34
msgid ""
"The distance from camera to shadow split 1. Relative to [member "
"directional_shadow_max_distance]. Only used when [member "
@@ -17072,7 +16817,7 @@ msgid ""
"[code]SHADOW_PARALLEL_4_SPLITS[/code]."
msgstr ""
-#: doc/classes/DirectionalLight3D.xml:39
+#: doc/classes/DirectionalLight3D.xml:37
msgid ""
"The distance from shadow split 1 to split 2. Relative to [member "
"directional_shadow_max_distance]. Only used when [member "
@@ -17080,34 +16825,34 @@ msgid ""
"[code]SHADOW_PARALLEL_4_SPLITS[/code]."
msgstr ""
-#: doc/classes/DirectionalLight3D.xml:42
+#: doc/classes/DirectionalLight3D.xml:40
msgid ""
"The distance from shadow split 2 to split 3. Relative to [member "
"directional_shadow_max_distance]. Only used when [member "
"directional_shadow_mode] is [code]SHADOW_PARALLEL_4_SPLITS[/code]."
msgstr ""
-#: doc/classes/DirectionalLight3D.xml:48
+#: doc/classes/DirectionalLight3D.xml:45
msgid ""
"Renders the entire scene's shadow map from an orthogonal point of view. May "
"result in blockier shadows on close objects."
msgstr ""
-#: doc/classes/DirectionalLight3D.xml:51
+#: doc/classes/DirectionalLight3D.xml:48
msgid "Splits the view frustum in 2 areas, each with its own shadow map."
msgstr ""
-#: doc/classes/DirectionalLight3D.xml:54
+#: doc/classes/DirectionalLight3D.xml:51
msgid "Splits the view frustum in 4 areas, each with its own shadow map."
msgstr ""
-#: doc/classes/DirectionalLight3D.xml:57
+#: doc/classes/DirectionalLight3D.xml:54
msgid ""
"Keeps the shadow stable when the camera moves, at the cost of lower "
"effective shadow resolution."
msgstr ""
-#: doc/classes/DirectionalLight3D.xml:60
+#: doc/classes/DirectionalLight3D.xml:57
msgid ""
"Tries to achieve maximum shadow resolution. May result in saw effect on "
"shadow edges."
@@ -17397,61 +17142,67 @@ msgid ""
"dynamic_font.font_data = load(\"res://BarlowCondensed-Bold.ttf\")\n"
"dynamic_font.size = 64\n"
"$\"Label\".set(\"custom_fonts/font\", dynamic_font)\n"
-"[/codeblock]"
+"[/codeblock]\n"
+"[b]Note:[/b] DynamicFont doesn't support features such as right-to-left "
+"typesetting, ligatures, text shaping, variable fonts and optional font "
+"features yet. If you wish to \"bake\" an optional font feature into a TTF "
+"font file, you can use [url=https://fontforge.org/]FontForge[/url] to do so. "
+"In FontForge, use [b]File > Generate Fonts[/b], click [b]Options[/b], choose "
+"the desired features then generate the font."
msgstr ""
-#: doc/classes/DynamicFont.xml:25
+#: doc/classes/DynamicFont.xml:26
msgid "Adds a fallback font."
msgstr ""
-#: doc/classes/DynamicFont.xml:34
+#: doc/classes/DynamicFont.xml:35
msgid "Returns the fallback font at index [code]idx[/code]."
msgstr ""
-#: doc/classes/DynamicFont.xml:41
+#: doc/classes/DynamicFont.xml:42
msgid "Returns the number of fallback fonts."
msgstr ""
-#: doc/classes/DynamicFont.xml:50
+#: doc/classes/DynamicFont.xml:51
msgid ""
"Returns the spacing for the given [code]type[/code] (see [enum SpacingType])."
msgstr ""
-#: doc/classes/DynamicFont.xml:59
+#: doc/classes/DynamicFont.xml:60
msgid "Removes the fallback font at index [code]idx[/code]."
msgstr ""
-#: doc/classes/DynamicFont.xml:70
+#: doc/classes/DynamicFont.xml:71
msgid "Sets the fallback font at index [code]idx[/code]."
msgstr ""
-#: doc/classes/DynamicFont.xml:81
+#: doc/classes/DynamicFont.xml:82
msgid ""
"Sets the spacing for [code]type[/code] (see [enum SpacingType]) to "
"[code]value[/code] in pixels (not relative to the font size)."
msgstr ""
-#: doc/classes/DynamicFont.xml:87
+#: doc/classes/DynamicFont.xml:88
msgid "Extra spacing at the bottom in pixels."
msgstr ""
-#: doc/classes/DynamicFont.xml:90
+#: doc/classes/DynamicFont.xml:91
msgid "Extra character spacing in pixels."
msgstr ""
-#: doc/classes/DynamicFont.xml:93
+#: doc/classes/DynamicFont.xml:94
msgid "Extra space spacing in pixels."
msgstr ""
-#: doc/classes/DynamicFont.xml:96
+#: doc/classes/DynamicFont.xml:97
msgid "Extra spacing at the top in pixels."
msgstr ""
-#: doc/classes/DynamicFont.xml:99
+#: doc/classes/DynamicFont.xml:100
msgid "The font data."
msgstr ""
-#: doc/classes/DynamicFont.xml:102
+#: doc/classes/DynamicFont.xml:103
msgid ""
"The font outline's color.\n"
"[b]Note:[/b] It's recommended to leave this at the default value so that you "
@@ -17460,27 +17211,27 @@ msgid ""
"outline modulate theme item."
msgstr ""
-#: doc/classes/DynamicFont.xml:106
+#: doc/classes/DynamicFont.xml:107
msgid "The font outline's thickness in pixels (not relative to the font size)."
msgstr ""
-#: doc/classes/DynamicFont.xml:109
+#: doc/classes/DynamicFont.xml:110
msgid "The font size in pixels."
msgstr ""
-#: doc/classes/DynamicFont.xml:114
+#: doc/classes/DynamicFont.xml:115
msgid "Spacing at the top."
msgstr ""
-#: doc/classes/DynamicFont.xml:117
+#: doc/classes/DynamicFont.xml:118
msgid "Spacing at the bottom."
msgstr ""
-#: doc/classes/DynamicFont.xml:120
+#: doc/classes/DynamicFont.xml:121
msgid "Character spacing."
msgstr ""
-#: doc/classes/DynamicFont.xml:123
+#: doc/classes/DynamicFont.xml:124
msgid "Space spacing."
msgstr ""
@@ -17595,7 +17346,7 @@ msgstr ""
msgid ""
"Saves the editor feature profile to a file in JSON format. It can then be "
"imported using the feature profile manager's [b]Import[/b] button or the "
-"[method load_from_file] button."
+"[method load_from_file] button."
msgstr ""
#: doc/classes/EditorFeatureProfile.xml:86
@@ -17809,56 +17560,58 @@ msgstr ""
#: doc/classes/EditorFileSystem.xml:7
msgid ""
"This object holds information of all resources in the filesystem, their "
-"types, etc."
+"types, etc.\n"
+"[b]Note:[/b] This class shouldn't be instantiated directly. Instead, access "
+"the singleton using [method EditorInterface.get_resource_filesystem]."
msgstr ""
-#: doc/classes/EditorFileSystem.xml:18
+#: doc/classes/EditorFileSystem.xml:19
msgid "Gets the type of the file, given the full path."
msgstr ""
-#: doc/classes/EditorFileSystem.xml:25
+#: doc/classes/EditorFileSystem.xml:26
msgid "Gets the root directory object."
msgstr ""
-#: doc/classes/EditorFileSystem.xml:34
+#: doc/classes/EditorFileSystem.xml:35
msgid "Returns a view into the filesystem at [code]path[/code]."
msgstr ""
-#: doc/classes/EditorFileSystem.xml:41
+#: doc/classes/EditorFileSystem.xml:42
msgid "Returns the scan progress for 0 to 1 if the FS is being scanned."
msgstr ""
-#: doc/classes/EditorFileSystem.xml:48
+#: doc/classes/EditorFileSystem.xml:49
msgid "Returns [code]true[/code] of the filesystem is being scanned."
msgstr ""
-#: doc/classes/EditorFileSystem.xml:55
+#: doc/classes/EditorFileSystem.xml:56
msgid "Scan the filesystem for changes."
msgstr ""
-#: doc/classes/EditorFileSystem.xml:62
+#: doc/classes/EditorFileSystem.xml:63
msgid "Check if the source of any imported resource changed."
msgstr ""
-#: doc/classes/EditorFileSystem.xml:71
+#: doc/classes/EditorFileSystem.xml:72
msgid ""
"Update a file information. Call this if an external program (not Godot) "
"modified the file."
msgstr ""
-#: doc/classes/EditorFileSystem.xml:78
+#: doc/classes/EditorFileSystem.xml:79
msgid "Scans the script files and updates the list of custom class names."
msgstr ""
-#: doc/classes/EditorFileSystem.xml:85
+#: doc/classes/EditorFileSystem.xml:86
msgid "Emitted if the filesystem changed."
msgstr ""
-#: doc/classes/EditorFileSystem.xml:92
+#: doc/classes/EditorFileSystem.xml:93
msgid "Remitted if a resource is reimported."
msgstr ""
-#: doc/classes/EditorFileSystem.xml:105
+#: doc/classes/EditorFileSystem.xml:106
msgid "Emitted if the source of any imported file changed."
msgstr ""
@@ -18062,7 +17815,9 @@ msgid ""
"editor. It's used to edit the properties of the selected node. For example, "
"you can select a node such as the Sprite2D then edit its transform through "
"the inspector tool. The editor inspector is an essential tool in the game "
-"development workflow."
+"development workflow.\n"
+"[b]Note:[/b] This class shouldn't be instantiated directly. Instead, access "
+"the singleton using [method EditorInterface.get_inspector]."
msgstr ""
#: doc/classes/EditorInspectorPlugin.xml:4
@@ -18132,95 +17887,97 @@ msgid ""
"customizing the window, saving and (re-)loading scenes, rendering mesh "
"previews, inspecting and editing resources and objects, and provides access "
"to [EditorSettings], [EditorFileSystem], [EditorResourcePreview], "
-"[ScriptEditor], the editor viewport, and information about scenes."
+"[ScriptEditor], the editor viewport, and information about scenes.\n"
+"[b]Note:[/b] This class shouldn't be instantiated directly. Instead, access "
+"the singleton using [method EditorPlugin.get_editor_interface]."
msgstr ""
-#: doc/classes/EditorInterface.xml:18
+#: doc/classes/EditorInterface.xml:19
msgid "Edits the given [Resource]."
msgstr ""
-#: doc/classes/EditorInterface.xml:25
+#: doc/classes/EditorInterface.xml:26
msgid ""
"Returns the main container of Godot editor's window. You can use it, for "
"example, to retrieve the size of the container and place your controls "
"accordingly."
msgstr ""
-#: doc/classes/EditorInterface.xml:38
+#: doc/classes/EditorInterface.xml:39
msgid "Returns the edited (current) scene's root [Node]."
msgstr ""
-#: doc/classes/EditorInterface.xml:45
+#: doc/classes/EditorInterface.xml:46
msgid "Returns the [EditorSettings]."
msgstr ""
-#: doc/classes/EditorInterface.xml:52
+#: doc/classes/EditorInterface.xml:53
msgid "Returns the editor [Viewport]."
msgstr ""
-#: doc/classes/EditorInterface.xml:71
+#: doc/classes/EditorInterface.xml:72
msgid "Returns an [Array] with the file paths of the currently opened scenes."
msgstr ""
-#: doc/classes/EditorInterface.xml:78
+#: doc/classes/EditorInterface.xml:79
msgid "Returns the [EditorFileSystem]."
msgstr ""
-#: doc/classes/EditorInterface.xml:85
+#: doc/classes/EditorInterface.xml:86
msgid "Returns the [EditorResourcePreview]."
msgstr ""
-#: doc/classes/EditorInterface.xml:92
+#: doc/classes/EditorInterface.xml:93
msgid "Returns the [ScriptEditor]."
msgstr ""
-#: doc/classes/EditorInterface.xml:105
+#: doc/classes/EditorInterface.xml:106
msgid "Returns the [EditorSelection]."
msgstr ""
-#: doc/classes/EditorInterface.xml:116
+#: doc/classes/EditorInterface.xml:117
msgid ""
"Shows the given property on the given [code]object[/code] in the Editor's "
"Inspector dock."
msgstr ""
-#: doc/classes/EditorInterface.xml:125
+#: doc/classes/EditorInterface.xml:126
msgid ""
"Returns the enabled status of a plugin. The plugin name is the same as its "
"directory name."
msgstr ""
-#: doc/classes/EditorInterface.xml:136
+#: doc/classes/EditorInterface.xml:137
msgid ""
"Returns mesh previews rendered at the given size as an [Array] of "
"[Texture2D]s."
msgstr ""
-#: doc/classes/EditorInterface.xml:145
+#: doc/classes/EditorInterface.xml:146
msgid "Opens the scene at the given path."
msgstr ""
-#: doc/classes/EditorInterface.xml:154
+#: doc/classes/EditorInterface.xml:155
msgid "Reloads the scene at the given path."
msgstr ""
-#: doc/classes/EditorInterface.xml:161
+#: doc/classes/EditorInterface.xml:162
msgid ""
"Saves the scene. Returns either [code]OK[/code] or [code]ERR_CANT_CREATE[/"
"code] (see [@GlobalScope] constants)."
msgstr ""
-#: doc/classes/EditorInterface.xml:172
+#: doc/classes/EditorInterface.xml:173
msgid "Saves the scene as a file at [code]path[/code]."
msgstr ""
-#: doc/classes/EditorInterface.xml:181
+#: doc/classes/EditorInterface.xml:182
msgid ""
"Selects the file, with the path provided by [code]file[/code], in the "
"FileSystem dock."
msgstr ""
-#: doc/classes/EditorInterface.xml:208
+#: doc/classes/EditorInterface.xml:209
msgid ""
"Sets the enabled status of a plugin. The plugin name is the same as its "
"directory name."
@@ -18833,57 +18590,57 @@ msgstr ""
msgid "Used by the inspector, when the property is checked."
msgstr ""
-#: doc/classes/EditorProperty.xml:82
+#: doc/classes/EditorProperty.xml:84
msgid "Used by the inspector, when the property must draw with error color."
msgstr ""
-#: doc/classes/EditorProperty.xml:85
+#: doc/classes/EditorProperty.xml:87
msgid "Used by the inspector, when the property can add keys for animation."
msgstr ""
-#: doc/classes/EditorProperty.xml:88
+#: doc/classes/EditorProperty.xml:90
msgid "Sets this property to change the label (if you want to show one)."
msgstr ""
-#: doc/classes/EditorProperty.xml:91
+#: doc/classes/EditorProperty.xml:93
msgid "Used by the inspector, when the property is read-only."
msgstr ""
-#: doc/classes/EditorProperty.xml:101
+#: doc/classes/EditorProperty.xml:103
msgid ""
"Emit it if you want multiple properties modified at the same time. Do not "
"use if added via [method EditorInspectorPlugin.parse_property]."
msgstr ""
-#: doc/classes/EditorProperty.xml:110
+#: doc/classes/EditorProperty.xml:112
msgid "Used by sub-inspectors. Emit it if what was selected was an Object ID."
msgstr ""
-#: doc/classes/EditorProperty.xml:119
+#: doc/classes/EditorProperty.xml:121
msgid ""
"Do not emit this manually, use the [method emit_changed] method instead."
msgstr ""
-#: doc/classes/EditorProperty.xml:128
+#: doc/classes/EditorProperty.xml:130
msgid "Emitted when a property was checked. Used internally."
msgstr ""
-#: doc/classes/EditorProperty.xml:135
+#: doc/classes/EditorProperty.xml:143
msgid ""
"Emit it if you want to add this value as an animation key (check for keying "
"being enabled first)."
msgstr ""
-#: doc/classes/EditorProperty.xml:144
+#: doc/classes/EditorProperty.xml:152
msgid "Emit it if you want to key a property with a single value."
msgstr ""
-#: doc/classes/EditorProperty.xml:153
+#: doc/classes/EditorProperty.xml:161
msgid ""
"If you want a sub-resource to be edited, emit this signal with the resource."
msgstr ""
-#: doc/classes/EditorProperty.xml:162
+#: doc/classes/EditorProperty.xml:170
msgid "Emitted when selected. Used internally."
msgstr ""
@@ -18892,20 +18649,23 @@ msgid "Helper to generate previews of resources or files."
msgstr ""
#: doc/classes/EditorResourcePreview.xml:7
-msgid "This object is used to generate previews for resources of files."
+msgid ""
+"This object is used to generate previews for resources of files.\n"
+"[b]Note:[/b] This class shouldn't be instantiated directly. Instead, access "
+"the singleton using [method EditorInterface.get_resource_previewer]."
msgstr ""
-#: doc/classes/EditorResourcePreview.xml:18
+#: doc/classes/EditorResourcePreview.xml:19
msgid "Create an own, custom preview generator."
msgstr ""
-#: doc/classes/EditorResourcePreview.xml:27
+#: doc/classes/EditorResourcePreview.xml:28
msgid ""
"Check if the resource changed, if so, it will be invalidated and the "
"corresponding signal emitted."
msgstr ""
-#: doc/classes/EditorResourcePreview.xml:42
+#: doc/classes/EditorResourcePreview.xml:43
msgid ""
"Queue a resource being edited for preview (using an instance). Once the "
"preview is ready, your receiver.receiver_func will be called either "
@@ -18914,7 +18674,7 @@ msgid ""
"can be anything."
msgstr ""
-#: doc/classes/EditorResourcePreview.xml:57
+#: doc/classes/EditorResourcePreview.xml:58
msgid ""
"Queue a resource file for preview (using a path). Once the preview is ready, "
"your receiver.receiver_func will be called either containing the preview "
@@ -18922,11 +18682,11 @@ msgid ""
"the format: (path,texture,userdata). Userdata can be anything."
msgstr ""
-#: doc/classes/EditorResourcePreview.xml:66
+#: doc/classes/EditorResourcePreview.xml:67
msgid "Removes a custom preview generator."
msgstr ""
-#: doc/classes/EditorResourcePreview.xml:75
+#: doc/classes/EditorResourcePreview.xml:76
msgid ""
"Emitted if a preview was invalidated (changed). [code]path[/code] "
"corresponds to the path of the preview."
@@ -19084,7 +18844,7 @@ msgstr ""
msgid ""
"Scripts extending this class and implementing its [method _run] method can "
"be executed from the Script Editor's [b]File > Run[/b] menu option (or by "
-"pressing [code]Ctrl+Shift+X[/code]) while the editor is running. This is "
+"pressing [kbd]Ctrl + Shift + X[/kbd]) while the editor is running. This is "
"useful for adding custom in-editor functionality to Godot. For more complex "
"additions, consider using [EditorPlugin]s instead.\n"
"[b]Note:[/b] Extending scripts need to have [code]tool[/code] mode enabled.\n"
@@ -19124,33 +18884,36 @@ msgid "Manages the SceneTree selection in the editor."
msgstr ""
#: doc/classes/EditorSelection.xml:7
-msgid "This object manages the SceneTree selection in the editor."
+msgid ""
+"This object manages the SceneTree selection in the editor.\n"
+"[b]Note:[/b] This class shouldn't be instantiated directly. Instead, access "
+"the singleton using [method EditorInterface.get_selection]."
msgstr ""
-#: doc/classes/EditorSelection.xml:18
+#: doc/classes/EditorSelection.xml:19
msgid "Adds a node to the selection."
msgstr ""
-#: doc/classes/EditorSelection.xml:25
+#: doc/classes/EditorSelection.xml:26
msgid "Clear the selection."
msgstr ""
-#: doc/classes/EditorSelection.xml:32
+#: doc/classes/EditorSelection.xml:33
msgid "Gets the list of selected nodes."
msgstr ""
-#: doc/classes/EditorSelection.xml:39
+#: doc/classes/EditorSelection.xml:40
msgid ""
"Gets the list of selected nodes, optimized for transform operations (i.e. "
"moving them, rotating, etc). This list avoids situations where a node is "
"selected and also child/grandchild."
msgstr ""
-#: doc/classes/EditorSelection.xml:48
+#: doc/classes/EditorSelection.xml:49
msgid "Removes a node from the selection."
msgstr ""
-#: doc/classes/EditorSelection.xml:55
+#: doc/classes/EditorSelection.xml:56
msgid "Emitted when the selection changes."
msgstr ""
@@ -19167,10 +18930,12 @@ msgid ""
"settings.set(prop,value)\n"
"settings.get(prop)\n"
"list_of_settings = settings.get_property_list()\n"
-"[/codeblock]"
+"[/codeblock]\n"
+"[b]Note:[/b] This class shouldn't be instantiated directly. Instead, access "
+"the singleton using [method EditorInterface.get_editor_settings]."
msgstr ""
-#: doc/classes/EditorSettings.xml:24
+#: doc/classes/EditorSettings.xml:25
msgid ""
"Adds a custom property info to a property. The dictionary must contain:\n"
"- [code]name[/code]: [String] (the name of the property)\n"
@@ -19192,27 +18957,27 @@ msgid ""
"[/codeblock]"
msgstr ""
-#: doc/classes/EditorSettings.xml:49
+#: doc/classes/EditorSettings.xml:50
msgid "Erase a given setting (pass full property path)."
msgstr ""
-#: doc/classes/EditorSettings.xml:56
+#: doc/classes/EditorSettings.xml:57
msgid "Gets the list of favorite files and directories for this project."
msgstr ""
-#: doc/classes/EditorSettings.xml:75
+#: doc/classes/EditorSettings.xml:76
msgid ""
"Gets the specific project settings path. Projects all have a unique sub-"
"directory inside the settings path where project specific settings are saved."
msgstr ""
-#: doc/classes/EditorSettings.xml:82
+#: doc/classes/EditorSettings.xml:83
msgid ""
"Gets the list of recently visited folders in the file dialog for this "
"project."
msgstr ""
-#: doc/classes/EditorSettings.xml:97
+#: doc/classes/EditorSettings.xml:98
msgid ""
"Gets the global settings path for the engine. Inside this path, you can find "
"some standard paths such as:\n"
@@ -19220,21 +18985,21 @@ msgid ""
"[code]settings/templates[/code] - Where export templates are located"
msgstr ""
-#: doc/classes/EditorSettings.xml:132
+#: doc/classes/EditorSettings.xml:133
msgid "Sets the list of favorite files and directories for this project."
msgstr ""
-#: doc/classes/EditorSettings.xml:165
+#: doc/classes/EditorSettings.xml:166
msgid ""
"Sets the list of recently visited folders in the file dialog for this "
"project."
msgstr ""
-#: doc/classes/EditorSettings.xml:182
+#: doc/classes/EditorSettings.xml:183
msgid "Emitted when editor settings change."
msgstr ""
-#: doc/classes/EditorSettings.xml:188
+#: doc/classes/EditorSettings.xml:189
msgid ""
"Emitted when editor settings change. It used by various editor plugins to "
"update their visuals on theme changes or logic on configuration changes."
@@ -19977,7 +19742,7 @@ msgid ""
"is visible, \"ghost trail\" artifacts will be visible when moving the camera."
msgstr ""
-#: doc/classes/Environment.xml:262 doc/classes/RenderingServer.xml:3476
+#: doc/classes/Environment.xml:262 doc/classes/RenderingServer.xml:3563
msgid "Displays a camera feed in the background."
msgstr ""
@@ -19985,64 +19750,103 @@ msgstr ""
msgid "Represents the size of the [enum BGMode] enum."
msgstr ""
-#: doc/classes/Environment.xml:282
+#: doc/classes/Environment.xml:268 doc/classes/RenderingServer.xml:3569
+msgid ""
+"Gather ambient light from whichever source is specified as the background."
+msgstr ""
+
+#: doc/classes/Environment.xml:271 doc/classes/RenderingServer.xml:3572
+msgid "Disable ambient light."
+msgstr ""
+
+#: doc/classes/Environment.xml:274 doc/classes/RenderingServer.xml:3575
+msgid "Specify a specific [Color] for ambient light."
+msgstr ""
+
+#: doc/classes/Environment.xml:277 doc/classes/RenderingServer.xml:3578
+msgid ""
+"Gather ambient light from the [Sky] regardless of what the background is."
+msgstr ""
+
+#: doc/classes/Environment.xml:280 doc/classes/RenderingServer.xml:3581
+msgid "Use the background for reflections."
+msgstr ""
+
+#: doc/classes/Environment.xml:283 doc/classes/RenderingServer.xml:3584
+msgid "Disable reflections."
+msgstr ""
+
+#: doc/classes/Environment.xml:286 doc/classes/RenderingServer.xml:3587
+msgid "Use the [Sky] for reflections regardless of what the background is."
+msgstr ""
+
+#: doc/classes/Environment.xml:289 doc/classes/RenderingServer.xml:3590
msgid ""
"Additive glow blending mode. Mostly used for particles, glows (bloom), lens "
"flare, bright sources."
msgstr ""
-#: doc/classes/Environment.xml:285
+#: doc/classes/Environment.xml:292 doc/classes/RenderingServer.xml:3593
msgid ""
"Screen glow blending mode. Increases brightness, used frequently with bloom."
msgstr ""
-#: doc/classes/Environment.xml:288
+#: doc/classes/Environment.xml:295 doc/classes/RenderingServer.xml:3596
msgid ""
"Soft light glow blending mode. Modifies contrast, exposes shadows and "
"highlights (vivid bloom)."
msgstr ""
-#: doc/classes/Environment.xml:291
+#: doc/classes/Environment.xml:298 doc/classes/RenderingServer.xml:3599
msgid ""
"Replace glow blending mode. Replaces all pixels' color by the glow value. "
"This can be used to simulate a full-screen blur effect by tweaking the glow "
"parameters to match the original image's brightness."
msgstr ""
-#: doc/classes/Environment.xml:296
+#: doc/classes/Environment.xml:301 doc/classes/RenderingServer.xml:3602
+msgid ""
+"Mixes the glow with the underlying color to avoid increasing brightness as "
+"much while still maintaining a glow effect."
+msgstr ""
+
+#: doc/classes/Environment.xml:304
msgid ""
"Linear tonemapper operator. Reads the linear data and passes it on "
"unmodified."
msgstr ""
-#: doc/classes/Environment.xml:299
+#: doc/classes/Environment.xml:307
msgid ""
"Reinhardt tonemapper operator. Performs a variation on rendered pixels' "
"colors by this formula: [code]color = color / (1 + color)[/code]."
msgstr ""
-#: doc/classes/Environment.xml:302
+#: doc/classes/Environment.xml:310
msgid "Filmic tonemapper operator."
msgstr ""
-#: doc/classes/Environment.xml:305
+#: doc/classes/Environment.xml:313
msgid "Academy Color Encoding System tonemapper operator."
msgstr ""
-#: doc/classes/Environment.xml:308
+#: doc/classes/Environment.xml:316
msgid "No blur for the screen-space ambient occlusion effect (fastest)."
msgstr ""
-#: doc/classes/Environment.xml:311
+#: doc/classes/Environment.xml:319
msgid "1×1 blur for the screen-space ambient occlusion effect."
msgstr ""
-#: doc/classes/Environment.xml:314
+#: doc/classes/Environment.xml:322
msgid "2×2 blur for the screen-space ambient occlusion effect."
msgstr ""
-#: doc/classes/Environment.xml:317
-msgid "3×3 blur for the screen-space ambient occlusion effect (slowest)."
+#: doc/classes/Environment.xml:325
+msgid ""
+"3×3 blur for the screen-space ambient occlusion effect. Increases the radius "
+"of the blur for a smoother look, but can result in checkerboard-like "
+"artifacts."
msgstr ""
#: doc/classes/Expression.xml:4
@@ -20303,26 +20107,38 @@ msgid ""
msgstr ""
#: doc/classes/File.xml:299
-msgid "Stores an integer as 16 bits in the file."
+msgid ""
+"Stores an integer as 16 bits in the file.\n"
+"[b]Note:[/b] The [code]value[/code] should lie in the interval [code][0, "
+"2^16 - 1][/code]."
msgstr ""
-#: doc/classes/File.xml:308
-msgid "Stores an integer as 32 bits in the file."
+#: doc/classes/File.xml:309
+msgid ""
+"Stores an integer as 32 bits in the file.\n"
+"[b]Note:[/b] The [code]value[/code] should lie in the interval [code][0, "
+"2^32 - 1][/code]."
msgstr ""
-#: doc/classes/File.xml:317
-msgid "Stores an integer as 64 bits in the file."
+#: doc/classes/File.xml:319
+msgid ""
+"Stores an integer as 64 bits in the file.\n"
+"[b]Note:[/b] The [code]value[/code] must lie in the interval [code][-2^63, "
+"2^63 - 1][/code] (i.e. be a valid [int] value)."
msgstr ""
-#: doc/classes/File.xml:326
-msgid "Stores an integer as 8 bits in the file."
+#: doc/classes/File.xml:329
+msgid ""
+"Stores an integer as 8 bits in the file.\n"
+"[b]Note:[/b] The [code]value[/code] should lie in the interval [code][0, 255]"
+"[/code]."
msgstr ""
-#: doc/classes/File.xml:335
+#: doc/classes/File.xml:339
msgid "Stores the given array of bytes in the file."
msgstr ""
-#: doc/classes/File.xml:346
+#: doc/classes/File.xml:350
msgid ""
"Store the given [PackedStringArray] in the file as a line formatted in the "
"CSV (Comma-Separated Values) format. You can pass a different delimiter "
@@ -20331,45 +20147,45 @@ msgid ""
"Text will be encoded as UTF-8."
msgstr ""
-#: doc/classes/File.xml:356
+#: doc/classes/File.xml:360
msgid "Stores a floating-point number as 64 bits in the file."
msgstr ""
-#: doc/classes/File.xml:365
+#: doc/classes/File.xml:369
msgid "Stores a floating-point number as 32 bits in the file."
msgstr ""
-#: doc/classes/File.xml:374
+#: doc/classes/File.xml:378
msgid ""
"Stores the given [String] as a line in the file.\n"
"Text will be encoded as UTF-8."
msgstr ""
-#: doc/classes/File.xml:384
+#: doc/classes/File.xml:388
msgid ""
"Stores the given [String] as a line in the file in Pascal format (i.e. also "
"store the length of the string).\n"
"Text will be encoded as UTF-8."
msgstr ""
-#: doc/classes/File.xml:394
+#: doc/classes/File.xml:398
msgid "Stores a floating-point number in the file."
msgstr ""
-#: doc/classes/File.xml:403
+#: doc/classes/File.xml:407
msgid ""
"Stores the given [String] in the file.\n"
"Text will be encoded as UTF-8."
msgstr ""
-#: doc/classes/File.xml:415
+#: doc/classes/File.xml:419
msgid ""
"Stores any Variant value in the file. If [code]full_objects[/code] is "
"[code]true[/code], encoding objects is allowed (and can potentially include "
"code)."
msgstr ""
-#: doc/classes/File.xml:421
+#: doc/classes/File.xml:425
msgid ""
"If [code]true[/code], the file's endianness is swapped. Use this if you're "
"dealing with files written on big-endian machines.\n"
@@ -20377,44 +20193,44 @@ msgid ""
"reset to [code]false[/code] whenever you open the file."
msgstr ""
-#: doc/classes/File.xml:427
+#: doc/classes/File.xml:431
msgid "Opens the file for read operations."
msgstr ""
-#: doc/classes/File.xml:430
+#: doc/classes/File.xml:434
msgid ""
"Opens the file for write operations. Create it if the file does not exist "
"and truncate if it exists."
msgstr ""
-#: doc/classes/File.xml:433
+#: doc/classes/File.xml:437
msgid ""
"Opens the file for read and write operations. Does not truncate the file."
msgstr ""
-#: doc/classes/File.xml:436
+#: doc/classes/File.xml:440
msgid ""
"Opens the file for read and write operations. Create it if the file does not "
"exist and truncate if it exists."
msgstr ""
-#: doc/classes/File.xml:439
+#: doc/classes/File.xml:443
msgid "Uses the [url=http://fastlz.org/]FastLZ[/url] compression method."
msgstr ""
-#: doc/classes/File.xml:442
+#: doc/classes/File.xml:446
msgid ""
"Uses the [url=https://en.wikipedia.org/wiki/DEFLATE]DEFLATE[/url] "
"compression method."
msgstr ""
-#: doc/classes/File.xml:445
+#: doc/classes/File.xml:449
msgid ""
"Uses the [url=https://facebook.github.io/zstd/]Zstandard[/url] compression "
"method."
msgstr ""
-#: doc/classes/File.xml:448
+#: doc/classes/File.xml:452
msgid "Uses the [url=https://www.gzip.org/]gzip[/url] compression method."
msgstr ""
@@ -20718,7 +20534,7 @@ msgstr ""
msgid ""
"A GDNative library can implement [NativeScript]s, global functions to call "
"with the [GDNative] class, or low-level engine extensions through interfaces "
-"such as [ARVRInterfaceGDNative]. The library must be compiled for each "
+"such as [XRInterfaceGDNative]. The library must be compiled for each "
"platform and architecture that the project will run on."
msgstr ""
@@ -21673,99 +21489,99 @@ msgid ""
"object."
msgstr ""
-#: doc/classes/GeometryInstance3D.xml:27
+#: doc/classes/GeometryInstance3D.xml:35
msgid ""
"Overrides the bounding box of this node with a custom one. To remove it, set "
"an [AABB] with all fields set to zero."
msgstr ""
-#: doc/classes/GeometryInstance3D.xml:38
+#: doc/classes/GeometryInstance3D.xml:46
msgid ""
"Sets the [enum GeometryInstance3D.Flags] specified. See [enum "
"GeometryInstance3D.Flags] for options."
msgstr ""
-#: doc/classes/GeometryInstance3D.xml:44
+#: doc/classes/GeometryInstance3D.xml:62
msgid ""
"The selected shadow casting flag. See [enum ShadowCastingSetting] for "
"possible values."
msgstr ""
-#: doc/classes/GeometryInstance3D.xml:47
+#: doc/classes/GeometryInstance3D.xml:65
msgid ""
"The extra distance added to the GeometryInstance3D's bounding box ([AABB]) "
"to increase its cull box."
msgstr ""
-#: doc/classes/GeometryInstance3D.xml:50
+#: doc/classes/GeometryInstance3D.xml:68
msgid ""
"The GeometryInstance3D's max LOD distance.\n"
"[b]Note:[/b] This property currently has no effect."
msgstr ""
-#: doc/classes/GeometryInstance3D.xml:54
+#: doc/classes/GeometryInstance3D.xml:72
msgid ""
"The GeometryInstance3D's max LOD margin.\n"
"[b]Note:[/b] This property currently has no effect."
msgstr ""
-#: doc/classes/GeometryInstance3D.xml:58
+#: doc/classes/GeometryInstance3D.xml:76
msgid ""
"The GeometryInstance3D's min LOD distance.\n"
"[b]Note:[/b] This property currently has no effect."
msgstr ""
-#: doc/classes/GeometryInstance3D.xml:62
+#: doc/classes/GeometryInstance3D.xml:80
msgid ""
"The GeometryInstance3D's min LOD margin.\n"
"[b]Note:[/b] This property currently has no effect."
msgstr ""
-#: doc/classes/GeometryInstance3D.xml:66
+#: doc/classes/GeometryInstance3D.xml:84
msgid ""
"The material override for the whole geometry.\n"
"If a material is assigned to this property, it will be used instead of any "
"material set in any material slot of the mesh."
msgstr ""
-#: doc/classes/GeometryInstance3D.xml:72
+#: doc/classes/GeometryInstance3D.xml:90
msgid ""
"If [code]true[/code], this GeometryInstance3D will be used when baking "
"lights using a [GIProbe]."
msgstr ""
-#: doc/classes/GeometryInstance3D.xml:77
+#: doc/classes/GeometryInstance3D.xml:95
msgid "Will not cast any shadows."
msgstr ""
-#: doc/classes/GeometryInstance3D.xml:80
+#: doc/classes/GeometryInstance3D.xml:98
msgid ""
"Will cast shadows from all visible faces in the GeometryInstance3D.\n"
"Will take culling into account, so faces not being rendered will not be "
"taken into account when shadow casting."
msgstr ""
-#: doc/classes/GeometryInstance3D.xml:84
+#: doc/classes/GeometryInstance3D.xml:102
msgid ""
"Will cast shadows from all visible faces in the GeometryInstance3D.\n"
"Will not take culling into account, so all faces will be taken into account "
"when shadow casting."
msgstr ""
-#: doc/classes/GeometryInstance3D.xml:88
+#: doc/classes/GeometryInstance3D.xml:106
msgid ""
"Will only show the shadows casted from this object.\n"
"In other words, the actual mesh will not be visible, only the shadows casted "
"from the mesh will be."
msgstr ""
-#: doc/classes/GeometryInstance3D.xml:92
+#: doc/classes/GeometryInstance3D.xml:110
msgid ""
"Will allow the GeometryInstance3D to be used when baking lights using a "
"[GIProbe]."
msgstr ""
-#: doc/classes/GeometryInstance3D.xml:97
+#: doc/classes/GeometryInstance3D.xml:115
msgid ""
"Unused in this class, exposed for consistency with [enum RenderingServer."
"InstanceFlags]."
@@ -22235,7 +22051,7 @@ msgid ""
msgstr ""
#: doc/classes/GraphEdit.xml:243
-msgid "Emitted when the user presses [code]Ctrl + C[/code]."
+msgid "Emitted when the user presses [kbd]Ctrl + C[/kbd]."
msgstr ""
#: doc/classes/GraphEdit.xml:248
@@ -22258,65 +22074,65 @@ msgstr ""
msgid "Emitted when a GraphNode is selected."
msgstr ""
-#: doc/classes/GraphEdit.xml:278
-msgid "Emitted when the user presses [code]Ctrl + V[/code]."
+#: doc/classes/GraphEdit.xml:284
+msgid "Emitted when the user presses [kbd]Ctrl + V[/kbd]."
msgstr ""
-#: doc/classes/GraphEdit.xml:285
+#: doc/classes/GraphEdit.xml:291
msgid ""
"Emitted when a popup is requested. Happens on right-clicking in the "
"GraphEdit. [code]position[/code] is the position of the mouse pointer when "
"the signal is sent."
msgstr ""
-#: doc/classes/GraphEdit.xml:292
+#: doc/classes/GraphEdit.xml:298
msgid ""
"Emitted when the scroll offset is changed by the user. It will not be "
"emitted when changed in code."
msgstr ""
-#: doc/classes/GraphEdit.xml:306
+#: doc/classes/GraphEdit.xml:312
msgid "The background drawn under the grid."
msgstr ""
-#: doc/classes/GraphEdit.xml:309
+#: doc/classes/GraphEdit.xml:315
msgid "Color of major grid lines."
msgstr ""
-#: doc/classes/GraphEdit.xml:312
+#: doc/classes/GraphEdit.xml:318
msgid "Color of minor grid lines."
msgstr ""
-#: doc/classes/GraphEdit.xml:315
+#: doc/classes/GraphEdit.xml:321
msgid "The icon for the zoom out button."
msgstr ""
-#: doc/classes/GraphEdit.xml:318
+#: doc/classes/GraphEdit.xml:324
msgid "The icon for the zoom in button."
msgstr ""
-#: doc/classes/GraphEdit.xml:321
+#: doc/classes/GraphEdit.xml:327
msgid ""
"The horizontal range within which a port can be grabbed (on both sides)."
msgstr ""
-#: doc/classes/GraphEdit.xml:324
+#: doc/classes/GraphEdit.xml:330
msgid "The vertical range within which a port can be grabbed (on both sides)."
msgstr ""
-#: doc/classes/GraphEdit.xml:327
+#: doc/classes/GraphEdit.xml:333
msgid "The icon for the zoom reset button."
msgstr ""
-#: doc/classes/GraphEdit.xml:330
+#: doc/classes/GraphEdit.xml:336
msgid "The fill color of the selection rectangle."
msgstr ""
-#: doc/classes/GraphEdit.xml:333
+#: doc/classes/GraphEdit.xml:339
msgid "The outline color of the selection rectangle."
msgstr ""
-#: doc/classes/GraphEdit.xml:336
+#: doc/classes/GraphEdit.xml:342
msgid "The icon for the snap toggle button."
msgstr ""
@@ -23049,21 +22865,21 @@ msgstr ""
msgid "The background of the area to the left of the grabber."
msgstr ""
-#: doc/classes/HSlider.xml:23 doc/classes/VSlider.xml:27
+#: doc/classes/HSlider.xml:25 doc/classes/VSlider.xml:29
msgid "The texture for the grabber when it's disabled."
msgstr ""
-#: doc/classes/HSlider.xml:26 doc/classes/VSlider.xml:30
+#: doc/classes/HSlider.xml:28 doc/classes/VSlider.xml:32
msgid "The texture for the grabber when it's focused."
msgstr ""
-#: doc/classes/HSlider.xml:29
+#: doc/classes/HSlider.xml:31
msgid ""
"The background for the whole slider. Determines the height of the "
"[code]grabber_area[/code]."
msgstr ""
-#: doc/classes/HSlider.xml:32 doc/classes/VSlider.xml:36
+#: doc/classes/HSlider.xml:34 doc/classes/VSlider.xml:38
msgid ""
"The texture for the ticks, visible when [member Slider.tick_count] is "
"greater than 0."
@@ -24006,16 +23822,19 @@ msgstr ""
msgid ""
"Native image datatype. Contains image data, which can be converted to a "
"[Texture2D], and several functions to interact with it. The maximum width "
-"and height for an [Image] are [constant MAX_WIDTH] and [constant MAX_HEIGHT]."
+"and height for an [Image] are [constant MAX_WIDTH] and [constant "
+"MAX_HEIGHT].\n"
+"[b]Note:[/b] The maximum image size is 16384×16384 pixels due to graphics "
+"hardware limitations. Larger images will fail to import."
msgstr ""
-#: doc/classes/Image.xml:22
+#: doc/classes/Image.xml:23
msgid ""
"Alpha-blends [code]src_rect[/code] from [code]src[/code] image to this image "
"at coordinates [code]dest[/code]."
msgstr ""
-#: doc/classes/Image.xml:37
+#: doc/classes/Image.xml:38
msgid ""
"Alpha-blends [code]src_rect[/code] from [code]src[/code] image to this image "
"using [code]mask[/code] image at coordinates [code]dst[/code]. Alpha "
@@ -24026,13 +23845,13 @@ msgid ""
"but they can have different formats."
msgstr ""
-#: doc/classes/Image.xml:50
+#: doc/classes/Image.xml:51
msgid ""
"Copies [code]src_rect[/code] from [code]src[/code] image to this image at "
"coordinates [code]dst[/code]."
msgstr ""
-#: doc/classes/Image.xml:65
+#: doc/classes/Image.xml:66
msgid ""
"Blits [code]src_rect[/code] area from [code]src[/code] image to this image "
"at the coordinates given by [code]dst[/code]. [code]src[/code] pixel is "
@@ -24042,17 +23861,17 @@ msgid ""
"different formats."
msgstr ""
-#: doc/classes/Image.xml:74
+#: doc/classes/Image.xml:75
msgid ""
"Converts a bumpmap to a normalmap. A bumpmap provides a height offset per-"
"pixel, while a normalmap provides a normal direction per pixel."
msgstr ""
-#: doc/classes/Image.xml:81
+#: doc/classes/Image.xml:82
msgid "Removes the image's mipmaps."
msgstr ""
-#: doc/classes/Image.xml:94
+#: doc/classes/Image.xml:95
msgid ""
"Compresses the image to use less memory. Can not directly access pixel data "
"while the image is compressed. Returns error if the chosen compression mode "
@@ -24060,22 +23879,22 @@ msgid ""
"constants."
msgstr ""
-#: doc/classes/Image.xml:115
+#: doc/classes/Image.xml:116
msgid "Converts the image's format. See [enum Format] constants."
msgstr ""
-#: doc/classes/Image.xml:124
+#: doc/classes/Image.xml:125
msgid "Copies [code]src[/code] image to this image."
msgstr ""
-#: doc/classes/Image.xml:139
+#: doc/classes/Image.xml:140
msgid ""
"Creates an empty image of given size and format. See [enum Format] "
"constants. If [code]use_mipmaps[/code] is [code]true[/code] then generate "
"mipmaps for this image. See the [method generate_mipmaps]."
msgstr ""
-#: doc/classes/Image.xml:156
+#: doc/classes/Image.xml:157
msgid ""
"Creates a new image of given size and format. See [enum Format] constants. "
"Fills the image with the given raw data. If [code]use_mipmaps[/code] is "
@@ -24083,49 +23902,49 @@ msgid ""
"generate_mipmaps]."
msgstr ""
-#: doc/classes/Image.xml:167
+#: doc/classes/Image.xml:168
msgid ""
"Crops the image to the given [code]width[/code] and [code]height[/code]. If "
"the specified size is larger than the current size, the extra area is filled "
"with black pixels."
msgstr ""
-#: doc/classes/Image.xml:174
+#: doc/classes/Image.xml:175
msgid ""
"Decompresses the image if it is compressed. Returns an error if decompress "
"function is not available."
msgstr ""
-#: doc/classes/Image.xml:181
+#: doc/classes/Image.xml:182
msgid ""
"Returns [constant ALPHA_BLEND] if the image has data for alpha values. "
"Returns [constant ALPHA_BIT] if all the alpha values are stored in a single "
"bit. Returns [constant ALPHA_NONE] if no data for alpha values is found."
msgstr ""
-#: doc/classes/Image.xml:196
+#: doc/classes/Image.xml:197
msgid ""
"Stretches the image and enlarges it by a factor of 2. No interpolation is "
"done."
msgstr ""
-#: doc/classes/Image.xml:205
+#: doc/classes/Image.xml:206
msgid "Fills the image with a given [Color]."
msgstr ""
-#: doc/classes/Image.xml:212
+#: doc/classes/Image.xml:213
msgid "Blends low-alpha pixels with nearby pixels."
msgstr ""
-#: doc/classes/Image.xml:219
+#: doc/classes/Image.xml:220
msgid "Flips the image horizontally."
msgstr ""
-#: doc/classes/Image.xml:226
+#: doc/classes/Image.xml:227
msgid "Flips the image vertically."
msgstr ""
-#: doc/classes/Image.xml:235
+#: doc/classes/Image.xml:236
msgid ""
"Generates mipmaps for the image. Mipmaps are pre-calculated and lower "
"resolution copies of the image. Mipmaps are automatically used if the image "
@@ -24134,125 +23953,129 @@ msgid ""
"in a custom format or if the image's width/height is 0."
msgstr ""
-#: doc/classes/Image.xml:242
+#: doc/classes/Image.xml:243
msgid "Returns the image's raw data."
msgstr ""
-#: doc/classes/Image.xml:249
+#: doc/classes/Image.xml:250
msgid "Returns the image's format. See [enum Format] constants."
msgstr ""
-#: doc/classes/Image.xml:256
+#: doc/classes/Image.xml:257
msgid "Returns the image's height."
msgstr ""
-#: doc/classes/Image.xml:265
+#: doc/classes/Image.xml:266
msgid ""
"Returns the offset where the image's mipmap with index [code]mipmap[/code] "
"is stored in the [code]data[/code] dictionary."
msgstr ""
-#: doc/classes/Image.xml:276
+#: doc/classes/Image.xml:277
msgid ""
"Returns the color of the pixel at [code](x, y)[/code]. This is the same as "
"[method get_pixelv], but with two integer arguments instead of a [Vector2] "
"argument."
msgstr ""
-#: doc/classes/Image.xml:285
+#: doc/classes/Image.xml:286
msgid ""
"Returns the color of the pixel at [code]src[/code]. This is the same as "
"[method get_pixel], but with a [Vector2] argument instead of two integer "
"arguments."
msgstr ""
-#: doc/classes/Image.xml:294
+#: doc/classes/Image.xml:295
msgid ""
"Returns a new image that is a copy of the image's area specified with "
"[code]rect[/code]."
msgstr ""
-#: doc/classes/Image.xml:301
+#: doc/classes/Image.xml:302
msgid "Returns the image's size (width and height)."
msgstr ""
-#: doc/classes/Image.xml:308
+#: doc/classes/Image.xml:309
msgid ""
"Returns a [Rect2] enclosing the visible portion of the image, considering "
"each pixel with a non-zero alpha channel as visible."
msgstr ""
-#: doc/classes/Image.xml:315
+#: doc/classes/Image.xml:316
msgid "Returns the image's width."
msgstr ""
-#: doc/classes/Image.xml:322
+#: doc/classes/Image.xml:323
msgid "Returns [code]true[/code] if the image has generated mipmaps."
msgstr ""
-#: doc/classes/Image.xml:329
+#: doc/classes/Image.xml:330
msgid "Returns [code]true[/code] if the image is compressed."
msgstr ""
-#: doc/classes/Image.xml:336
+#: doc/classes/Image.xml:337
msgid "Returns [code]true[/code] if the image has no data."
msgstr ""
-#: doc/classes/Image.xml:343
+#: doc/classes/Image.xml:344
msgid ""
"Returns [code]true[/code] if all the image's pixels have an alpha value of "
"0. Returns [code]false[/code] if any pixel has an alpha value higher than 0."
msgstr ""
-#: doc/classes/Image.xml:352
-msgid "Loads an image from file [code]path[/code]."
+#: doc/classes/Image.xml:353
+msgid ""
+"Loads an image from file [code]path[/code]. See [url=https://docs."
+"godotengine.org/en/latest/getting_started/workflow/assets/importing_images."
+"html#supported-image-formats]Supported image formats[/url] for a list of "
+"supported image formats and limitations."
msgstr ""
-#: doc/classes/Image.xml:361
+#: doc/classes/Image.xml:362
msgid "Loads an image from the binary contents of a JPEG file."
msgstr ""
-#: doc/classes/Image.xml:370
+#: doc/classes/Image.xml:371
msgid "Loads an image from the binary contents of a PNG file."
msgstr ""
-#: doc/classes/Image.xml:379
+#: doc/classes/Image.xml:380
msgid "Loads an image from the binary contents of a WebP file."
msgstr ""
-#: doc/classes/Image.xml:386
+#: doc/classes/Image.xml:387
msgid ""
"Converts the image's data to represent coordinates on a 3D plane. This is "
"used when the image represents a normalmap. A normalmap can add lots of "
"detail to a 3D surface without increasing the polygon count."
msgstr ""
-#: doc/classes/Image.xml:393
+#: doc/classes/Image.xml:394
msgid ""
"Multiplies color values with alpha values. Resulting color values for a "
"pixel are [code](color * alpha)/256[/code]."
msgstr ""
-#: doc/classes/Image.xml:406
+#: doc/classes/Image.xml:407
msgid ""
"Resizes the image to the given [code]width[/code] and [code]height[/code]. "
"New pixels are calculated using [code]interpolation[/code]. See "
"[code]interpolation[/code] constants."
msgstr ""
-#: doc/classes/Image.xml:415
+#: doc/classes/Image.xml:416
msgid ""
"Resizes the image to the nearest power of 2 for the width and height. If "
"[code]square[/code] is [code]true[/code] then set width and height to be the "
"same."
msgstr ""
-#: doc/classes/Image.xml:422
+#: doc/classes/Image.xml:423
msgid ""
"Converts a standard RGBE (Red Green Blue Exponent) image to an sRGB image."
msgstr ""
-#: doc/classes/Image.xml:433
+#: doc/classes/Image.xml:434
msgid ""
"Saves the image as an EXR file to [code]path[/code]. If [code]grayscale[/"
"code] is [code]true[/code] and the image has only one channel, it will be "
@@ -24261,11 +24084,11 @@ msgid ""
"TinyEXR module."
msgstr ""
-#: doc/classes/Image.xml:442
+#: doc/classes/Image.xml:443
msgid "Saves the image as a PNG file to [code]path[/code]."
msgstr ""
-#: doc/classes/Image.xml:455
+#: doc/classes/Image.xml:456
msgid ""
"Sets the [Color] of the pixel at [code](x, y)[/code]. Example:\n"
"[codeblock]\n"
@@ -24275,7 +24098,7 @@ msgid ""
"[/codeblock]"
msgstr ""
-#: doc/classes/Image.xml:471
+#: doc/classes/Image.xml:472
msgid ""
"Sets the [Color] of the pixel at [code](dst.x, dst.y)[/code]. Note that the "
"[code]dst[/code] values must be integers. Example:\n"
@@ -24286,51 +24109,51 @@ msgid ""
"[/codeblock]"
msgstr ""
-#: doc/classes/Image.xml:483
+#: doc/classes/Image.xml:484
msgid "Shrinks the image by a factor of 2."
msgstr ""
-#: doc/classes/Image.xml:490
+#: doc/classes/Image.xml:491
msgid "Converts the raw data from the sRGB colorspace to a linear scale."
msgstr ""
-#: doc/classes/Image.xml:496
+#: doc/classes/Image.xml:497
msgid ""
"Holds all of the image's color data in a given format. See [enum Format] "
"constants."
msgstr ""
-#: doc/classes/Image.xml:501
+#: doc/classes/Image.xml:502
msgid "The maximal width allowed for [Image] resources."
msgstr ""
-#: doc/classes/Image.xml:504
+#: doc/classes/Image.xml:505
msgid "The maximal height allowed for [Image] resources."
msgstr ""
-#: doc/classes/Image.xml:507
+#: doc/classes/Image.xml:508
msgid "Texture format with a single 8-bit depth representing luminance."
msgstr ""
-#: doc/classes/Image.xml:510
+#: doc/classes/Image.xml:511
msgid ""
"OpenGL texture format with two values, luminance and alpha each stored with "
"8 bits."
msgstr ""
-#: doc/classes/Image.xml:513
+#: doc/classes/Image.xml:514
msgid ""
"OpenGL texture format [code]RED[/code] with a single component and a "
"bitdepth of 8."
msgstr ""
-#: doc/classes/Image.xml:516
+#: doc/classes/Image.xml:517
msgid ""
"OpenGL texture format [code]RG[/code] with two components and a bitdepth of "
"8 for each."
msgstr ""
-#: doc/classes/Image.xml:519
+#: doc/classes/Image.xml:520
msgid ""
"OpenGL texture format [code]RGB[/code] with three components, each with a "
"bitdepth of 8.\n"
@@ -24338,7 +24161,7 @@ msgid ""
"conversion is performed."
msgstr ""
-#: doc/classes/Image.xml:523
+#: doc/classes/Image.xml:524
msgid ""
"OpenGL texture format [code]RGBA[/code] with four components, each with a "
"bitdepth of 8.\n"
@@ -24346,67 +24169,67 @@ msgid ""
"conversion is performed."
msgstr ""
-#: doc/classes/Image.xml:527
+#: doc/classes/Image.xml:528
msgid ""
"OpenGL texture format [code]RGBA[/code] with four components, each with a "
"bitdepth of 4."
msgstr ""
-#: doc/classes/Image.xml:532
+#: doc/classes/Image.xml:533
msgid ""
"OpenGL texture format [code]GL_R32F[/code] where there's one component, a 32-"
"bit floating-point value."
msgstr ""
-#: doc/classes/Image.xml:535
+#: doc/classes/Image.xml:536
msgid ""
"OpenGL texture format [code]GL_RG32F[/code] where there are two components, "
"each a 32-bit floating-point values."
msgstr ""
-#: doc/classes/Image.xml:538
+#: doc/classes/Image.xml:539
msgid ""
"OpenGL texture format [code]GL_RGB32F[/code] where there are three "
"components, each a 32-bit floating-point values."
msgstr ""
-#: doc/classes/Image.xml:541
+#: doc/classes/Image.xml:542
msgid ""
"OpenGL texture format [code]GL_RGBA32F[/code] where there are four "
"components, each a 32-bit floating-point values."
msgstr ""
-#: doc/classes/Image.xml:544
+#: doc/classes/Image.xml:545
msgid ""
"OpenGL texture format [code]GL_R32F[/code] where there's one component, a 16-"
"bit \"half-precision\" floating-point value."
msgstr ""
-#: doc/classes/Image.xml:547
+#: doc/classes/Image.xml:548
msgid ""
"OpenGL texture format [code]GL_RG32F[/code] where there are two components, "
"each a 16-bit \"half-precision\" floating-point value."
msgstr ""
-#: doc/classes/Image.xml:550
+#: doc/classes/Image.xml:551
msgid ""
"OpenGL texture format [code]GL_RGB32F[/code] where there are three "
"components, each a 16-bit \"half-precision\" floating-point value."
msgstr ""
-#: doc/classes/Image.xml:553
+#: doc/classes/Image.xml:554
msgid ""
"OpenGL texture format [code]GL_RGBA32F[/code] where there are four "
"components, each a 16-bit \"half-precision\" floating-point value."
msgstr ""
-#: doc/classes/Image.xml:556
+#: doc/classes/Image.xml:557
msgid ""
"A special OpenGL texture format where the three color components have 9 bits "
"of precision and all three share a single 5-bit exponent."
msgstr ""
-#: doc/classes/Image.xml:559
+#: doc/classes/Image.xml:560
msgid ""
"The [url=https://en.wikipedia.org/wiki/S3_Texture_Compression]S3TC[/url] "
"texture format that uses Block Compression 1, and is the smallest variation "
@@ -24416,7 +24239,7 @@ msgid ""
"conversion is performed."
msgstr ""
-#: doc/classes/Image.xml:563
+#: doc/classes/Image.xml:564
msgid ""
"The [url=https://en.wikipedia.org/wiki/S3_Texture_Compression]S3TC[/url] "
"texture format that uses Block Compression 2, and color data is interpreted "
@@ -24426,7 +24249,7 @@ msgid ""
"conversion is performed."
msgstr ""
-#: doc/classes/Image.xml:567
+#: doc/classes/Image.xml:568
msgid ""
"The [url=https://en.wikipedia.org/wiki/S3_Texture_Compression]S3TC[/url] "
"texture format also known as Block Compression 3 or BC3 that contains 64 "
@@ -24437,7 +24260,7 @@ msgid ""
"conversion is performed."
msgstr ""
-#: doc/classes/Image.xml:571
+#: doc/classes/Image.xml:572
msgid ""
"Texture format that uses [url=https://www.khronos.org/opengl/wiki/"
"Red_Green_Texture_Compression]Red Green Texture Compression[/url], "
@@ -24445,7 +24268,7 @@ msgid ""
"DXT5 uses for the alpha channel."
msgstr ""
-#: doc/classes/Image.xml:574
+#: doc/classes/Image.xml:575
msgid ""
"Texture format that uses [url=https://www.khronos.org/opengl/wiki/"
"Red_Green_Texture_Compression]Red Green Texture Compression[/url], "
@@ -24453,7 +24276,7 @@ msgid ""
"algorithm that DXT5 uses for the alpha channel."
msgstr ""
-#: doc/classes/Image.xml:577
+#: doc/classes/Image.xml:578
msgid ""
"Texture format that uses [url=https://www.khronos.org/opengl/wiki/"
"BPTC_Texture_Compression]BPTC[/url] compression with unsigned normalized "
@@ -24462,21 +24285,21 @@ msgid ""
"conversion is performed."
msgstr ""
-#: doc/classes/Image.xml:581
+#: doc/classes/Image.xml:582
msgid ""
"Texture format that uses [url=https://www.khronos.org/opengl/wiki/"
"BPTC_Texture_Compression]BPTC[/url] compression with signed floating-point "
"RGB components."
msgstr ""
-#: doc/classes/Image.xml:584
+#: doc/classes/Image.xml:585
msgid ""
"Texture format that uses [url=https://www.khronos.org/opengl/wiki/"
"BPTC_Texture_Compression]BPTC[/url] compression with unsigned floating-point "
"RGB components."
msgstr ""
-#: doc/classes/Image.xml:587
+#: doc/classes/Image.xml:588
msgid ""
"Texture format used on PowerVR-supported mobile platforms, uses 2-bit color "
"depth with no alpha. More information can be found [url=https://en.wikipedia."
@@ -24485,25 +24308,25 @@ msgid ""
"conversion is performed."
msgstr ""
-#: doc/classes/Image.xml:591
+#: doc/classes/Image.xml:592
msgid ""
"Same as [url=https://en.wikipedia.org/wiki/PVRTC]PVRTC2[/url], but with an "
"alpha component."
msgstr ""
-#: doc/classes/Image.xml:594
+#: doc/classes/Image.xml:595
msgid ""
"Similar to [url=https://en.wikipedia.org/wiki/PVRTC]PVRTC2[/url], but with 4-"
"bit color depth and no alpha."
msgstr ""
-#: doc/classes/Image.xml:597
+#: doc/classes/Image.xml:598
msgid ""
"Same as [url=https://en.wikipedia.org/wiki/PVRTC]PVRTC4[/url], but with an "
"alpha component."
msgstr ""
-#: doc/classes/Image.xml:600
+#: doc/classes/Image.xml:601
msgid ""
"[url=https://en.wikipedia.org/wiki/"
"Ericsson_Texture_Compression#ETC1]Ericsson Texture Compression format 1[/"
@@ -24511,7 +24334,7 @@ msgid ""
"standard. This format cannot store an alpha channel."
msgstr ""
-#: doc/classes/Image.xml:603
+#: doc/classes/Image.xml:604
msgid ""
"[url=https://en.wikipedia.org/wiki/"
"Ericsson_Texture_Compression#ETC2_and_EAC]Ericsson Texture Compression "
@@ -24519,7 +24342,7 @@ msgid ""
"unsigned data."
msgstr ""
-#: doc/classes/Image.xml:606
+#: doc/classes/Image.xml:607
msgid ""
"[url=https://en.wikipedia.org/wiki/"
"Ericsson_Texture_Compression#ETC2_and_EAC]Ericsson Texture Compression "
@@ -24527,7 +24350,7 @@ msgid ""
"channel of signed data."
msgstr ""
-#: doc/classes/Image.xml:609
+#: doc/classes/Image.xml:610
msgid ""
"[url=https://en.wikipedia.org/wiki/"
"Ericsson_Texture_Compression#ETC2_and_EAC]Ericsson Texture Compression "
@@ -24535,7 +24358,7 @@ msgid ""
"of unsigned data."
msgstr ""
-#: doc/classes/Image.xml:612
+#: doc/classes/Image.xml:613
msgid ""
"[url=https://en.wikipedia.org/wiki/"
"Ericsson_Texture_Compression#ETC2_and_EAC]Ericsson Texture Compression "
@@ -24543,7 +24366,7 @@ msgid ""
"channels of signed data."
msgstr ""
-#: doc/classes/Image.xml:615
+#: doc/classes/Image.xml:616
msgid ""
"[url=https://en.wikipedia.org/wiki/"
"Ericsson_Texture_Compression#ETC2_and_EAC]Ericsson Texture Compression "
@@ -24553,7 +24376,7 @@ msgid ""
"conversion is performed."
msgstr ""
-#: doc/classes/Image.xml:619
+#: doc/classes/Image.xml:620
msgid ""
"[url=https://en.wikipedia.org/wiki/"
"Ericsson_Texture_Compression#ETC2_and_EAC]Ericsson Texture Compression "
@@ -24563,7 +24386,7 @@ msgid ""
"conversion is performed."
msgstr ""
-#: doc/classes/Image.xml:623
+#: doc/classes/Image.xml:624
msgid ""
"[url=https://en.wikipedia.org/wiki/"
"Ericsson_Texture_Compression#ETC2_and_EAC]Ericsson Texture Compression "
@@ -24574,31 +24397,31 @@ msgid ""
"conversion is performed."
msgstr ""
-#: doc/classes/Image.xml:631
+#: doc/classes/Image.xml:632
msgid "Represents the size of the [enum Format] enum."
msgstr ""
-#: doc/classes/Image.xml:634
+#: doc/classes/Image.xml:635
msgid ""
"Performs nearest-neighbor interpolation. If the image is resized, it will be "
"pixelated."
msgstr ""
-#: doc/classes/Image.xml:637
+#: doc/classes/Image.xml:638
msgid ""
"Performs bilinear interpolation. If the image is resized, it will be blurry. "
"This mode is faster than [constant INTERPOLATE_CUBIC], but it results in "
"lower quality."
msgstr ""
-#: doc/classes/Image.xml:640
+#: doc/classes/Image.xml:641
msgid ""
"Performs cubic interpolation. If the image is resized, it will be blurry. "
"This mode often gives better results compared to [constant "
"INTERPOLATE_BILINEAR], at the cost of being slower."
msgstr ""
-#: doc/classes/Image.xml:643
+#: doc/classes/Image.xml:644
msgid ""
"Performs bilinear separately on the two most-suited mipmap levels, then "
"linearly interpolates between them.\n"
@@ -24613,55 +24436,55 @@ msgid ""
"a new set will be generated for the resulting image."
msgstr ""
-#: doc/classes/Image.xml:650
+#: doc/classes/Image.xml:651
msgid ""
"Performs Lanczos interpolation. This is the slowest image resizing mode, but "
"it typically gives the best results, especially when downscalng images."
msgstr ""
-#: doc/classes/Image.xml:653
+#: doc/classes/Image.xml:654
msgid "Image does not have alpha."
msgstr ""
-#: doc/classes/Image.xml:656
+#: doc/classes/Image.xml:657
msgid "Image stores alpha in a single bit."
msgstr ""
-#: doc/classes/Image.xml:659
+#: doc/classes/Image.xml:660
msgid "Image uses alpha."
msgstr ""
-#: doc/classes/Image.xml:662
+#: doc/classes/Image.xml:663
msgid "Use S3TC compression."
msgstr ""
-#: doc/classes/Image.xml:665
+#: doc/classes/Image.xml:666
msgid "Use PVRTC2 compression."
msgstr ""
-#: doc/classes/Image.xml:668
+#: doc/classes/Image.xml:669
msgid "Use PVRTC4 compression."
msgstr ""
-#: doc/classes/Image.xml:671
+#: doc/classes/Image.xml:672
msgid "Use ETC compression."
msgstr ""
-#: doc/classes/Image.xml:674
+#: doc/classes/Image.xml:675
msgid "Use ETC2 compression."
msgstr ""
-#: doc/classes/Image.xml:689
+#: doc/classes/Image.xml:690
msgid ""
"Source texture (before compression) is a regular texture. Default for all "
"textures."
msgstr ""
-#: doc/classes/Image.xml:692
+#: doc/classes/Image.xml:693
msgid "Source texture (before compression) is in sRGB space."
msgstr ""
-#: doc/classes/Image.xml:695
+#: doc/classes/Image.xml:696
msgid ""
"Source texture (before compression) is a normal texture (e.g. it can be "
"compressed into two channels)."
@@ -24674,22 +24497,24 @@ msgstr ""
#: doc/classes/ImageTexture.xml:7
msgid ""
"A [Texture2D] based on an [Image]. Can be created from an [Image] with "
-"[method create_from_image]."
+"[method create_from_image].\n"
+"[b]Note:[/b] The maximum image size is 16384×16384 pixels due to graphics "
+"hardware limitations. Larger images will fail to import."
msgstr ""
-#: doc/classes/ImageTexture.xml:18
+#: doc/classes/ImageTexture.xml:19
msgid "Create a new [ImageTexture] from an [Image]."
msgstr ""
-#: doc/classes/ImageTexture.xml:25
+#: doc/classes/ImageTexture.xml:26
msgid "Returns the format of the [ImageTexture], one of [enum Image.Format]."
msgstr ""
-#: doc/classes/ImageTexture.xml:34
+#: doc/classes/ImageTexture.xml:35
msgid "Resizes the [ImageTexture] to the specified dimensions."
msgstr ""
-#: doc/classes/ImageTexture.xml:45
+#: doc/classes/ImageTexture.xml:46
msgid ""
"Replaces the texture's data with a new [code]image[/code]. If "
"[code]immediate[/code] is [code]true[/code], it will take effect immediately "
@@ -24702,20 +24527,29 @@ msgstr ""
#: doc/classes/ImmediateGeometry3D.xml:7
msgid ""
-"Draws simple geometry from code. Uses a drawing mode similar to OpenGL 1.x."
+"Draws simple geometry from code. Uses a drawing mode similar to OpenGL 1.x.\n"
+"See also [ArrayMesh], [MeshDataTool] and [SurfaceTool] for procedural "
+"geometry generation.\n"
+"[b]Note:[/b] ImmediateGeometry3D is best suited to small amounts of mesh "
+"data that change every frame. It will be slow when handling large amounts of "
+"mesh data. If mesh data doesn't change often, use [ArrayMesh], "
+"[MeshDataTool] or [SurfaceTool] instead.\n"
+"[b]Note:[/b] Godot uses clockwise [url=https://learnopengl.com/Advanced-"
+"OpenGL/Face-culling]winding order[/url] for front faces of triangle "
+"primitive modes."
msgstr ""
-#: doc/classes/ImmediateGeometry3D.xml:24
+#: doc/classes/ImmediateGeometry3D.xml:27
msgid ""
"Simple helper to draw an UV sphere with given latitude, longitude and radius."
msgstr ""
-#: doc/classes/ImmediateGeometry3D.xml:33
+#: doc/classes/ImmediateGeometry3D.xml:36
msgid ""
"Adds a vertex in local coordinate space with the currently set color/uv/etc."
msgstr ""
-#: doc/classes/ImmediateGeometry3D.xml:44
+#: doc/classes/ImmediateGeometry3D.xml:47
msgid ""
"Begin drawing (and optionally pass a texture override). When done call "
"[method end]. For more information on how this works, search for "
@@ -24723,34 +24557,454 @@ msgid ""
"For the type of primitive, see the [enum Mesh.PrimitiveType] enum."
msgstr ""
-#: doc/classes/ImmediateGeometry3D.xml:52
+#: doc/classes/ImmediateGeometry3D.xml:55
msgid "Clears everything that was drawn using begin/end."
msgstr ""
-#: doc/classes/ImmediateGeometry3D.xml:59
+#: doc/classes/ImmediateGeometry3D.xml:62
msgid "Ends a drawing context and displays the results."
msgstr ""
-#: doc/classes/ImmediateGeometry3D.xml:68
+#: doc/classes/ImmediateGeometry3D.xml:71
msgid "The current drawing color."
msgstr ""
-#: doc/classes/ImmediateGeometry3D.xml:77
+#: doc/classes/ImmediateGeometry3D.xml:80
msgid "The next vertex's normal."
msgstr ""
-#: doc/classes/ImmediateGeometry3D.xml:86
+#: doc/classes/ImmediateGeometry3D.xml:89
msgid "The next vertex's tangent (and binormal facing)."
msgstr ""
-#: doc/classes/ImmediateGeometry3D.xml:95
+#: doc/classes/ImmediateGeometry3D.xml:98
msgid "The next vertex's UV."
msgstr ""
-#: doc/classes/ImmediateGeometry3D.xml:104
+#: doc/classes/ImmediateGeometry3D.xml:107
msgid "The next vertex's second layer UV."
msgstr ""
+#: doc/classes/Input.xml:4
+msgid "A singleton that deals with inputs."
+msgstr ""
+
+#: doc/classes/Input.xml:7
+msgid ""
+"A singleton that deals with inputs. This includes key presses, mouse buttons "
+"and movement, joypads, and input actions. Actions and their events can be "
+"set in the [b]Input Map[/b] tab in the [b]Project > Project Settings[/b], or "
+"with the [InputMap] class."
+msgstr ""
+
+#: doc/classes/Input.xml:10
+msgid "https://docs.godotengine.org/en/latest/tutorials/inputs/index.html"
+msgstr ""
+
+#: doc/classes/Input.xml:21
+msgid ""
+"This will simulate pressing the specified action.\n"
+"The strength can be used for non-boolean actions, it's ranged between 0 and "
+"1 representing the intensity of the given action.\n"
+"[b]Note:[/b] This method will not cause any [method Node._input] calls. It "
+"is intended to be used with [method is_action_pressed] and [method "
+"is_action_just_pressed]. If you want to simulate [code]_input[/code], use "
+"[method parse_input_event] instead."
+msgstr ""
+
+#: doc/classes/Input.xml:32
+msgid "If the specified action is already pressed, this will release it."
+msgstr ""
+
+#: doc/classes/Input.xml:43
+msgid ""
+"Adds a new mapping entry (in SDL2 format) to the mapping database. "
+"Optionally update already connected devices."
+msgstr ""
+
+#: doc/classes/Input.xml:50
+msgid ""
+"If the device has an accelerometer, this will return the acceleration. "
+"Otherwise, it returns an empty [Vector3].\n"
+"Note this method returns an empty [Vector3] when running from the editor "
+"even when your device has an accelerometer. You must export your project to "
+"a supported device to read values from the accelerometer."
+msgstr ""
+
+#: doc/classes/Input.xml:60
+msgid ""
+"Returns a value between 0 and 1 representing the intensity of the given "
+"action. In a joypad, for example, the further away the axis (analog sticks "
+"or L2, R2 triggers) is from the dead zone, the closer the value will be to "
+"1. If the action is mapped to a control that has no axis as the keyboard, "
+"the value returned will be 0 or 1."
+msgstr ""
+
+#: doc/classes/Input.xml:67
+msgid ""
+"Returns an [Array] containing the device IDs of all currently connected "
+"joypads."
+msgstr ""
+
+#: doc/classes/Input.xml:74
+msgid "Returns the currently assigned cursor shape (see [enum CursorShape])."
+msgstr ""
+
+#: doc/classes/Input.xml:81
+msgid ""
+"If the device has an accelerometer, this will return the gravity. Otherwise, "
+"it returns an empty [Vector3]."
+msgstr ""
+
+#: doc/classes/Input.xml:88
+msgid ""
+"If the device has a gyroscope, this will return the rate of rotation in rad/"
+"s around a device's X, Y, and Z axes. Otherwise, it returns an empty "
+"[Vector3]."
+msgstr ""
+
+#: doc/classes/Input.xml:99
+msgid ""
+"Returns the current value of the joypad axis at given index (see [enum "
+"JoystickList])."
+msgstr ""
+
+#: doc/classes/Input.xml:108
+msgid "Returns the index of the provided axis name."
+msgstr ""
+
+#: doc/classes/Input.xml:117
+msgid ""
+"Receives a [enum JoystickList] axis and returns its equivalent name as a "
+"string."
+msgstr ""
+
+#: doc/classes/Input.xml:126
+msgid "Returns the index of the provided button name."
+msgstr ""
+
+#: doc/classes/Input.xml:135
+msgid ""
+"Receives a gamepad button from [enum JoystickList] and returns its "
+"equivalent name as a string."
+msgstr ""
+
+#: doc/classes/Input.xml:144
+msgid ""
+"Returns a SDL2-compatible device GUID on platforms that use gamepad "
+"remapping. Returns [code]\"Default Gamepad\"[/code] otherwise."
+msgstr ""
+
+#: doc/classes/Input.xml:153
+msgid "Returns the name of the joypad at the specified device index."
+msgstr ""
+
+#: doc/classes/Input.xml:162
+msgid "Returns the duration of the current vibration effect in seconds."
+msgstr ""
+
+#: doc/classes/Input.xml:171
+msgid ""
+"Returns the strength of the joypad vibration: x is the strength of the weak "
+"motor, and y is the strength of the strong motor."
+msgstr ""
+
+#: doc/classes/Input.xml:178
+msgid ""
+"Returns the mouse speed for the last time the cursor was moved, and this "
+"until the next frame where the mouse moves. This means that even if the "
+"mouse is not moving, this function will still return the value of the last "
+"motion."
+msgstr ""
+
+#: doc/classes/Input.xml:185
+msgid ""
+"If the device has a magnetometer, this will return the magnetic field "
+"strength in micro-Tesla for all axes."
+msgstr ""
+
+#: doc/classes/Input.xml:192
+msgid ""
+"Returns mouse buttons as a bitmask. If multiple mouse buttons are pressed at "
+"the same time, the bits are added together."
+msgstr ""
+
+#: doc/classes/Input.xml:199
+msgid "Returns the mouse mode. See the constants for more information."
+msgstr ""
+
+#: doc/classes/Input.xml:208
+msgid ""
+"Returns [code]true[/code] when the user starts pressing the action event, "
+"meaning it's [code]true[/code] only on the frame that the user pressed down "
+"the button.\n"
+"This is useful for code that needs to run only once when an action is "
+"pressed, instead of every frame while it's pressed."
+msgstr ""
+
+#: doc/classes/Input.xml:218
+msgid ""
+"Returns [code]true[/code] when the user stops pressing the action event, "
+"meaning it's [code]true[/code] only on the frame that the user released the "
+"button."
+msgstr ""
+
+#: doc/classes/Input.xml:227
+msgid ""
+"Returns [code]true[/code] if you are pressing the action event. Note that if "
+"an action has multiple buttons assigned and more than one of them is "
+"pressed, releasing one button will release the action, even if some other "
+"button assigned to this action is still pressed."
+msgstr ""
+
+#: doc/classes/Input.xml:238
+msgid ""
+"Returns [code]true[/code] if you are pressing the joypad button (see [enum "
+"JoystickList])."
+msgstr ""
+
+#: doc/classes/Input.xml:247
+msgid ""
+"Returns [code]true[/code] if the system knows the specified device. This "
+"means that it sets all button and axis indices exactly as defined in [enum "
+"JoystickList]. Unknown joypads are not expected to match these constants, "
+"but you can still retrieve events from them."
+msgstr ""
+
+#: doc/classes/Input.xml:256
+msgid ""
+"Returns [code]true[/code] if you are pressing the key in the current "
+"keyboard layout. You can pass a [enum KeyList] constant."
+msgstr ""
+
+#: doc/classes/Input.xml:265
+msgid ""
+"Returns [code]true[/code] if you are pressing the mouse button specified "
+"with [enum ButtonList]."
+msgstr ""
+
+#: doc/classes/Input.xml:280
+msgid ""
+"Notifies the [Input] singleton that a connection has changed, to update the "
+"state for the [code]device[/code] index.\n"
+"This is used internally and should not have to be called from user scripts. "
+"See [signal joy_connection_changed] for the signal emitted when this is "
+"triggered internally."
+msgstr ""
+
+#: doc/classes/Input.xml:290
+msgid ""
+"Feeds an [InputEvent] to the game. Can be used to artificially trigger input "
+"events from code. Also generates [method Node._input] calls.\n"
+"Example:\n"
+"[codeblock]\n"
+"var a = InputEventAction.new()\n"
+"a.action = \"ui_cancel\"\n"
+"a.pressed = true\n"
+"Input.parse_input_event(a)\n"
+"[/codeblock]"
+msgstr ""
+
+#: doc/classes/Input.xml:306
+msgid ""
+"Removes all mappings from the internal database that match the given GUID."
+msgstr ""
+
+#: doc/classes/Input.xml:319
+msgid ""
+"Sets a custom mouse cursor image, which is only visible inside the game "
+"window. The hotspot can also be specified. Passing [code]null[/code] to the "
+"image parameter resets to the system cursor. See [enum CursorShape] for the "
+"list of shapes.\n"
+"[code]image[/code]'s size must be lower than 256×256.\n"
+"[code]hotspot[/code] must be within [code]image[/code]'s size.\n"
+"[b]Note:[/b] [AnimatedTexture]s aren't supported as custom mouse cursors. If "
+"using an [AnimatedTexture], only the first frame will be displayed.\n"
+"[b]Note:[/b] Only images imported with the [b]Lossless[/b], [b]Lossy[/b] or "
+"[b]Uncompressed[/b] compression modes are supported. The [b]Video RAM[/b] "
+"compression mode can't be used for custom cursors."
+msgstr ""
+
+#: doc/classes/Input.xml:332
+msgid ""
+"Sets the default cursor shape to be used in the viewport instead of "
+"[constant CURSOR_ARROW].\n"
+"[b]Note:[/b] If you want to change the default cursor shape for [Control]'s "
+"nodes, use [member Control.mouse_default_cursor_shape] instead.\n"
+"[b]Note:[/b] This method generates an [InputEventMouseMotion] to update "
+"cursor immediately."
+msgstr ""
+
+#: doc/classes/Input.xml:343
+msgid "Sets the mouse mode. See the constants for more information."
+msgstr ""
+
+#: doc/classes/Input.xml:352
+msgid ""
+"Enables or disables the accumulation of similar input events sent by the "
+"operating system. When input accumulation is enabled, all input events "
+"generated during a frame will be merged and emitted when the frame is done "
+"rendering. Therefore, this limits the number of input method calls per "
+"second to the rendering FPS.\n"
+"Input accumulation is enabled by default. It can be disabled to get slightly "
+"more precise/reactive input at the cost of increased CPU usage. In "
+"applications where drawing freehand lines is required, input accumulation "
+"should generally be disabled while the user is drawing the line to get "
+"results that closely follow the actual input."
+msgstr ""
+
+#: doc/classes/Input.xml:368
+msgid ""
+"Starts to vibrate the joypad. Joypads usually come with two rumble motors, a "
+"strong and a weak one. [code]weak_magnitude[/code] is the strength of the "
+"weak motor (between 0 and 1) and [code]strong_magnitude[/code] is the "
+"strength of the strong motor (between 0 and 1). [code]duration[/code] is the "
+"duration of the effect in seconds (a duration of 0 will try to play the "
+"vibration indefinitely).\n"
+"[b]Note:[/b] Not every hardware is compatible with long effect durations; it "
+"is recommended to restart an effect if it has to be played for more than a "
+"few seconds."
+msgstr ""
+
+#: doc/classes/Input.xml:378
+msgid "Stops the vibration of the joypad."
+msgstr ""
+
+#: doc/classes/Input.xml:387
+msgid ""
+"Vibrate Android and iOS devices.\n"
+"[b]Note:[/b] It needs VIBRATE permission for Android at export settings. iOS "
+"does not support duration."
+msgstr ""
+
+#: doc/classes/Input.xml:397
+msgid "Sets the mouse position to the specified vector."
+msgstr ""
+
+#: doc/classes/Input.xml:408
+msgid "Emitted when a joypad device has been connected or disconnected."
+msgstr ""
+
+#: doc/classes/Input.xml:414
+msgid "Makes the mouse cursor visible if it is hidden."
+msgstr ""
+
+#: doc/classes/Input.xml:417
+msgid "Makes the mouse cursor hidden if it is visible."
+msgstr ""
+
+#: doc/classes/Input.xml:420
+msgid ""
+"Captures the mouse. The mouse will be hidden and unable to leave the game "
+"window, but it will still register movement and mouse button presses. On "
+"Windows and Linux, the mouse will use raw input mode, which means the "
+"reported movement will be unaffected by the OS' mouse acceleration settings."
+msgstr ""
+
+#: doc/classes/Input.xml:423
+msgid "Makes the mouse cursor visible but confines it to the game window."
+msgstr ""
+
+#: doc/classes/Input.xml:426
+msgid "Arrow cursor. Standard, default pointing cursor."
+msgstr ""
+
+#: doc/classes/Input.xml:429
+msgid ""
+"I-beam cursor. Usually used to show where the text cursor will appear when "
+"the mouse is clicked."
+msgstr ""
+
+#: doc/classes/Input.xml:432
+msgid ""
+"Pointing hand cursor. Usually used to indicate the pointer is over a link or "
+"other interactable item."
+msgstr ""
+
+#: doc/classes/Input.xml:435
+msgid ""
+"Cross cursor. Typically appears over regions in which a drawing operation "
+"can be performed or for selections."
+msgstr ""
+
+#: doc/classes/Input.xml:438
+msgid ""
+"Wait cursor. Indicates that the application is busy performing an operation. "
+"This cursor shape denotes that the application is still usable during the "
+"operation."
+msgstr ""
+
+#: doc/classes/Input.xml:441
+msgid ""
+"Busy cursor. Indicates that the application is busy performing an operation. "
+"This cursor shape denotes that the application isn't usable during the "
+"operation (e.g. something is blocking its main thread)."
+msgstr ""
+
+#: doc/classes/Input.xml:444
+msgid "Drag cursor. Usually displayed when dragging something."
+msgstr ""
+
+#: doc/classes/Input.xml:447
+msgid ""
+"Can drop cursor. Usually displayed when dragging something to indicate that "
+"it can be dropped at the current position."
+msgstr ""
+
+#: doc/classes/Input.xml:450
+msgid ""
+"Forbidden cursor. Indicates that the current action is forbidden (for "
+"example, when dragging something) or that the control at a position is "
+"disabled."
+msgstr ""
+
+#: doc/classes/Input.xml:453
+msgid ""
+"Vertical resize mouse cursor. A double-headed vertical arrow. It tells the "
+"user they can resize the window or the panel vertically."
+msgstr ""
+
+#: doc/classes/Input.xml:456
+msgid ""
+"Horizontal resize mouse cursor. A double-headed horizontal arrow. It tells "
+"the user they can resize the window or the panel horizontally."
+msgstr ""
+
+#: doc/classes/Input.xml:459
+msgid ""
+"Window resize mouse cursor. The cursor is a double-headed arrow that goes "
+"from the bottom left to the top right. It tells the user they can resize the "
+"window or the panel both horizontally and vertically."
+msgstr ""
+
+#: doc/classes/Input.xml:462
+msgid ""
+"Window resize mouse cursor. The cursor is a double-headed arrow that goes "
+"from the top left to the bottom right, the opposite of [constant "
+"CURSOR_BDIAGSIZE]. It tells the user they can resize the window or the panel "
+"both horizontally and vertically."
+msgstr ""
+
+#: doc/classes/Input.xml:465
+msgid "Move cursor. Indicates that something can be moved."
+msgstr ""
+
+#: doc/classes/Input.xml:468
+msgid ""
+"Vertical split mouse cursor. On Windows, it's the same as [constant "
+"CURSOR_VSIZE]."
+msgstr ""
+
+#: doc/classes/Input.xml:471
+msgid ""
+"Horizontal split mouse cursor. On Windows, it's the same as [constant "
+"CURSOR_HSIZE]."
+msgstr ""
+
+#: doc/classes/Input.xml:474
+msgid "Help cursor. Usually a question mark."
+msgstr ""
+
#: doc/classes/InputEvent.xml:4
msgid "Generic input event."
msgstr ""
@@ -24956,8 +25210,8 @@ msgstr ""
#: doc/classes/InputEventKey.xml:17
msgid ""
-"Returns the keycode combined with modifier keys such as [code]Shift[/code] "
-"or [code]Alt[/code]. See also [InputEventWithModifiers].\n"
+"Returns the keycode combined with modifier keys such as [kbd]Shift[/kbd] or "
+"[kbd]Alt[/kbd]. See also [InputEventWithModifiers].\n"
"To get a human-readable representation of the [InputEventKey] with "
"modifiers, use [code]OS.get_keycode_string(event."
"get_keycode_with_modifiers())[/code] where [code]event[/code] is the "
@@ -24966,8 +25220,8 @@ msgstr ""
#: doc/classes/InputEventKey.xml:25
msgid ""
-"Returns the physical keycode combined with modifier keys such as "
-"[code]Shift[/code] or [code]Alt[/code]. See also [InputEventWithModifiers].\n"
+"Returns the physical keycode combined with modifier keys such as [kbd]Shift[/"
+"kbd] or [kbd]Alt[/kbd]. See also [InputEventWithModifiers].\n"
"To get a human-readable representation of the [InputEventKey] with "
"modifiers, use [code]OS.get_keycode_string(event."
"get_physical_keycode_with_modifiers())[/code] where [code]event[/code] is "
@@ -25174,448 +25428,28 @@ msgstr ""
#: doc/classes/InputEventWithModifiers.xml:7
msgid ""
-"Contains keys events information with modifiers support like [code]Shift[/"
-"code] or [code]Alt[/code]. See [method Node._input]."
+"Contains keys events information with modifiers support like [kbd]Shift[/"
+"kbd] or [kbd]Alt[/kbd]. See [method Node._input]."
msgstr ""
#: doc/classes/InputEventWithModifiers.xml:16
-msgid "State of the [code]Alt[/code] modifier."
+msgid "State of the [kbd]Alt[/kbd] modifier."
msgstr ""
#: doc/classes/InputEventWithModifiers.xml:19
-msgid "State of the [code]Command[/code] modifier."
+msgid "State of the [kbd]Cmd[/kbd] modifier."
msgstr ""
#: doc/classes/InputEventWithModifiers.xml:22
-msgid "State of the [code]Ctrl[/code] modifier."
+msgid "State of the [kbd]Ctrl[/kbd] modifier."
msgstr ""
#: doc/classes/InputEventWithModifiers.xml:25
-msgid "State of the [code]Meta[/code] modifier."
+msgid "State of the [kbd]Meta[/kbd] modifier."
msgstr ""
#: doc/classes/InputEventWithModifiers.xml:28
-msgid "State of the [code]Shift[/code] modifier."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:4
-msgid "A singleton that deals with inputs."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:7
-msgid ""
-"A singleton that deals with inputs. This includes key presses, mouse buttons "
-"and movement, joypads, and input actions. Actions and their events can be "
-"set in the [b]Input Map[/b] tab in the [b]Project > Project Settings[/b], or "
-"with the [InputMap] class."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:10
-msgid "https://docs.godotengine.org/en/latest/tutorials/inputs/index.html"
-msgstr ""
-
-#: doc/classes/InputFilter.xml:21
-msgid ""
-"This will simulate pressing the specified action.\n"
-"The strength can be used for non-boolean actions, it's ranged between 0 and "
-"1 representing the intensity of the given action.\n"
-"[b]Note:[/b] This method will not cause any [method Node._input] calls. It "
-"is intended to be used with [method is_action_pressed] and [method "
-"is_action_just_pressed]. If you want to simulate [code]_input[/code], use "
-"[method parse_input_event] instead."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:32
-msgid "If the specified action is already pressed, this will release it."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:43
-msgid ""
-"Adds a new mapping entry (in SDL2 format) to the mapping database. "
-"Optionally update already connected devices."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:50
-msgid ""
-"If the device has an accelerometer, this will return the acceleration. "
-"Otherwise, it returns an empty [Vector3].\n"
-"Note this method returns an empty [Vector3] when running from the editor "
-"even when your device has an accelerometer. You must export your project to "
-"a supported device to read values from the accelerometer."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:60
-msgid ""
-"Returns a value between 0 and 1 representing the intensity of the given "
-"action. In a joypad, for example, the further away the axis (analog sticks "
-"or L2, R2 triggers) is from the dead zone, the closer the value will be to "
-"1. If the action is mapped to a control that has no axis as the keyboard, "
-"the value returned will be 0 or 1."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:67
-msgid ""
-"Returns an [Array] containing the device IDs of all currently connected "
-"joypads."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:74
-msgid "Returns the currently assigned cursor shape (see [enum CursorShape])."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:81
-msgid ""
-"If the device has an accelerometer, this will return the gravity. Otherwise, "
-"it returns an empty [Vector3]."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:88
-msgid ""
-"If the device has a gyroscope, this will return the rate of rotation in rad/"
-"s around a device's X, Y, and Z axes. Otherwise, it returns an empty "
-"[Vector3]."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:99
-msgid ""
-"Returns the current value of the joypad axis at given index (see [enum "
-"JoystickList])."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:108
-msgid "Returns the index of the provided axis name."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:117
-msgid ""
-"Receives a [enum JoystickList] axis and returns its equivalent name as a "
-"string."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:126
-msgid "Returns the index of the provided button name."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:135
-msgid ""
-"Receives a gamepad button from [enum JoystickList] and returns its "
-"equivalent name as a string."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:144
-msgid ""
-"Returns a SDL2-compatible device GUID on platforms that use gamepad "
-"remapping. Returns [code]\"Default Gamepad\"[/code] otherwise."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:153
-msgid "Returns the name of the joypad at the specified device index."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:162
-msgid "Returns the duration of the current vibration effect in seconds."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:171
-msgid ""
-"Returns the strength of the joypad vibration: x is the strength of the weak "
-"motor, and y is the strength of the strong motor."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:178
-msgid ""
-"Returns the mouse speed for the last time the cursor was moved, and this "
-"until the next frame where the mouse moves. This means that even if the "
-"mouse is not moving, this function will still return the value of the last "
-"motion."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:185
-msgid ""
-"If the device has a magnetometer, this will return the magnetic field "
-"strength in micro-Tesla for all axes."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:192
-msgid ""
-"Returns mouse buttons as a bitmask. If multiple mouse buttons are pressed at "
-"the same time, the bits are added together."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:199
-msgid "Returns the mouse mode. See the constants for more information."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:208
-msgid ""
-"Returns [code]true[/code] when the user starts pressing the action event, "
-"meaning it's [code]true[/code] only on the frame that the user pressed down "
-"the button.\n"
-"This is useful for code that needs to run only once when an action is "
-"pressed, instead of every frame while it's pressed."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:218
-msgid ""
-"Returns [code]true[/code] when the user stops pressing the action event, "
-"meaning it's [code]true[/code] only on the frame that the user released the "
-"button."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:227
-msgid ""
-"Returns [code]true[/code] if you are pressing the action event. Note that if "
-"an action has multiple buttons assigned and more than one of them is "
-"pressed, releasing one button will release the action, even if some other "
-"button assigned to this action is still pressed."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:238
-msgid ""
-"Returns [code]true[/code] if you are pressing the joypad button (see [enum "
-"JoystickList])."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:247
-msgid ""
-"Returns [code]true[/code] if the system knows the specified device. This "
-"means that it sets all button and axis indices exactly as defined in [enum "
-"JoystickList]. Unknown joypads are not expected to match these constants, "
-"but you can still retrieve events from them."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:256
-msgid ""
-"Returns [code]true[/code] if you are pressing the key in the current "
-"keyboard layout. You can pass a [enum KeyList] constant."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:265
-msgid ""
-"Returns [code]true[/code] if you are pressing the mouse button specified "
-"with [enum ButtonList]."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:280
-msgid ""
-"Notifies the [InputFilter] singleton that a connection has changed, to "
-"update the state for the [code]device[/code] index.\n"
-"This is used internally and should not have to be called from user scripts. "
-"See [signal joy_connection_changed] for the signal emitted when this is "
-"triggered internally."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:290
-msgid ""
-"Feeds an [InputEvent] to the game. Can be used to artificially trigger input "
-"events from code. Also generates [method Node._input] calls.\n"
-"Example:\n"
-"[codeblock]\n"
-"var a = InputEventAction.new()\n"
-"a.action = \"ui_cancel\"\n"
-"a.pressed = true\n"
-"InputFilter.parse_input_event(a)\n"
-"[/codeblock]"
-msgstr ""
-
-#: doc/classes/InputFilter.xml:306
-msgid ""
-"Removes all mappings from the internal database that match the given GUID."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:319
-msgid ""
-"Sets a custom mouse cursor image, which is only visible inside the game "
-"window. The hotspot can also be specified. Passing [code]null[/code] to the "
-"image parameter resets to the system cursor. See [enum CursorShape] for the "
-"list of shapes.\n"
-"[code]image[/code]'s size must be lower than 256×256.\n"
-"[code]hotspot[/code] must be within [code]image[/code]'s size.\n"
-"[b]Note:[/b] [AnimatedTexture]s aren't supported as custom mouse cursors. If "
-"using an [AnimatedTexture], only the first frame will be displayed.\n"
-"[b]Note:[/b] Only images imported with the [b]Lossless[/b], [b]Lossy[/b] or "
-"[b]Uncompressed[/b] compression modes are supported. The [b]Video RAM[/b] "
-"compression mode can't be used for custom cursors."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:332
-msgid ""
-"Sets the default cursor shape to be used in the viewport instead of "
-"[constant CURSOR_ARROW].\n"
-"[b]Note:[/b] If you want to change the default cursor shape for [Control]'s "
-"nodes, use [member Control.mouse_default_cursor_shape] instead.\n"
-"[b]Note:[/b] This method generates an [InputEventMouseMotion] to update "
-"cursor immediately."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:343
-msgid "Sets the mouse mode. See the constants for more information."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:352
-msgid ""
-"Enables or disables the accumulation of similar input events sent by the "
-"operating system. When input accumulation is enabled, all input events "
-"generated during a frame will be merged and emitted when the frame is done "
-"rendering. Therefore, this limits the number of input method calls per "
-"second to the rendering FPS.\n"
-"Input accumulation is enabled by default. It can be disabled to get slightly "
-"more precise/reactive input at the cost of increased CPU usage. In "
-"applications where drawing freehand lines is required, input accumulation "
-"should generally be disabled while the user is drawing the line to get "
-"results that closely follow the actual input."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:368
-msgid ""
-"Starts to vibrate the joypad. Joypads usually come with two rumble motors, a "
-"strong and a weak one. [code]weak_magnitude[/code] is the strength of the "
-"weak motor (between 0 and 1) and [code]strong_magnitude[/code] is the "
-"strength of the strong motor (between 0 and 1). [code]duration[/code] is the "
-"duration of the effect in seconds (a duration of 0 will try to play the "
-"vibration indefinitely).\n"
-"[b]Note:[/b] Not every hardware is compatible with long effect durations; it "
-"is recommended to restart an effect if it has to be played for more than a "
-"few seconds."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:378
-msgid "Stops the vibration of the joypad."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:387
-msgid ""
-"Vibrate Android and iOS devices.\n"
-"[b]Note:[/b] It needs VIBRATE permission for Android at export settings. iOS "
-"does not support duration."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:397
-msgid "Sets the mouse position to the specified vector."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:408
-msgid "Emitted when a joypad device has been connected or disconnected."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:414
-msgid "Makes the mouse cursor visible if it is hidden."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:417
-msgid "Makes the mouse cursor hidden if it is visible."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:420
-msgid ""
-"Captures the mouse. The mouse will be hidden and unable to leave the game "
-"window, but it will still register movement and mouse button presses. On "
-"Windows and Linux, the mouse will use raw input mode, which means the "
-"reported movement will be unaffected by the OS' mouse acceleration settings."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:423
-msgid "Makes the mouse cursor visible but confines it to the game window."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:426
-msgid "Arrow cursor. Standard, default pointing cursor."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:429
-msgid ""
-"I-beam cursor. Usually used to show where the text cursor will appear when "
-"the mouse is clicked."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:432
-msgid ""
-"Pointing hand cursor. Usually used to indicate the pointer is over a link or "
-"other interactable item."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:435
-msgid ""
-"Cross cursor. Typically appears over regions in which a drawing operation "
-"can be performed or for selections."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:438
-msgid ""
-"Wait cursor. Indicates that the application is busy performing an operation. "
-"This cursor shape denotes that the application is still usable during the "
-"operation."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:441
-msgid ""
-"Busy cursor. Indicates that the application is busy performing an operation. "
-"This cursor shape denotes that the application isn't usable during the "
-"operation (e.g. something is blocking its main thread)."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:444
-msgid "Drag cursor. Usually displayed when dragging something."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:447
-msgid ""
-"Can drop cursor. Usually displayed when dragging something to indicate that "
-"it can be dropped at the current position."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:450
-msgid ""
-"Forbidden cursor. Indicates that the current action is forbidden (for "
-"example, when dragging something) or that the control at a position is "
-"disabled."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:453
-msgid ""
-"Vertical resize mouse cursor. A double-headed vertical arrow. It tells the "
-"user they can resize the window or the panel vertically."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:456
-msgid ""
-"Horizontal resize mouse cursor. A double-headed horizontal arrow. It tells "
-"the user they can resize the window or the panel horizontally."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:459
-msgid ""
-"Window resize mouse cursor. The cursor is a double-headed arrow that goes "
-"from the bottom left to the top right. It tells the user they can resize the "
-"window or the panel both horizontally and vertically."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:462
-msgid ""
-"Window resize mouse cursor. The cursor is a double-headed arrow that goes "
-"from the top left to the bottom right, the opposite of [constant "
-"CURSOR_BDIAGSIZE]. It tells the user they can resize the window or the panel "
-"both horizontally and vertically."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:465
-msgid "Move cursor. Indicates that something can be moved."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:468
-msgid ""
-"Vertical split mouse cursor. On Windows, it's the same as [constant "
-"CURSOR_VSIZE]."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:471
-msgid ""
-"Horizontal split mouse cursor. On Windows, it's the same as [constant "
-"CURSOR_HSIZE]."
-msgstr ""
-
-#: doc/classes/InputFilter.xml:474
-msgid "Help cursor. Usually a question mark."
+msgid "State of the [kbd]Shift[/kbd] modifier."
msgstr ""
#: doc/classes/InputMap.xml:4
@@ -25886,14 +25720,6 @@ msgstr ""
msgid "Address type: Any."
msgstr ""
-#: doc/classes/IP_Unix.xml:4
-msgid "UNIX IP support. See [IP]."
-msgstr ""
-
-#: doc/classes/IP_Unix.xml:7
-msgid "UNIX-specific implementation of IP support functions. See [IP]."
-msgstr ""
-
#: doc/classes/ItemList.xml:4
msgid ""
"Control that provides a list of selectable items (and/or icons) in a single "
@@ -25908,7 +25734,7 @@ msgid ""
"Selectable items in the list may be selected or deselected and multiple "
"selection may be enabled. Selection with right mouse button may also be "
"enabled to allow use of popup context menus. Items may also be \"activated\" "
-"by double-clicking them or by pressing Enter.\n"
+"by double-clicking them or by pressing [kbd]Enter[/kbd].\n"
"Item text only supports single-line strings, newline characters (e.g. "
"[code]\\n[/code]) in the string won't produce a newline. Text wrapping is "
"enabled in [constant ICON_MODE_TOP] mode, but column's width is adjusted to "
@@ -26067,7 +25893,7 @@ msgstr ""
msgid ""
"Disables (or enables) the item at the specified index.\n"
"Disabled items cannot be selected and do not trigger activation signals "
-"(when double-clicking or pressing Enter)."
+"(when double-clicking or pressing [kbd]Enter[/kbd])."
msgstr ""
#: doc/classes/ItemList.xml:292
@@ -26202,7 +26028,7 @@ msgstr ""
#: doc/classes/ItemList.xml:455
msgid ""
"Triggered when specified list item is activated via double-clicking or by "
-"pressing Enter."
+"pressing [kbd]Enter[/kbd]."
msgstr ""
#: doc/classes/ItemList.xml:464
@@ -26252,7 +26078,9 @@ msgid "Only allow selecting a single item."
msgstr ""
#: doc/classes/ItemList.xml:511
-msgid "Allows selecting multiple items by holding Ctrl or Shift."
+msgid ""
+"Allows selecting multiple items by holding [kbd]Ctrl[/kbd] or [kbd]Shift[/"
+"kbd]."
msgstr ""
#: doc/classes/ItemList.xml:516
@@ -27243,59 +27071,91 @@ msgid ""
msgstr ""
#: doc/classes/Light3D.xml:39
-msgid "The light's bake mode. See [enum BakeMode]."
+msgid ""
+"Angular size of the light in degrees. Only available for "
+"[DirectionalLight3D]s. For reference, the sun from earth is approximately "
+"[code]0.5[/code]."
msgstr ""
#: doc/classes/Light3D.xml:42
-msgid "The light's color."
+msgid "The light's bake mode. See [enum BakeMode]."
msgstr ""
#: doc/classes/Light3D.xml:45
-msgid "The light will affect objects in the selected layers."
+msgid "The light's color."
msgstr ""
#: doc/classes/Light3D.xml:48
-msgid "The light's strength multiplier."
+msgid "The light will affect objects in the selected layers."
msgstr ""
#: doc/classes/Light3D.xml:51
+msgid "The light's strength multiplier."
+msgstr ""
+
+#: doc/classes/Light3D.xml:54
msgid ""
"Secondary multiplier used with indirect light (light bounces). Used with "
"[GIProbe]."
msgstr ""
-#: doc/classes/Light3D.xml:54
+#: doc/classes/Light3D.xml:57
msgid ""
"If [code]true[/code], the light's effect is reversed, darkening areas and "
"casting bright shadows."
msgstr ""
-#: doc/classes/Light3D.xml:57
+#: doc/classes/Light3D.xml:60
+msgid ""
+"[Texture2D] projected by light. [member shadow_enabled] must be on for the "
+"projector to work. Light projectors make the light appear as if it is "
+"shining through a colored but transparent object, almost like light shining "
+"through stained glass."
+msgstr ""
+
+#: doc/classes/Light3D.xml:63
+msgid ""
+"The size of the light in Godot units. Only available for [OmniLight3D]s and "
+"[SpotLight3D]s."
+msgstr ""
+
+#: doc/classes/Light3D.xml:66
msgid ""
"The intensity of the specular blob in objects affected by the light. At "
"[code]0[/code] the light becomes a pure diffuse light."
msgstr ""
-#: doc/classes/Light3D.xml:60
+#: doc/classes/Light3D.xml:69
msgid ""
"Used to adjust shadow appearance. Too small a value results in self-"
"shadowing, while too large a value causes shadows to separate from casters. "
"Adjust as needed."
msgstr ""
-#: doc/classes/Light3D.xml:63
-msgid "The color of shadows cast by this light."
+#: doc/classes/Light3D.xml:72 doc/classes/RenderingServer.xml:3374
+msgid ""
+"Blurs the edges of the shadow. Can be used to hide pixel artifacts in low "
+"resolution shadow maps. A high value can make shadows appear grainy and can "
+"cause other unwanted artifacts. Try to keep as near default as possible."
msgstr ""
-#: doc/classes/Light3D.xml:66
-msgid "Attempts to reduce [member shadow_bias] gap."
+#: doc/classes/Light3D.xml:75
+msgid "The color of shadows cast by this light."
msgstr ""
-#: doc/classes/Light3D.xml:69
+#: doc/classes/Light3D.xml:78
msgid "If [code]true[/code], the light will cast shadows."
msgstr ""
-#: doc/classes/Light3D.xml:72
+#: doc/classes/Light3D.xml:81
+msgid ""
+"Offsets the lookup into the shadow map by the objects normal. This can be "
+"used reduce self-shadowing artifacts without using [member shadow_bias]. In "
+"practice, this value should be tweaked along with [member shadow_bias] to "
+"reduce artifacts as much as possible."
+msgstr ""
+
+#: doc/classes/Light3D.xml:84
msgid ""
"If [code]true[/code], reverses the backface culling of the mesh. This can be "
"useful when you have a flat mesh that has a light behind it. If you need to "
@@ -27304,93 +27164,105 @@ msgid ""
"SHADOW_CASTING_SETTING_DOUBLE_SIDED]."
msgstr ""
-#: doc/classes/Light3D.xml:77
+#: doc/classes/Light3D.xml:91
msgid "Constant for accessing [member light_energy]."
msgstr ""
-#: doc/classes/Light3D.xml:80
+#: doc/classes/Light3D.xml:94
msgid "Constant for accessing [member light_indirect_energy]."
msgstr ""
-#: doc/classes/Light3D.xml:83
+#: doc/classes/Light3D.xml:97
msgid "Constant for accessing [member light_specular]."
msgstr ""
-#: doc/classes/Light3D.xml:86
+#: doc/classes/Light3D.xml:100
msgid ""
"Constant for accessing [member OmniLight3D.omni_range] or [member "
"SpotLight3D.spot_range]."
msgstr ""
-#: doc/classes/Light3D.xml:89
+#: doc/classes/Light3D.xml:103
+msgid "Constant for accessing [member light_size]."
+msgstr ""
+
+#: doc/classes/Light3D.xml:106
msgid ""
"Constant for accessing [member OmniLight3D.omni_attenuation] or [member "
"SpotLight3D.spot_attenuation]."
msgstr ""
-#: doc/classes/Light3D.xml:92
+#: doc/classes/Light3D.xml:109
msgid "Constant for accessing [member SpotLight3D.spot_angle]."
msgstr ""
-#: doc/classes/Light3D.xml:95
+#: doc/classes/Light3D.xml:112
msgid "Constant for accessing [member SpotLight3D.spot_angle_attenuation]."
msgstr ""
-#: doc/classes/Light3D.xml:98
-msgid "Constant for accessing [member shadow_contact]."
-msgstr ""
-
-#: doc/classes/Light3D.xml:101
+#: doc/classes/Light3D.xml:115
msgid ""
"Constant for accessing [member DirectionalLight3D."
"directional_shadow_max_distance]."
msgstr ""
-#: doc/classes/Light3D.xml:104
+#: doc/classes/Light3D.xml:118
msgid ""
"Constant for accessing [member DirectionalLight3D."
"directional_shadow_split_1]."
msgstr ""
-#: doc/classes/Light3D.xml:107
+#: doc/classes/Light3D.xml:121
msgid ""
"Constant for accessing [member DirectionalLight3D."
"directional_shadow_split_2]."
msgstr ""
-#: doc/classes/Light3D.xml:110
+#: doc/classes/Light3D.xml:124
msgid ""
"Constant for accessing [member DirectionalLight3D."
"directional_shadow_split_3]."
msgstr ""
-#: doc/classes/Light3D.xml:115
+#: doc/classes/Light3D.xml:127
msgid ""
"Constant for accessing [member DirectionalLight3D."
-"directional_shadow_normal_bias]."
+"directional_shadow_fade_start]."
msgstr ""
-#: doc/classes/Light3D.xml:118
+#: doc/classes/Light3D.xml:130
+msgid "Constant for accessing [member shadow_normal_bias]."
+msgstr ""
+
+#: doc/classes/Light3D.xml:133
msgid "Constant for accessing [member shadow_bias]."
msgstr ""
-#: doc/classes/Light3D.xml:121
+#: doc/classes/Light3D.xml:136
msgid ""
"Constant for accessing [member DirectionalLight3D."
-"directional_shadow_bias_split_scale]."
+"directional_shadow_pancake_size]."
msgstr ""
-#: doc/classes/Light3D.xml:127
+#: doc/classes/Light3D.xml:139
+msgid "Constant for accessing [member shadow_blur]."
+msgstr ""
+
+#: doc/classes/Light3D.xml:142
+msgid "Constant for accessing [member shadow_transmittance_bias]."
+msgstr ""
+
+#: doc/classes/Light3D.xml:148
msgid ""
"Light is ignored when baking.\n"
"[b]Note:[/b] Hiding a light does [i]not[/i] affect baking."
msgstr ""
-#: doc/classes/Light3D.xml:131
+#: doc/classes/Light3D.xml:152
msgid "Only indirect lighting will be baked (default)."
msgstr ""
-#: doc/classes/Light3D.xml:134
+#: doc/classes/Light3D.xml:155
msgid ""
"Both direct and indirect light will be baked.\n"
"[b]Note:[/b] You should hide the light if you don't want it to appear twice "
@@ -27581,32 +27453,40 @@ msgstr ""
msgid ""
"LineEdit provides a single-line string editor, used for text fields.\n"
"It features many built-in shortcuts which will always be available "
-"([code]Ctrl[/code] here maps to [code]Command[/code] on macOS):\n"
-"- Ctrl + C: Copy\n"
-"- Ctrl + X: Cut\n"
-"- Ctrl + V or Ctrl + Y: Paste/\"yank\"\n"
-"- Ctrl + Z: Undo\n"
-"- Ctrl + Shift + Z: Redo\n"
-"- Ctrl + U: Delete text from the cursor position to the beginning of the "
-"line\n"
-"- Ctrl + K: Delete text from the cursor position to the end of the line\n"
-"- Ctrl + A: Select all text\n"
-"- Up/Down arrow: Move the cursor to the beginning/end of the line\n"
-"On macOS, some extra keyboard shortcuts are available:\n"
-"- Ctrl + F: Like the right arrow key, move the cursor one character right\n"
-"- Ctrl + B: Like the left arrow key, move the cursor one character left\n"
-"- Ctrl + P: Like the up arrow key, move the cursor to the previous line\n"
-"- Ctrl + N: Like the down arrow key, move the cursor to the next line\n"
-"- Ctrl + D: Like the Delete key, delete the character on the right side of "
-"cursor\n"
-"- Ctrl + H: Like the Backspace key, delete the character on the left side of "
-"the cursor\n"
-"- Ctrl + A: Like the Home key, move the cursor to the beginning of the line\n"
-"- Ctrl + E: Like the End key, move the cursor to the end of the line\n"
-"- Command + Left arrow: Like the Home key, move the cursor to the beginning "
+"([kbd]Ctrl[/kbd] here maps to [kbd]Cmd[/kbd] on macOS):\n"
+"- [kbd]Ctrl + C[/kbd]: Copy\n"
+"- [kbd]Ctrl + X[/kbd]: Cut\n"
+"- [kbd]Ctrl + V[/kbd] or [kbd]Ctrl + Y[/kbd]: Paste/\"yank\"\n"
+"- [kbd]Ctrl + Z[/kbd]: Undo\n"
+"- [kbd]Ctrl + Shift + Z[/kbd]: Redo\n"
+"- [kbd]Ctrl + U[/kbd]: Delete text from the cursor position to the beginning "
"of the line\n"
-"- Command + Right arrow: Like the End key, move the cursor to the end of the "
-"line"
+"- [kbd]Ctrl + K[/kbd]: Delete text from the cursor position to the end of "
+"the line\n"
+"- [kbd]Ctrl + A[/kbd]: Select all text\n"
+"- [kbd]Up Arrow[/kbd]/[kbd]Down Arrow[/kbd]: Move the cursor to the "
+"beginning/end of the line\n"
+"On macOS, some extra keyboard shortcuts are available:\n"
+"- [kbd]Ctrl + F[/kbd]: Same as [kbd]Right Arrow[/kbd], move the cursor one "
+"character right\n"
+"- [kbd]Ctrl + B[/kbd]: Same as [kbd]Left Arrow[/kbd], move the cursor one "
+"character left\n"
+"- [kbd]Ctrl + P[/kbd]: Same as [kbd]Up Arrow[/kbd], move the cursor to the "
+"previous line\n"
+"- [kbd]Ctrl + N[/kbd]: Same as [kbd]Down Arrow[/kbd], move the cursor to the "
+"next line\n"
+"- [kbd]Ctrl + D[/kbd]: Same as [kbd]Delete[/kbd], delete the character on "
+"the right side of cursor\n"
+"- [kbd]Ctrl + H[/kbd]: Same as [kbd]Backspace[/kbd], delete the character on "
+"the left side of the cursor\n"
+"- [kbd]Ctrl + A[/kbd]: Same as [kbd]Home[/kbd], move the cursor to the "
+"beginning of the line\n"
+"- [kbd]Ctrl + E[/kbd]: Same as [kbd]End[/kbd], move the cursor to the end of "
+"the line\n"
+"- [kbd]Cmd + Left Arrow[/kbd]: Same as [kbd]Home[/kbd], move the cursor to "
+"the beginning of the line\n"
+"- [kbd]Cmd + Right Arrow[/kbd]: Same as [kbd]End[/kbd], move the cursor to "
+"the end of the line"
msgstr ""
#: doc/classes/LineEdit.xml:39
@@ -27751,7 +27631,7 @@ msgid ""
"max_length]."
msgstr ""
-#: doc/classes/LineEdit.xml:163 doc/classes/TextEdit.xml:513
+#: doc/classes/LineEdit.xml:163 doc/classes/TextEdit.xml:514
msgid "Emitted when the text changes."
msgstr ""
@@ -27775,11 +27655,11 @@ msgstr ""
msgid "Stretches whitespaces to fit the [LineEdit]'s width."
msgstr ""
-#: doc/classes/LineEdit.xml:188 doc/classes/TextEdit.xml:534
+#: doc/classes/LineEdit.xml:188 doc/classes/TextEdit.xml:535
msgid "Cuts (copies and clears) the selected text."
msgstr ""
-#: doc/classes/LineEdit.xml:191 doc/classes/TextEdit.xml:537
+#: doc/classes/LineEdit.xml:191 doc/classes/TextEdit.xml:538
msgid "Copies the selected text."
msgstr ""
@@ -27799,7 +27679,7 @@ msgstr ""
msgid "Selects the whole [LineEdit] text."
msgstr ""
-#: doc/classes/LineEdit.xml:204 doc/classes/TextEdit.xml:549
+#: doc/classes/LineEdit.xml:204 doc/classes/TextEdit.xml:550
msgid "Undoes the previous action."
msgstr ""
@@ -27807,7 +27687,7 @@ msgstr ""
msgid "Reverse the last undo action."
msgstr ""
-#: doc/classes/LineEdit.xml:210 doc/classes/TextEdit.xml:555
+#: doc/classes/LineEdit.xml:210 doc/classes/TextEdit.xml:556
msgid "Represents the size of the [enum MenuItems] enum."
msgstr ""
@@ -28437,11 +28317,11 @@ msgstr ""
msgid "Render array as triangle strips."
msgstr ""
-#: doc/classes/Mesh.xml:126 doc/classes/RenderingServer.xml:3254
+#: doc/classes/Mesh.xml:126 doc/classes/RenderingServer.xml:3306
msgid "Blend shapes are normalized."
msgstr ""
-#: doc/classes/Mesh.xml:129 doc/classes/RenderingServer.xml:3257
+#: doc/classes/Mesh.xml:129 doc/classes/RenderingServer.xml:3309
msgid "Blend shapes are relative to base weight."
msgstr ""
@@ -28483,37 +28363,37 @@ msgstr ""
msgid "Mesh array uses indices."
msgstr ""
-#: doc/classes/Mesh.xml:159 doc/classes/RenderingServer.xml:3210
+#: doc/classes/Mesh.xml:159 doc/classes/RenderingServer.xml:3262
msgid "Flag used to mark a compressed (half float) normal array."
msgstr ""
-#: doc/classes/Mesh.xml:162 doc/classes/RenderingServer.xml:3213
+#: doc/classes/Mesh.xml:162 doc/classes/RenderingServer.xml:3265
msgid "Flag used to mark a compressed (half float) tangent array."
msgstr ""
-#: doc/classes/Mesh.xml:165 doc/classes/RenderingServer.xml:3216
+#: doc/classes/Mesh.xml:165 doc/classes/RenderingServer.xml:3268
msgid "Flag used to mark a compressed (half float) color array."
msgstr ""
-#: doc/classes/Mesh.xml:168 doc/classes/RenderingServer.xml:3219
+#: doc/classes/Mesh.xml:168 doc/classes/RenderingServer.xml:3271
msgid "Flag used to mark a compressed (half float) UV coordinates array."
msgstr ""
-#: doc/classes/Mesh.xml:171 doc/classes/RenderingServer.xml:3222
+#: doc/classes/Mesh.xml:171 doc/classes/RenderingServer.xml:3274
msgid ""
"Flag used to mark a compressed (half float) UV coordinates array for the "
"second UV coordinates."
msgstr ""
-#: doc/classes/Mesh.xml:174 doc/classes/RenderingServer.xml:3225
+#: doc/classes/Mesh.xml:174 doc/classes/RenderingServer.xml:3277
msgid "Flag used to mark a compressed index array."
msgstr ""
-#: doc/classes/Mesh.xml:177 doc/classes/RenderingServer.xml:3228
+#: doc/classes/Mesh.xml:177 doc/classes/RenderingServer.xml:3283
msgid "Flag used to mark that the array contains 2D vertices."
msgstr ""
-#: doc/classes/Mesh.xml:180 doc/classes/RenderingServer.xml:3233
+#: doc/classes/Mesh.xml:180 doc/classes/RenderingServer.xml:3280
msgid ""
"Used to set flags [constant ARRAY_COMPRESS_NORMAL], [constant "
"ARRAY_COMPRESS_TANGENT], [constant ARRAY_COMPRESS_COLOR], [constant "
@@ -28578,67 +28458,72 @@ msgid ""
" mdt.set_vertex(i, vertex)\n"
"mesh.surface_remove(0)\n"
"mdt.commit_to_surface(mesh)\n"
-"[/codeblock]"
+"[/codeblock]\n"
+"See also [ArrayMesh], [ImmediateGeometry3D] and [SurfaceTool] for procedural "
+"geometry generation.\n"
+"[b]Note:[/b] Godot uses clockwise [url=https://learnopengl.com/Advanced-"
+"OpenGL/Face-culling]winding order[/url] for front faces of triangle "
+"primitive modes."
msgstr ""
-#: doc/classes/MeshDataTool.xml:28
+#: doc/classes/MeshDataTool.xml:30
msgid "Clears all data currently in MeshDataTool."
msgstr ""
-#: doc/classes/MeshDataTool.xml:37
+#: doc/classes/MeshDataTool.xml:39
msgid "Adds a new surface to specified [Mesh] with edited data."
msgstr ""
-#: doc/classes/MeshDataTool.xml:48
+#: doc/classes/MeshDataTool.xml:50
msgid ""
"Uses specified surface of given [Mesh] to populate data for MeshDataTool.\n"
"Requires [Mesh] with primitive type [constant Mesh.PRIMITIVE_TRIANGLES]."
msgstr ""
-#: doc/classes/MeshDataTool.xml:56
+#: doc/classes/MeshDataTool.xml:58
msgid "Returns the number of edges in this [Mesh]."
msgstr ""
-#: doc/classes/MeshDataTool.xml:65
+#: doc/classes/MeshDataTool.xml:67
msgid "Returns array of faces that touch given edge."
msgstr ""
-#: doc/classes/MeshDataTool.xml:74
+#: doc/classes/MeshDataTool.xml:76
msgid "Returns meta information assigned to given edge."
msgstr ""
-#: doc/classes/MeshDataTool.xml:85
+#: doc/classes/MeshDataTool.xml:87
msgid ""
"Returns index of specified vertex connected to given edge.\n"
"Vertex argument can only be 0 or 1 because edges are comprised of two "
"vertices."
msgstr ""
-#: doc/classes/MeshDataTool.xml:93
+#: doc/classes/MeshDataTool.xml:95
msgid "Returns the number of faces in this [Mesh]."
msgstr ""
-#: doc/classes/MeshDataTool.xml:104
+#: doc/classes/MeshDataTool.xml:106
msgid ""
"Returns specified edge associated with given face.\n"
"Edge argument must 2 or less because a face only has three edges."
msgstr ""
-#: doc/classes/MeshDataTool.xml:114
+#: doc/classes/MeshDataTool.xml:116
msgid "Returns the metadata associated with the given face."
msgstr ""
-#: doc/classes/MeshDataTool.xml:123
+#: doc/classes/MeshDataTool.xml:125
msgid "Calculates and returns the face normal of the given face."
msgstr ""
-#: doc/classes/MeshDataTool.xml:134
+#: doc/classes/MeshDataTool.xml:136
msgid ""
"Returns the specified vertex of the given face.\n"
"Vertex argument must be 2 or less because faces contain three vertices."
msgstr ""
-#: doc/classes/MeshDataTool.xml:142
+#: doc/classes/MeshDataTool.xml:144
msgid ""
"Returns the [Mesh]'s format. Format is an integer made up of [Mesh] format "
"flags combined together. For example, a mesh containing both vertices and "
@@ -28648,103 +28533,103 @@ msgid ""
"See [enum ArrayMesh.ArrayFormat] for a list of format flags."
msgstr ""
-#: doc/classes/MeshDataTool.xml:150
+#: doc/classes/MeshDataTool.xml:152
msgid "Returns the material assigned to the [Mesh]."
msgstr ""
-#: doc/classes/MeshDataTool.xml:159
+#: doc/classes/MeshDataTool.xml:161
msgid "Returns the vertex at given index."
msgstr ""
-#: doc/classes/MeshDataTool.xml:168
+#: doc/classes/MeshDataTool.xml:170
msgid "Returns the bones of the given vertex."
msgstr ""
-#: doc/classes/MeshDataTool.xml:177
+#: doc/classes/MeshDataTool.xml:179
msgid "Returns the color of the given vertex."
msgstr ""
-#: doc/classes/MeshDataTool.xml:184
+#: doc/classes/MeshDataTool.xml:186
msgid "Returns the total number of vertices in [Mesh]."
msgstr ""
-#: doc/classes/MeshDataTool.xml:193
+#: doc/classes/MeshDataTool.xml:195
msgid "Returns an array of edges that share the given vertex."
msgstr ""
-#: doc/classes/MeshDataTool.xml:202
+#: doc/classes/MeshDataTool.xml:204
msgid "Returns an array of faces that share the given vertex."
msgstr ""
-#: doc/classes/MeshDataTool.xml:211
+#: doc/classes/MeshDataTool.xml:213
msgid "Returns the metadata associated with the given vertex."
msgstr ""
-#: doc/classes/MeshDataTool.xml:220
+#: doc/classes/MeshDataTool.xml:222
msgid "Returns the normal of the given vertex."
msgstr ""
-#: doc/classes/MeshDataTool.xml:229
+#: doc/classes/MeshDataTool.xml:231
msgid "Returns the tangent of the given vertex."
msgstr ""
-#: doc/classes/MeshDataTool.xml:238
+#: doc/classes/MeshDataTool.xml:240
msgid "Returns the UV of the given vertex."
msgstr ""
-#: doc/classes/MeshDataTool.xml:247
+#: doc/classes/MeshDataTool.xml:249
msgid "Returns the UV2 of the given vertex."
msgstr ""
-#: doc/classes/MeshDataTool.xml:256
+#: doc/classes/MeshDataTool.xml:258
msgid "Returns bone weights of the given vertex."
msgstr ""
-#: doc/classes/MeshDataTool.xml:267
+#: doc/classes/MeshDataTool.xml:269
msgid "Sets the metadata of the given edge."
msgstr ""
-#: doc/classes/MeshDataTool.xml:278
+#: doc/classes/MeshDataTool.xml:280
msgid "Sets the metadata of the given face."
msgstr ""
-#: doc/classes/MeshDataTool.xml:287
+#: doc/classes/MeshDataTool.xml:289
msgid "Sets the material to be used by newly-constructed [Mesh]."
msgstr ""
-#: doc/classes/MeshDataTool.xml:298
+#: doc/classes/MeshDataTool.xml:300
msgid "Sets the position of the given vertex."
msgstr ""
-#: doc/classes/MeshDataTool.xml:309
+#: doc/classes/MeshDataTool.xml:311
msgid "Sets the bones of the given vertex."
msgstr ""
-#: doc/classes/MeshDataTool.xml:320
+#: doc/classes/MeshDataTool.xml:322
msgid "Sets the color of the given vertex."
msgstr ""
-#: doc/classes/MeshDataTool.xml:331
+#: doc/classes/MeshDataTool.xml:333
msgid "Sets the metadata associated with the given vertex."
msgstr ""
-#: doc/classes/MeshDataTool.xml:342
+#: doc/classes/MeshDataTool.xml:344
msgid "Sets the normal of the given vertex."
msgstr ""
-#: doc/classes/MeshDataTool.xml:353
+#: doc/classes/MeshDataTool.xml:355
msgid "Sets the tangent of the given vertex."
msgstr ""
-#: doc/classes/MeshDataTool.xml:364
+#: doc/classes/MeshDataTool.xml:366
msgid "Sets the UV of the given vertex."
msgstr ""
-#: doc/classes/MeshDataTool.xml:375
+#: doc/classes/MeshDataTool.xml:377
msgid "Sets the UV2 of the given vertex."
msgstr ""
-#: doc/classes/MeshDataTool.xml:386
+#: doc/classes/MeshDataTool.xml:388
msgid "Sets the bone weights of the given vertex."
msgstr ""
@@ -28990,9 +28875,9 @@ msgid ""
"setting [member eye_height].\n"
"You can initialise this interface as follows:\n"
"[codeblock]\n"
-"var interface = ARVRServer.find_interface(\"Native mobile\")\n"
+"var interface = XRServer.find_interface(\"Native mobile\")\n"
"if interface and interface.initialize():\n"
-" get_viewport().arvr = true\n"
+" get_viewport().xr = true\n"
"[/codeblock]"
msgstr ""
@@ -29009,7 +28894,7 @@ msgstr ""
#: modules/mobile_vr/doc_classes/MobileVRInterface.xml:28
msgid ""
"The height at which the camera is placed in relation to the ground (i.e. "
-"[ARVROrigin] node)."
+"[XROrigin3D] node)."
msgstr ""
#: modules/mobile_vr/doc_classes/MobileVRInterface.xml:31
@@ -31489,7 +31374,7 @@ msgstr ""
#: doc/classes/Node.xml:935
msgid ""
"Notification received from the OS when a close request is sent (e.g. closing "
-"the window with a \"Close\" button or Alt+F4).\n"
+"the window with a \"Close\" button or [kbd]Alt + F4[/kbd]).\n"
"Implemented on desktop platforms."
msgstr ""
@@ -31591,11 +31476,21 @@ msgid ""
msgstr ""
#: doc/classes/Node2D.xml:95
-msgid "Converts a local point's coordinates to global coordinates."
+msgid ""
+"Transforms the provided local position into a position in global coordinate "
+"space. The input is expected to be local relative to the [Node2D] it is "
+"called on. e.g. Applying this method to the positions of child nodes will "
+"correctly transform their positions into the global coordinate space, but "
+"applying it to a node's own position will give an incorrect result, as it "
+"will incorporate the node's own transformation into its global position."
msgstr ""
#: doc/classes/Node2D.xml:104
-msgid "Converts a global point's coordinates to local coordinates."
+msgid ""
+"Transforms the provided global position into a position in local coordinate "
+"space. The output will be local relative to the [Node2D] it is called on. e."
+"g. It is appropriate for determining the positions of child nodes, but it is "
+"not appropriate for determining its own position relative to its parent."
msgstr ""
#: doc/classes/Node2D.xml:113
@@ -31670,80 +31565,83 @@ msgid ""
"operations in this coordinate system correspond to direct affine operations "
"on the [Node3D]'s transform. The word local below refers to this coordinate "
"system. The coordinate system that is attached to the [Node3D] object itself "
-"is referred to as object-local coordinate system."
+"is referred to as object-local coordinate system.\n"
+"[b]Note:[/b] Unless otherwise specified, all methods that have angle "
+"parameters must have angles specified as [i]radians[/i]. To convert degrees "
+"to radians, use [method @GDScript.deg2rad]."
msgstr ""
-#: doc/classes/Node3D.xml:11
+#: doc/classes/Node3D.xml:12
msgid ""
"https://docs.godotengine.org/en/latest/tutorials/3d/introduction_to_3d.html"
msgstr ""
-#: doc/classes/Node3D.xml:25
+#: doc/classes/Node3D.xml:26
msgid ""
"Returns the parent [Node3D], or an empty [Object] if no parent exists or "
"parent is not of type [Node3D]."
msgstr ""
-#: doc/classes/Node3D.xml:32
+#: doc/classes/Node3D.xml:33
msgid ""
"Returns the current [World3D] resource this [Node3D] node is registered to."
msgstr ""
-#: doc/classes/Node3D.xml:43
+#: doc/classes/Node3D.xml:44
msgid ""
"Rotates the global (world) transformation around axis, a unit [Vector3], by "
"specified angle in radians. The rotation axis is in global coordinate system."
msgstr ""
-#: doc/classes/Node3D.xml:52
+#: doc/classes/Node3D.xml:53
msgid ""
"Scales the global (world) transformation by the given [Vector3] scale "
"factors."
msgstr ""
-#: doc/classes/Node3D.xml:61
+#: doc/classes/Node3D.xml:62
msgid ""
"Moves the global (world) transformation by [Vector3] offset. The offset is "
"in global coordinate system."
msgstr ""
-#: doc/classes/Node3D.xml:68
+#: doc/classes/Node3D.xml:69
msgid ""
"Disables rendering of this node. Changes [member visible] to [code]false[/"
"code]."
msgstr ""
-#: doc/classes/Node3D.xml:75
+#: doc/classes/Node3D.xml:76
msgid ""
"Returns whether node notifies about its local transformation changes. "
"[Node3D] will not propagate this by default."
msgstr ""
-#: doc/classes/Node3D.xml:82
+#: doc/classes/Node3D.xml:83
msgid ""
"Returns whether this node uses a scale of [code](1, 1, 1)[/code] or its "
"local transformation scale."
msgstr ""
-#: doc/classes/Node3D.xml:89
+#: doc/classes/Node3D.xml:90
msgid ""
"Returns whether this node is set as Toplevel, that is whether it ignores its "
"parent nodes transformations."
msgstr ""
-#: doc/classes/Node3D.xml:96
+#: doc/classes/Node3D.xml:97
msgid ""
"Returns whether the node notifies about its global and local transformation "
"changes. [Node3D] will not propagate this by default."
msgstr ""
-#: doc/classes/Node3D.xml:103
+#: doc/classes/Node3D.xml:104
msgid ""
"Returns whether the node is visible, taking into consideration that its "
"parents visibility."
msgstr ""
-#: doc/classes/Node3D.xml:114
+#: doc/classes/Node3D.xml:115
msgid ""
"Rotates itself so that the local -Z axis points towards the [code]target[/"
"code] position.\n"
@@ -31753,106 +31651,106 @@ msgid ""
"Operations take place in global space."
msgstr ""
-#: doc/classes/Node3D.xml:129
+#: doc/classes/Node3D.xml:130
msgid ""
"Moves the node to the specified [code]position[/code], and then rotates "
"itself to point toward the [code]target[/code] as per [method look_at]. "
"Operations take place in global space."
msgstr ""
-#: doc/classes/Node3D.xml:136
+#: doc/classes/Node3D.xml:137
msgid ""
"Resets this node's transformations (like scale, skew and taper) preserving "
"its rotation and translation by performing Gram-Schmidt orthonormalization "
"on this node's [Transform]."
msgstr ""
-#: doc/classes/Node3D.xml:147
+#: doc/classes/Node3D.xml:148
msgid ""
"Rotates the local transformation around axis, a unit [Vector3], by specified "
"angle in radians."
msgstr ""
-#: doc/classes/Node3D.xml:158
+#: doc/classes/Node3D.xml:159
msgid ""
"Rotates the local transformation around axis, a unit [Vector3], by specified "
"angle in radians. The rotation axis is in object-local coordinate system."
msgstr ""
-#: doc/classes/Node3D.xml:167
+#: doc/classes/Node3D.xml:168
msgid "Rotates the local transformation around the X axis by angle in radians."
msgstr ""
-#: doc/classes/Node3D.xml:176
+#: doc/classes/Node3D.xml:177
msgid "Rotates the local transformation around the Y axis by angle in radians."
msgstr ""
-#: doc/classes/Node3D.xml:185
+#: doc/classes/Node3D.xml:186
msgid "Rotates the local transformation around the Z axis by angle in radians."
msgstr ""
-#: doc/classes/Node3D.xml:194
+#: doc/classes/Node3D.xml:195
msgid ""
"Scales the local transformation by given 3D scale factors in object-local "
"coordinate system."
msgstr ""
-#: doc/classes/Node3D.xml:203
+#: doc/classes/Node3D.xml:204
msgid ""
"Makes the node ignore its parents transformations. Node transformations are "
"only in global space."
msgstr ""
-#: doc/classes/Node3D.xml:212
+#: doc/classes/Node3D.xml:213
msgid ""
"Sets whether the node uses a scale of [code](1, 1, 1)[/code] or its local "
"transformation scale. Changes to the local transformation scale are "
"preserved."
msgstr ""
-#: doc/classes/Node3D.xml:219
+#: doc/classes/Node3D.xml:220
msgid ""
"Reset all transformations for this node (sets its [Transform] to the "
"identity matrix)."
msgstr ""
-#: doc/classes/Node3D.xml:228
+#: doc/classes/Node3D.xml:229
msgid ""
"Sets whether the node ignores notification that its transformation (global "
"or local) changed."
msgstr ""
-#: doc/classes/Node3D.xml:237
+#: doc/classes/Node3D.xml:238
msgid ""
"Sets whether the node notifies about its local transformation changes. "
"[Node3D] will not propagate this by default."
msgstr ""
-#: doc/classes/Node3D.xml:246
+#: doc/classes/Node3D.xml:247
msgid ""
"Sets whether the node notifies about its global and local transformation "
"changes. [Node3D] will not propagate this by default."
msgstr ""
-#: doc/classes/Node3D.xml:253
+#: doc/classes/Node3D.xml:254
msgid ""
"Enables rendering of this node. Changes [member visible] to [code]true[/"
"code]."
msgstr ""
-#: doc/classes/Node3D.xml:262
+#: doc/classes/Node3D.xml:263
msgid ""
"Transforms [code]local_point[/code] from this node's local space to world "
"space."
msgstr ""
-#: doc/classes/Node3D.xml:271
+#: doc/classes/Node3D.xml:272
msgid ""
"Transforms [code]global_point[/code] from world space to this node's local "
"space."
msgstr ""
-#: doc/classes/Node3D.xml:280
+#: doc/classes/Node3D.xml:281
msgid ""
"Changes the node's position by the given offset [Vector3].\n"
"Note that the translation [code]offset[/code] is affected by the node's "
@@ -31861,26 +31759,26 @@ msgid ""
"to the X coordinate."
msgstr ""
-#: doc/classes/Node3D.xml:290
+#: doc/classes/Node3D.xml:291
msgid ""
"Changes the node's position by the given offset [Vector3] in local space."
msgstr ""
-#: doc/classes/Node3D.xml:297
+#: doc/classes/Node3D.xml:298
msgid "Updates the [Node3DGizmo] of this node."
msgstr ""
-#: doc/classes/Node3D.xml:303
+#: doc/classes/Node3D.xml:304
msgid ""
"The [Node3DGizmo] for this node. Used for example in [EditorNode3DGizmo] as "
"custom visualization and editing handles in Editor."
msgstr ""
-#: doc/classes/Node3D.xml:306
+#: doc/classes/Node3D.xml:307
msgid "World3D space (global) [Transform] of this node."
msgstr ""
-#: doc/classes/Node3D.xml:309
+#: doc/classes/Node3D.xml:310
msgid ""
"Rotation part of the local transformation in radians, specified in terms of "
"YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n"
@@ -31893,33 +31791,33 @@ msgid ""
"\" is not meaningful."
msgstr ""
-#: doc/classes/Node3D.xml:313
+#: doc/classes/Node3D.xml:314
msgid ""
"Rotation part of the local transformation in degrees, specified in terms of "
"YXZ-Euler angles in the format (X angle, Y angle, Z angle)."
msgstr ""
-#: doc/classes/Node3D.xml:316
+#: doc/classes/Node3D.xml:317
msgid "Scale part of the local transformation."
msgstr ""
-#: doc/classes/Node3D.xml:319
+#: doc/classes/Node3D.xml:320
msgid "Local space [Transform] of this node, with respect to the parent node."
msgstr ""
-#: doc/classes/Node3D.xml:322
+#: doc/classes/Node3D.xml:323
msgid "Local translation of this node."
msgstr ""
-#: doc/classes/Node3D.xml:325
+#: doc/classes/Node3D.xml:326
msgid "If [code]true[/code], this node is drawn."
msgstr ""
-#: doc/classes/Node3D.xml:331
+#: doc/classes/Node3D.xml:332
msgid "Emitted when node visibility changes."
msgstr ""
-#: doc/classes/Node3D.xml:337
+#: doc/classes/Node3D.xml:338
msgid ""
"Node3D nodes receives this notification when their global transform changes. "
"This means that either the current or a parent node changed its transform.\n"
@@ -31927,19 +31825,19 @@ msgid ""
"need to ask for it, with [method set_notify_transform]."
msgstr ""
-#: doc/classes/Node3D.xml:341
+#: doc/classes/Node3D.xml:342
msgid ""
"Node3D nodes receives this notification when they are registered to new "
"[World3D] resource."
msgstr ""
-#: doc/classes/Node3D.xml:344
+#: doc/classes/Node3D.xml:345
msgid ""
"Node3D nodes receives this notification when they are unregistered from "
"current [World3D] resource."
msgstr ""
-#: doc/classes/Node3D.xml:347
+#: doc/classes/Node3D.xml:348
msgid "Node3D nodes receives this notification when their visibility changes."
msgstr ""
@@ -33315,11 +33213,13 @@ msgid ""
"code]. See [url=https://blog.escapecreative.com/customizing-mailto-"
"links/]Customizing [code]mailto:[/code] Links[/url] for a list of fields "
"that can be added.\n"
+"Use [method ProjectSettings.globalize_path] to convert a [code]res://[/code] "
+"or [code]user://[/code] path into a system path for use with this method.\n"
"[b]Note:[/b] This method is implemented on Android, iOS, HTML5, Linux, macOS "
"and Windows."
msgstr ""
-#: doc/classes/OS.xml:493
+#: doc/classes/OS.xml:494
msgid ""
"The exit code passed to the OS when the main loop exits. By convention, an "
"exit code of [code]0[/code] indicates success whereas a non-zero exit code "
@@ -33329,133 +33229,133 @@ msgid ""
"with an [code]exit_code[/code] argument passed."
msgstr ""
-#: doc/classes/OS.xml:497
+#: doc/classes/OS.xml:498
msgid ""
"If [code]true[/code], the engine optimizes for low processor usage by only "
"refreshing the screen if needed. Can improve battery consumption on mobile."
msgstr ""
-#: doc/classes/OS.xml:500
+#: doc/classes/OS.xml:501
msgid ""
"The amount of sleeping between frames when the low-processor usage mode is "
"enabled (in microseconds). Higher values will result in lower CPU usage."
msgstr ""
-#: doc/classes/OS.xml:505
+#: doc/classes/OS.xml:506
msgid ""
"The GLES2 rendering backend. It uses OpenGL ES 2.0 on mobile devices, OpenGL "
"2.1 on desktop platforms and WebGL 1.0 on the web."
msgstr ""
-#: doc/classes/OS.xml:508
+#: doc/classes/OS.xml:509
msgid "The Vulkan rendering backend."
msgstr ""
-#: doc/classes/OS.xml:511
+#: doc/classes/OS.xml:512
msgid "Sunday."
msgstr ""
-#: doc/classes/OS.xml:514
+#: doc/classes/OS.xml:515
msgid "Monday."
msgstr ""
-#: doc/classes/OS.xml:517
+#: doc/classes/OS.xml:518
msgid "Tuesday."
msgstr ""
-#: doc/classes/OS.xml:520
+#: doc/classes/OS.xml:521
msgid "Wednesday."
msgstr ""
-#: doc/classes/OS.xml:523
+#: doc/classes/OS.xml:524
msgid "Thursday."
msgstr ""
-#: doc/classes/OS.xml:526
+#: doc/classes/OS.xml:527
msgid "Friday."
msgstr ""
-#: doc/classes/OS.xml:529
+#: doc/classes/OS.xml:530
msgid "Saturday."
msgstr ""
-#: doc/classes/OS.xml:532
+#: doc/classes/OS.xml:533
msgid "January."
msgstr ""
-#: doc/classes/OS.xml:535
+#: doc/classes/OS.xml:536
msgid "February."
msgstr ""
-#: doc/classes/OS.xml:538
+#: doc/classes/OS.xml:539
msgid "March."
msgstr ""
-#: doc/classes/OS.xml:541
+#: doc/classes/OS.xml:542
msgid "April."
msgstr ""
-#: doc/classes/OS.xml:544
+#: doc/classes/OS.xml:545
msgid "May."
msgstr ""
-#: doc/classes/OS.xml:547
+#: doc/classes/OS.xml:548
msgid "June."
msgstr ""
-#: doc/classes/OS.xml:550
+#: doc/classes/OS.xml:551
msgid "July."
msgstr ""
-#: doc/classes/OS.xml:553
+#: doc/classes/OS.xml:554
msgid "August."
msgstr ""
-#: doc/classes/OS.xml:556
+#: doc/classes/OS.xml:557
msgid "September."
msgstr ""
-#: doc/classes/OS.xml:559
+#: doc/classes/OS.xml:560
msgid "October."
msgstr ""
-#: doc/classes/OS.xml:562
+#: doc/classes/OS.xml:563
msgid "November."
msgstr ""
-#: doc/classes/OS.xml:565
+#: doc/classes/OS.xml:566
msgid "December."
msgstr ""
-#: doc/classes/OS.xml:568
+#: doc/classes/OS.xml:569
msgid "Desktop directory path."
msgstr ""
-#: doc/classes/OS.xml:571
+#: doc/classes/OS.xml:572
msgid "DCIM (Digital Camera Images) directory path."
msgstr ""
-#: doc/classes/OS.xml:574
+#: doc/classes/OS.xml:575
msgid "Documents directory path."
msgstr ""
-#: doc/classes/OS.xml:577
+#: doc/classes/OS.xml:578
msgid "Downloads directory path."
msgstr ""
-#: doc/classes/OS.xml:580
+#: doc/classes/OS.xml:581
msgid "Movies directory path."
msgstr ""
-#: doc/classes/OS.xml:583
+#: doc/classes/OS.xml:584
msgid "Music directory path."
msgstr ""
-#: doc/classes/OS.xml:586
+#: doc/classes/OS.xml:587
msgid "Pictures directory path."
msgstr ""
-#: doc/classes/OS.xml:589
+#: doc/classes/OS.xml:590
msgid "Ringtones directory path."
msgstr ""
@@ -33727,49 +33627,52 @@ msgid ""
"code] is owned by [code]node[/code] and [code]pack[/code] will therefore "
"only save those two nodes, but not [code]collision[/code].\n"
"[codeblock]\n"
-"# Create the objects\n"
+"# Create the objects.\n"
"var node = Node2D.new()\n"
"var rigid = RigidBody2D.new()\n"
"var collision = CollisionShape2D.new()\n"
"\n"
-"# Create the object hierarchy\n"
+"# Create the object hierarchy.\n"
"rigid.add_child(collision)\n"
"node.add_child(rigid)\n"
"\n"
-"# Change owner of rigid, but not of collision\n"
+"# Change owner of `rigid`, but not of `collision`.\n"
"rigid.owner = node\n"
"\n"
"var scene = PackedScene.new()\n"
-"# Only node and rigid are now packed\n"
+"# Only `node` and `rigid` are now packed.\n"
"var result = scene.pack(node)\n"
"if result == OK:\n"
-" ResourceSaver.save(\"res://path/name.scn\", scene) # Or \"user://...\"\n"
+" var error = ResourceSaver.save(\"res://path/name.scn\", scene) # Or "
+"\"user://...\"\n"
+" if error != OK:\n"
+" push_error(\"An error occurred while saving the scene to disk.\")\n"
"[/codeblock]"
msgstr ""
-#: doc/classes/PackedScene.xml:38
+#: doc/classes/PackedScene.xml:40
msgid "Returns [code]true[/code] if the scene file has nodes."
msgstr ""
-#: doc/classes/PackedScene.xml:45
+#: doc/classes/PackedScene.xml:47
msgid ""
"Returns the [code]SceneState[/code] representing the scene file contents."
msgstr ""
-#: doc/classes/PackedScene.xml:54
+#: doc/classes/PackedScene.xml:56
msgid ""
"Instantiates the scene's node hierarchy. Triggers child scene "
"instantiation(s). Triggers a [constant Node.NOTIFICATION_INSTANCED] "
"notification on the root node."
msgstr ""
-#: doc/classes/PackedScene.xml:63
+#: doc/classes/PackedScene.xml:65
msgid ""
"Pack will ignore any sub-nodes not owned by given node. See [member Node."
"owner]."
msgstr ""
-#: doc/classes/PackedScene.xml:69
+#: doc/classes/PackedScene.xml:71
msgid ""
"A dictionary representation of the scene contents.\n"
"Available keys include \"rnames\" and \"variants\" for resources, "
@@ -33778,18 +33681,18 @@ msgid ""
"connections, and \"version\" for the format style of the PackedScene."
msgstr ""
-#: doc/classes/PackedScene.xml:75
+#: doc/classes/PackedScene.xml:77
msgid "If passed to [method instance], blocks edits to the scene state."
msgstr ""
-#: doc/classes/PackedScene.xml:78
+#: doc/classes/PackedScene.xml:80
msgid ""
"If passed to [method instance], provides local scene resources to the local "
"scene.\n"
"[b]Note:[/b] Only available in editor builds."
msgstr ""
-#: doc/classes/PackedScene.xml:82
+#: doc/classes/PackedScene.xml:84
msgid ""
"If passed to [method instance], provides local scene resources to the local "
"scene. Only the main scene should receive the main edit state.\n"
@@ -34857,20 +34760,20 @@ msgstr ""
msgid "Draw calls per frame. 3D only."
msgstr ""
-#: doc/classes/Performance.xml:77 doc/classes/RenderingServer.xml:3711
+#: doc/classes/Performance.xml:77 doc/classes/RenderingServer.xml:3922
msgid ""
"The amount of video memory used, i.e. texture and vertex memory combined."
msgstr ""
-#: doc/classes/Performance.xml:80 doc/classes/RenderingServer.xml:3714
+#: doc/classes/Performance.xml:80 doc/classes/RenderingServer.xml:3925
msgid "The amount of texture memory used."
msgstr ""
-#: doc/classes/Performance.xml:83 doc/classes/RenderingServer.xml:3717
+#: doc/classes/Performance.xml:83 doc/classes/RenderingServer.xml:3928
msgid "The amount of vertex memory used."
msgstr ""
-#: doc/classes/Performance.xml:86 doc/classes/RenderingServer.xml:3708
+#: doc/classes/Performance.xml:86 doc/classes/RenderingServer.xml:3919
msgid "Unimplemented in the GLES2 rendering backend, always returns 0."
msgstr ""
@@ -34922,6 +34825,96 @@ msgid ""
"resource."
msgstr ""
+#: doc/classes/PhysicalBone3D.xml:67
+msgid "Damps the body's rotation if greater than [code]0[/code]."
+msgstr ""
+
+#: doc/classes/PhysicalBone3D.xml:70 doc/classes/RigidBody3D.xml:132
+msgid "Lock the body's rotation in the X axis."
+msgstr ""
+
+#: doc/classes/PhysicalBone3D.xml:73 doc/classes/RigidBody3D.xml:135
+msgid "Lock the body's rotation in the Y axis."
+msgstr ""
+
+#: doc/classes/PhysicalBone3D.xml:76 doc/classes/RigidBody3D.xml:138
+msgid "Lock the body's rotation in the Z axis."
+msgstr ""
+
+#: doc/classes/PhysicalBone3D.xml:79 doc/classes/RigidBody3D.xml:141
+msgid "Lock the body's movement in the X axis."
+msgstr ""
+
+#: doc/classes/PhysicalBone3D.xml:82 doc/classes/RigidBody3D.xml:144
+msgid "Lock the body's movement in the Y axis."
+msgstr ""
+
+#: doc/classes/PhysicalBone3D.xml:85 doc/classes/RigidBody3D.xml:147
+msgid "Lock the body's movement in the Z axis."
+msgstr ""
+
+#: doc/classes/PhysicalBone3D.xml:88
+msgid "Sets the body's transform."
+msgstr ""
+
+#: doc/classes/PhysicalBone3D.xml:91 doc/classes/PhysicsMaterial.xml:17
+msgid ""
+"The body's bounciness. Values range from [code]0[/code] (no bounce) to "
+"[code]1[/code] (full bounciness)."
+msgstr ""
+
+#: doc/classes/PhysicalBone3D.xml:94 doc/classes/RigidBody3D.xml:150
+msgid ""
+"If [code]true[/code], the body is deactivated when there is no movement, so "
+"it will not take part in the simulation until it is awaken by an external "
+"force."
+msgstr ""
+
+#: doc/classes/PhysicalBone3D.xml:97
+msgid ""
+"The body's friction, from [code]0[/code] (frictionless) to [code]1[/code] "
+"(max friction)."
+msgstr ""
+
+#: doc/classes/PhysicalBone3D.xml:100
+msgid ""
+"This is multiplied by the global 3D gravity setting found in [b]Project > "
+"Project Settings > Physics > 3d[/b] to produce the body's gravity. For "
+"example, a value of 1 will be normal gravity, 2 will apply double gravity, "
+"and 0.5 will apply half gravity to this object."
+msgstr ""
+
+#: doc/classes/PhysicalBone3D.xml:103
+msgid "Sets the joint's transform."
+msgstr ""
+
+#: doc/classes/PhysicalBone3D.xml:106
+msgid "Sets the joint's rotation in radians."
+msgstr ""
+
+#: doc/classes/PhysicalBone3D.xml:109
+msgid "Sets the joint's rotation in degrees."
+msgstr ""
+
+#: doc/classes/PhysicalBone3D.xml:112
+msgid "Sets the joint type. See [enum JointType] for possible values."
+msgstr ""
+
+#: doc/classes/PhysicalBone3D.xml:115
+msgid "Damps the body's movement if greater than [code]0[/code]."
+msgstr ""
+
+#: doc/classes/PhysicalBone3D.xml:118 doc/classes/RigidBody2D.xml:158
+#: doc/classes/RigidBody3D.xml:175
+msgid "The body's mass."
+msgstr ""
+
+#: doc/classes/PhysicalBone3D.xml:121 doc/classes/RigidBody3D.xml:188
+msgid ""
+"The body's weight based on its mass and the global 3D gravity. Global values "
+"are set in [b]Project > Project Settings > Physics > 3d[/b]."
+msgstr ""
+
#: doc/classes/PhysicalSkyMaterial.xml:4
msgid "[Sky] [Material] used for a physically based sky."
msgstr ""
@@ -35255,17 +35248,6 @@ msgstr ""
msgid "The body's transformation matrix."
msgstr ""
-#: doc/classes/PhysicsDirectBodyState2DSW.xml:4
-msgid "Software implementation of [PhysicsDirectBodyState2D]."
-msgstr ""
-
-#: doc/classes/PhysicsDirectBodyState2DSW.xml:7
-msgid ""
-"Software implementation of [PhysicsDirectBodyState2D]. This object exposes "
-"no new methods or properties and should not be used, as "
-"[PhysicsDirectBodyState2D] selects the best implementation available."
-msgstr ""
-
#: doc/classes/PhysicsDirectBodyState3D.xml:4
msgid "Direct access object to a physics body in the [PhysicsServer3D]."
msgstr ""
@@ -35278,7 +35260,7 @@ msgid ""
"direct state of that body. See [method RigidBody3D._integrate_forces]."
msgstr ""
-#: doc/classes/PhysicsDirectBodyState3D.xml:18 doc/classes/RigidBody3D.xml:31
+#: doc/classes/PhysicsDirectBodyState3D.xml:18
msgid ""
"Adds a constant directional force without affecting rotation.\n"
"This is equivalent to [code]add_force(force, Vector3(0,0,0))[/code]."
@@ -35455,7 +35437,7 @@ msgid ""
"will occur. If no collision is detected, the returned array will be [code]"
"[1, 1][/code].\n"
"If the shape can not move, the returned array will be [code][0, 0][/code] "
-"under Bullet, and empty under GodotPhysics."
+"under Bullet, and empty under GodotPhysics3D."
msgstr ""
#: doc/classes/PhysicsDirectSpaceState3D.xml:33
@@ -35526,12 +35508,6 @@ msgid ""
"Provides a means of modifying the collision properties of a [PhysicsBody3D]."
msgstr ""
-#: doc/classes/PhysicsMaterial.xml:17
-msgid ""
-"The body's bounciness. Values range from [code]0[/code] (no bounce) to "
-"[code]1[/code] (full bounciness)."
-msgstr ""
-
#: doc/classes/PhysicsMaterial.xml:20
msgid ""
"The body's friction. Values range from [code]0[/code] (frictionless) to "
@@ -35772,7 +35748,7 @@ msgid ""
msgstr ""
#: doc/classes/PhysicsServer2D.xml:620 doc/classes/PhysicsServer3D.xml:637
-#: doc/classes/RigidBody3D.xml:119
+#: doc/classes/RigidBody3D.xml:120
msgid ""
"Sets an axis velocity. The velocity in the given vector axis will be set as "
"the given vector length. This is useful for jumping behavior."
@@ -36288,16 +36264,6 @@ msgid ""
"Constant to get the number of space regions where a collision could occur."
msgstr ""
-#: doc/classes/PhysicsServer2DSW.xml:4
-msgid "Software implementation of [PhysicsServer2D]."
-msgstr ""
-
-#: doc/classes/PhysicsServer2DSW.xml:7
-msgid ""
-"This class exposes no new methods or properties and should not be used, as "
-"[PhysicsServer2D] automatically selects the best implementation available."
-msgstr ""
-
#: doc/classes/PhysicsServer3D.xml:4
msgid "Server interface for low-level physics access."
msgstr ""
@@ -37959,12 +37925,8 @@ msgid "Distance from center of sun where it fades out completely."
msgstr ""
#: doc/classes/ProceduralSkyMaterial.xml:44
-msgid "Distance from sun where it goes from solid to starting to fade."
-msgstr ""
-
-#: doc/classes/ProceduralSkyMaterial.xml:47
msgid ""
-"How quickly the sun fades away between [member sun_angle_min] and [member "
+"How quickly the sun fades away between the edge of the sun disk and [member "
"sun_angle_max]."
msgstr ""
@@ -38299,28 +38261,42 @@ msgstr ""
#: doc/classes/ProjectSettings.xml:263
msgid ""
-"Default compression level for gzip. Affects compressed scenes and resources."
+"The default compression level for gzip. Affects compressed scenes and "
+"resources. Higher levels result in smaller files at the cost of compression "
+"speed. Decompression speed is mostly unaffected by the compression level. "
+"[code]-1[/code] uses the default gzip compression level, which is identical "
+"to [code]6[/code] but could change in the future due to underlying zlib "
+"updates."
msgstr ""
#: doc/classes/ProjectSettings.xml:266
msgid ""
-"Default compression level for Zlib. Affects compressed scenes and resources."
+"The default compression level for Zlib. Affects compressed scenes and "
+"resources. Higher levels result in smaller files at the cost of compression "
+"speed. Decompression speed is mostly unaffected by the compression level. "
+"[code]-1[/code] uses the default gzip compression level, which is identical "
+"to [code]6[/code] but could change in the future due to underlying zlib "
+"updates."
msgstr ""
#: doc/classes/ProjectSettings.xml:269
msgid ""
-"Default compression level for Zstandard. Affects compressed scenes and "
-"resources."
+"The default compression level for Zstandard. Affects compressed scenes and "
+"resources. Higher levels result in smaller files at the cost of compression "
+"speed. Decompression speed is mostly unaffected by the compression level."
msgstr ""
#: doc/classes/ProjectSettings.xml:272
-msgid "Enables long-distance matching in Zstandard."
+msgid ""
+"Enables [url=https://github.com/facebook/zstd/releases/tag/v1.3.2]long-"
+"distance matching[/url] in Zstandard."
msgstr ""
#: doc/classes/ProjectSettings.xml:275
msgid ""
"Largest size limit (in power of 2) allowed when compressing using long-"
-"distance matching with Zstandard."
+"distance matching with Zstandard. Higher values can result in better "
+"compression, but will require more memory when compressing and decompressing."
msgstr ""
#: doc/classes/ProjectSettings.xml:278
@@ -38701,37 +38677,37 @@ msgid ""
"UWP to follow interface conventions."
msgstr ""
-#: doc/classes/ProjectSettings.xml:473
+#: doc/classes/ProjectSettings.xml:475
msgid ""
"Path to a custom [Theme] resource file to use for the project ([code]theme[/"
"code] or generic [code]tres[/code]/[code]res[/code] extension)."
msgstr ""
-#: doc/classes/ProjectSettings.xml:476
+#: doc/classes/ProjectSettings.xml:478
msgid ""
"Path to a custom [Font] resource to use as default for all GUI elements of "
"the project."
msgstr ""
-#: doc/classes/ProjectSettings.xml:479
+#: doc/classes/ProjectSettings.xml:481
msgid "If [code]true[/code], makes sure the theme used works with HiDPI."
msgstr ""
-#: doc/classes/ProjectSettings.xml:482
+#: doc/classes/ProjectSettings.xml:484
msgid ""
"Timer setting for incremental search in [Tree], [ItemList], etc. controls "
"(in milliseconds)."
msgstr ""
-#: doc/classes/ProjectSettings.xml:485
+#: doc/classes/ProjectSettings.xml:487
msgid "Timer for detecting idle in [TextEdit] (in seconds)."
msgstr ""
-#: doc/classes/ProjectSettings.xml:488
+#: doc/classes/ProjectSettings.xml:490
msgid "Default delay for tooltips (in seconds)."
msgstr ""
-#: doc/classes/ProjectSettings.xml:491
+#: doc/classes/ProjectSettings.xml:493
msgid ""
"Default [InputEventAction] to confirm a focused button, menu or list item, "
"or validate input.\n"
@@ -38740,7 +38716,7 @@ msgid ""
"to the action can however be modified."
msgstr ""
-#: doc/classes/ProjectSettings.xml:495
+#: doc/classes/ProjectSettings.xml:497
msgid ""
"Default [InputEventAction] to discard a modal or pending input.\n"
"[b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are "
@@ -38748,7 +38724,7 @@ msgid ""
"to the action can however be modified."
msgstr ""
-#: doc/classes/ProjectSettings.xml:499
+#: doc/classes/ProjectSettings.xml:501
msgid ""
"Default [InputEventAction] to move down in the UI.\n"
"[b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are "
@@ -38756,7 +38732,7 @@ msgid ""
"to the action can however be modified."
msgstr ""
-#: doc/classes/ProjectSettings.xml:503
+#: doc/classes/ProjectSettings.xml:505
msgid ""
"Default [InputEventAction] to go to the end position of a [Control] (e.g. "
"last item in an [ItemList] or a [Tree]), matching the behavior of [constant "
@@ -38766,7 +38742,7 @@ msgid ""
"to the action can however be modified."
msgstr ""
-#: doc/classes/ProjectSettings.xml:507
+#: doc/classes/ProjectSettings.xml:509
msgid ""
"Default [InputEventAction] to focus the next [Control] in the scene. The "
"focus behavior can be configured via [member Control.focus_next].\n"
@@ -38775,7 +38751,7 @@ msgid ""
"to the action can however be modified."
msgstr ""
-#: doc/classes/ProjectSettings.xml:511
+#: doc/classes/ProjectSettings.xml:513
msgid ""
"Default [InputEventAction] to focus the previous [Control] in the scene. The "
"focus behavior can be configured via [member Control.focus_previous].\n"
@@ -38784,7 +38760,7 @@ msgid ""
"to the action can however be modified."
msgstr ""
-#: doc/classes/ProjectSettings.xml:515
+#: doc/classes/ProjectSettings.xml:517
msgid ""
"Default [InputEventAction] to go to the start position of a [Control] (e.g. "
"first item in an [ItemList] or a [Tree]), matching the behavior of [constant "
@@ -38794,7 +38770,7 @@ msgid ""
"to the action can however be modified."
msgstr ""
-#: doc/classes/ProjectSettings.xml:519
+#: doc/classes/ProjectSettings.xml:521
msgid ""
"Default [InputEventAction] to move left in the UI.\n"
"[b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are "
@@ -38802,7 +38778,7 @@ msgid ""
"to the action can however be modified."
msgstr ""
-#: doc/classes/ProjectSettings.xml:523
+#: doc/classes/ProjectSettings.xml:525
msgid ""
"Default [InputEventAction] to go down a page in a [Control] (e.g. in an "
"[ItemList] or a [Tree]), matching the behavior of [constant KEY_PAGEDOWN] on "
@@ -38812,7 +38788,7 @@ msgid ""
"to the action can however be modified."
msgstr ""
-#: doc/classes/ProjectSettings.xml:527
+#: doc/classes/ProjectSettings.xml:529
msgid ""
"Default [InputEventAction] to go up a page in a [Control] (e.g. in an "
"[ItemList] or a [Tree]), matching the behavior of [constant KEY_PAGEUP] on "
@@ -38822,7 +38798,7 @@ msgid ""
"to the action can however be modified."
msgstr ""
-#: doc/classes/ProjectSettings.xml:531
+#: doc/classes/ProjectSettings.xml:533
msgid ""
"Default [InputEventAction] to move right in the UI.\n"
"[b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are "
@@ -38830,7 +38806,7 @@ msgid ""
"to the action can however be modified."
msgstr ""
-#: doc/classes/ProjectSettings.xml:535
+#: doc/classes/ProjectSettings.xml:537
msgid ""
"Default [InputEventAction] to select an item in a [Control] (e.g. in an "
"[ItemList] or a [Tree]).\n"
@@ -38839,7 +38815,7 @@ msgid ""
"to the action can however be modified."
msgstr ""
-#: doc/classes/ProjectSettings.xml:539
+#: doc/classes/ProjectSettings.xml:541
msgid ""
"Default [InputEventAction] to move up in the UI.\n"
"[b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are "
@@ -38847,371 +38823,371 @@ msgid ""
"to the action can however be modified."
msgstr ""
-#: doc/classes/ProjectSettings.xml:543
+#: doc/classes/ProjectSettings.xml:545
msgid ""
"If [code]true[/code], sends mouse input events when tapping or swiping on "
"the touchscreen."
msgstr ""
-#: doc/classes/ProjectSettings.xml:546
+#: doc/classes/ProjectSettings.xml:548
msgid ""
"If [code]true[/code], sends touch input events when clicking or dragging the "
"mouse."
msgstr ""
-#: doc/classes/ProjectSettings.xml:549
+#: doc/classes/ProjectSettings.xml:551
msgid "Optional name for the 2D physics layer 1."
msgstr ""
-#: doc/classes/ProjectSettings.xml:552
+#: doc/classes/ProjectSettings.xml:554
msgid "Optional name for the 2D physics layer 10."
msgstr ""
-#: doc/classes/ProjectSettings.xml:555
+#: doc/classes/ProjectSettings.xml:557
msgid "Optional name for the 2D physics layer 11."
msgstr ""
-#: doc/classes/ProjectSettings.xml:558
+#: doc/classes/ProjectSettings.xml:560
msgid "Optional name for the 2D physics layer 12."
msgstr ""
-#: doc/classes/ProjectSettings.xml:561
+#: doc/classes/ProjectSettings.xml:563
msgid "Optional name for the 2D physics layer 13."
msgstr ""
-#: doc/classes/ProjectSettings.xml:564
+#: doc/classes/ProjectSettings.xml:566
msgid "Optional name for the 2D physics layer 14."
msgstr ""
-#: doc/classes/ProjectSettings.xml:567
+#: doc/classes/ProjectSettings.xml:569
msgid "Optional name for the 2D physics layer 15."
msgstr ""
-#: doc/classes/ProjectSettings.xml:570
+#: doc/classes/ProjectSettings.xml:572
msgid "Optional name for the 2D physics layer 16."
msgstr ""
-#: doc/classes/ProjectSettings.xml:573
+#: doc/classes/ProjectSettings.xml:575
msgid "Optional name for the 2D physics layer 17."
msgstr ""
-#: doc/classes/ProjectSettings.xml:576
+#: doc/classes/ProjectSettings.xml:578
msgid "Optional name for the 2D physics layer 18."
msgstr ""
-#: doc/classes/ProjectSettings.xml:579
+#: doc/classes/ProjectSettings.xml:581
msgid "Optional name for the 2D physics layer 19."
msgstr ""
-#: doc/classes/ProjectSettings.xml:582
+#: doc/classes/ProjectSettings.xml:584
msgid "Optional name for the 2D physics layer 2."
msgstr ""
-#: doc/classes/ProjectSettings.xml:585
+#: doc/classes/ProjectSettings.xml:587
msgid "Optional name for the 2D physics layer 20."
msgstr ""
-#: doc/classes/ProjectSettings.xml:588
+#: doc/classes/ProjectSettings.xml:590
msgid "Optional name for the 2D physics layer 3."
msgstr ""
-#: doc/classes/ProjectSettings.xml:591
+#: doc/classes/ProjectSettings.xml:593
msgid "Optional name for the 2D physics layer 4."
msgstr ""
-#: doc/classes/ProjectSettings.xml:594
+#: doc/classes/ProjectSettings.xml:596
msgid "Optional name for the 2D physics layer 5."
msgstr ""
-#: doc/classes/ProjectSettings.xml:597
+#: doc/classes/ProjectSettings.xml:599
msgid "Optional name for the 2D physics layer 6."
msgstr ""
-#: doc/classes/ProjectSettings.xml:600
+#: doc/classes/ProjectSettings.xml:602
msgid "Optional name for the 2D physics layer 7."
msgstr ""
-#: doc/classes/ProjectSettings.xml:603
+#: doc/classes/ProjectSettings.xml:605
msgid "Optional name for the 2D physics layer 8."
msgstr ""
-#: doc/classes/ProjectSettings.xml:606
+#: doc/classes/ProjectSettings.xml:608
msgid "Optional name for the 2D physics layer 9."
msgstr ""
-#: doc/classes/ProjectSettings.xml:609
+#: doc/classes/ProjectSettings.xml:611
msgid "Optional name for the 2D render layer 1."
msgstr ""
-#: doc/classes/ProjectSettings.xml:612
+#: doc/classes/ProjectSettings.xml:614
msgid "Optional name for the 2D render layer 10."
msgstr ""
-#: doc/classes/ProjectSettings.xml:615
+#: doc/classes/ProjectSettings.xml:617
msgid "Optional name for the 2D render layer 11."
msgstr ""
-#: doc/classes/ProjectSettings.xml:618
+#: doc/classes/ProjectSettings.xml:620
msgid "Optional name for the 2D render layer 12."
msgstr ""
-#: doc/classes/ProjectSettings.xml:621
+#: doc/classes/ProjectSettings.xml:623
msgid "Optional name for the 2D render layer 13."
msgstr ""
-#: doc/classes/ProjectSettings.xml:624
+#: doc/classes/ProjectSettings.xml:626
msgid "Optional name for the 2D render layer 14."
msgstr ""
-#: doc/classes/ProjectSettings.xml:627
+#: doc/classes/ProjectSettings.xml:629
msgid "Optional name for the 2D render layer 15."
msgstr ""
-#: doc/classes/ProjectSettings.xml:630
+#: doc/classes/ProjectSettings.xml:632
msgid "Optional name for the 2D render layer 16."
msgstr ""
-#: doc/classes/ProjectSettings.xml:633
+#: doc/classes/ProjectSettings.xml:635
msgid "Optional name for the 2D render layer 17."
msgstr ""
-#: doc/classes/ProjectSettings.xml:636
+#: doc/classes/ProjectSettings.xml:638
msgid "Optional name for the 2D render layer 18."
msgstr ""
-#: doc/classes/ProjectSettings.xml:639
+#: doc/classes/ProjectSettings.xml:641
msgid "Optional name for the 2D render layer 19."
msgstr ""
-#: doc/classes/ProjectSettings.xml:642
+#: doc/classes/ProjectSettings.xml:644
msgid "Optional name for the 2D render layer 2."
msgstr ""
-#: doc/classes/ProjectSettings.xml:645
+#: doc/classes/ProjectSettings.xml:647
msgid "Optional name for the 2D render layer 20."
msgstr ""
-#: doc/classes/ProjectSettings.xml:648
+#: doc/classes/ProjectSettings.xml:650
msgid "Optional name for the 2D render layer 3."
msgstr ""
-#: doc/classes/ProjectSettings.xml:651
+#: doc/classes/ProjectSettings.xml:653
msgid "Optional name for the 2D render layer 4."
msgstr ""
-#: doc/classes/ProjectSettings.xml:654
+#: doc/classes/ProjectSettings.xml:656
msgid "Optional name for the 2D render layer 5."
msgstr ""
-#: doc/classes/ProjectSettings.xml:657
+#: doc/classes/ProjectSettings.xml:659
msgid "Optional name for the 2D render layer 6."
msgstr ""
-#: doc/classes/ProjectSettings.xml:660
+#: doc/classes/ProjectSettings.xml:662
msgid "Optional name for the 2D render layer 7."
msgstr ""
-#: doc/classes/ProjectSettings.xml:663
+#: doc/classes/ProjectSettings.xml:665
msgid "Optional name for the 2D render layer 8."
msgstr ""
-#: doc/classes/ProjectSettings.xml:666
+#: doc/classes/ProjectSettings.xml:668
msgid "Optional name for the 2D render layer 9."
msgstr ""
-#: doc/classes/ProjectSettings.xml:669
+#: doc/classes/ProjectSettings.xml:671
msgid "Optional name for the 3D physics layer 1."
msgstr ""
-#: doc/classes/ProjectSettings.xml:672
+#: doc/classes/ProjectSettings.xml:674
msgid "Optional name for the 3D physics layer 10."
msgstr ""
-#: doc/classes/ProjectSettings.xml:675
+#: doc/classes/ProjectSettings.xml:677
msgid "Optional name for the 3D physics layer 11."
msgstr ""
-#: doc/classes/ProjectSettings.xml:678
+#: doc/classes/ProjectSettings.xml:680
msgid "Optional name for the 3D physics layer 12."
msgstr ""
-#: doc/classes/ProjectSettings.xml:681
+#: doc/classes/ProjectSettings.xml:683
msgid "Optional name for the 3D physics layer 13."
msgstr ""
-#: doc/classes/ProjectSettings.xml:684
+#: doc/classes/ProjectSettings.xml:686
msgid "Optional name for the 3D physics layer 14."
msgstr ""
-#: doc/classes/ProjectSettings.xml:687
+#: doc/classes/ProjectSettings.xml:689
msgid "Optional name for the 3D physics layer 15."
msgstr ""
-#: doc/classes/ProjectSettings.xml:690
+#: doc/classes/ProjectSettings.xml:692
msgid "Optional name for the 3D physics layer 16."
msgstr ""
-#: doc/classes/ProjectSettings.xml:693
+#: doc/classes/ProjectSettings.xml:695
msgid "Optional name for the 3D physics layer 17."
msgstr ""
-#: doc/classes/ProjectSettings.xml:696
+#: doc/classes/ProjectSettings.xml:698
msgid "Optional name for the 3D physics layer 18."
msgstr ""
-#: doc/classes/ProjectSettings.xml:699
+#: doc/classes/ProjectSettings.xml:701
msgid "Optional name for the 3D physics layer 19."
msgstr ""
-#: doc/classes/ProjectSettings.xml:702
+#: doc/classes/ProjectSettings.xml:704
msgid "Optional name for the 3D physics layer 2."
msgstr ""
-#: doc/classes/ProjectSettings.xml:705
+#: doc/classes/ProjectSettings.xml:707
msgid "Optional name for the 3D physics layer 20."
msgstr ""
-#: doc/classes/ProjectSettings.xml:708
+#: doc/classes/ProjectSettings.xml:710
msgid "Optional name for the 3D physics layer 3."
msgstr ""
-#: doc/classes/ProjectSettings.xml:711
+#: doc/classes/ProjectSettings.xml:713
msgid "Optional name for the 3D physics layer 4."
msgstr ""
-#: doc/classes/ProjectSettings.xml:714
+#: doc/classes/ProjectSettings.xml:716
msgid "Optional name for the 3D physics layer 5."
msgstr ""
-#: doc/classes/ProjectSettings.xml:717
+#: doc/classes/ProjectSettings.xml:719
msgid "Optional name for the 3D physics layer 6."
msgstr ""
-#: doc/classes/ProjectSettings.xml:720
+#: doc/classes/ProjectSettings.xml:722
msgid "Optional name for the 3D physics layer 7."
msgstr ""
-#: doc/classes/ProjectSettings.xml:723
+#: doc/classes/ProjectSettings.xml:725
msgid "Optional name for the 3D physics layer 8."
msgstr ""
-#: doc/classes/ProjectSettings.xml:726
+#: doc/classes/ProjectSettings.xml:728
msgid "Optional name for the 3D physics layer 9."
msgstr ""
-#: doc/classes/ProjectSettings.xml:729
+#: doc/classes/ProjectSettings.xml:731
msgid "Optional name for the 3D render layer 1."
msgstr ""
-#: doc/classes/ProjectSettings.xml:732
+#: doc/classes/ProjectSettings.xml:734
msgid "Optional name for the 3D render layer 10."
msgstr ""
-#: doc/classes/ProjectSettings.xml:735
+#: doc/classes/ProjectSettings.xml:737
msgid "Optional name for the 3D render layer 11."
msgstr ""
-#: doc/classes/ProjectSettings.xml:738
+#: doc/classes/ProjectSettings.xml:740
msgid "Optional name for the 3D render layer 12."
msgstr ""
-#: doc/classes/ProjectSettings.xml:741
+#: doc/classes/ProjectSettings.xml:743
msgid "Optional name for the 3D render layer 13."
msgstr ""
-#: doc/classes/ProjectSettings.xml:744
+#: doc/classes/ProjectSettings.xml:746
msgid "Optional name for the 3D render layer 14"
msgstr ""
-#: doc/classes/ProjectSettings.xml:747
+#: doc/classes/ProjectSettings.xml:749
msgid "Optional name for the 3D render layer 15."
msgstr ""
-#: doc/classes/ProjectSettings.xml:750
+#: doc/classes/ProjectSettings.xml:752
msgid "Optional name for the 3D render layer 16."
msgstr ""
-#: doc/classes/ProjectSettings.xml:753
+#: doc/classes/ProjectSettings.xml:755
msgid "Optional name for the 3D render layer 17."
msgstr ""
-#: doc/classes/ProjectSettings.xml:756
+#: doc/classes/ProjectSettings.xml:758
msgid "Optional name for the 3D render layer 18."
msgstr ""
-#: doc/classes/ProjectSettings.xml:759
+#: doc/classes/ProjectSettings.xml:761
msgid "Optional name for the 3D render layer 19."
msgstr ""
-#: doc/classes/ProjectSettings.xml:762
+#: doc/classes/ProjectSettings.xml:764
msgid "Optional name for the 3D render layer 2."
msgstr ""
-#: doc/classes/ProjectSettings.xml:765
+#: doc/classes/ProjectSettings.xml:767
msgid "Optional name for the 3D render layer 20."
msgstr ""
-#: doc/classes/ProjectSettings.xml:768
+#: doc/classes/ProjectSettings.xml:770
msgid "Optional name for the 3D render layer 3."
msgstr ""
-#: doc/classes/ProjectSettings.xml:771
+#: doc/classes/ProjectSettings.xml:773
msgid "Optional name for the 3D render layer 4."
msgstr ""
-#: doc/classes/ProjectSettings.xml:774
+#: doc/classes/ProjectSettings.xml:776
msgid "Optional name for the 3D render layer 5."
msgstr ""
-#: doc/classes/ProjectSettings.xml:777
+#: doc/classes/ProjectSettings.xml:779
msgid "Optional name for the 3D render layer 6."
msgstr ""
-#: doc/classes/ProjectSettings.xml:780
+#: doc/classes/ProjectSettings.xml:782
msgid "Optional name for the 3D render layer 7."
msgstr ""
-#: doc/classes/ProjectSettings.xml:783
+#: doc/classes/ProjectSettings.xml:785
msgid "Optional name for the 3D render layer 8."
msgstr ""
-#: doc/classes/ProjectSettings.xml:786
+#: doc/classes/ProjectSettings.xml:788
msgid "Optional name for the 3D render layer 9."
msgstr ""
-#: doc/classes/ProjectSettings.xml:789
+#: doc/classes/ProjectSettings.xml:791
msgid ""
"The locale to fall back to if a translation isn't available in a given "
"language. If left empty, [code]en[/code] (English) will be used."
msgstr ""
-#: doc/classes/ProjectSettings.xml:792
+#: doc/classes/ProjectSettings.xml:794
msgid ""
"If non-empty, this locale will be used when running the project from the "
"editor."
msgstr ""
-#: doc/classes/ProjectSettings.xml:795
+#: doc/classes/ProjectSettings.xml:797
msgid "If [code]true[/code], logs all output to files."
msgstr ""
-#: doc/classes/ProjectSettings.xml:798
+#: doc/classes/ProjectSettings.xml:800
msgid ""
"Path to logs within the project. Using an [code]user://[/code] path is "
"recommended."
msgstr ""
-#: doc/classes/ProjectSettings.xml:801
+#: doc/classes/ProjectSettings.xml:803
msgid "Specifies the maximum amount of log files allowed (used for rotation)."
msgstr ""
-#: doc/classes/ProjectSettings.xml:804
+#: doc/classes/ProjectSettings.xml:806
msgid ""
"Godot uses a message queue to defer some function calls. If you run out of "
"space on it (you will see an error), you can increase the size here."
msgstr ""
-#: doc/classes/ProjectSettings.xml:807
+#: doc/classes/ProjectSettings.xml:809
msgid ""
"This is used by servers when used in multi-threading mode (servers and "
"visual). RIDs are preallocated to avoid stalling the server requesting them "
@@ -39219,118 +39195,118 @@ msgid ""
"thread, increase this number."
msgstr ""
-#: doc/classes/ProjectSettings.xml:822
+#: doc/classes/ProjectSettings.xml:824
msgid ""
"Maximum amount of characters allowed to send as output from the debugger. "
"Over this value, content is dropped. This helps not to stall the debugger "
"connection."
msgstr ""
-#: doc/classes/ProjectSettings.xml:825
+#: doc/classes/ProjectSettings.xml:827
msgid ""
"Maximum number of errors allowed to be sent from the debugger. Over this "
"value, content is dropped. This helps not to stall the debugger connection."
msgstr ""
-#: doc/classes/ProjectSettings.xml:828
+#: doc/classes/ProjectSettings.xml:830
msgid ""
"Maximum amount of messages in the debugger queue. Over this value, content "
"is dropped. This helps to limit the debugger memory usage."
msgstr ""
-#: doc/classes/ProjectSettings.xml:831
+#: doc/classes/ProjectSettings.xml:833
msgid ""
"Maximum number of warnings allowed to be sent from the debugger. Over this "
"value, content is dropped. This helps not to stall the debugger connection."
msgstr ""
-#: doc/classes/ProjectSettings.xml:834
+#: doc/classes/ProjectSettings.xml:836
msgid ""
"Default size of packet peer stream for deserializing Godot data. Over this "
"size, data is dropped."
msgstr ""
-#: doc/classes/ProjectSettings.xml:837
+#: doc/classes/ProjectSettings.xml:839
msgid "Timeout (in seconds) for connection attempts using TCP."
msgstr ""
-#: doc/classes/ProjectSettings.xml:840
+#: doc/classes/ProjectSettings.xml:842
msgid "Maximum size (in kiB) for the [WebRTCDataChannel] input buffer."
msgstr ""
-#: doc/classes/ProjectSettings.xml:843
+#: doc/classes/ProjectSettings.xml:845
msgid "Maximum size (in kiB) for the [WebSocketClient] input buffer."
msgstr ""
-#: doc/classes/ProjectSettings.xml:846
+#: doc/classes/ProjectSettings.xml:848
msgid "Maximum number of concurrent input packets for [WebSocketClient]."
msgstr ""
-#: doc/classes/ProjectSettings.xml:849
+#: doc/classes/ProjectSettings.xml:851
msgid "Maximum size (in kiB) for the [WebSocketClient] output buffer."
msgstr ""
-#: doc/classes/ProjectSettings.xml:852
+#: doc/classes/ProjectSettings.xml:854
msgid "Maximum number of concurrent output packets for [WebSocketClient]."
msgstr ""
-#: doc/classes/ProjectSettings.xml:855
+#: doc/classes/ProjectSettings.xml:857
msgid "Maximum size (in kiB) for the [WebSocketServer] input buffer."
msgstr ""
-#: doc/classes/ProjectSettings.xml:858
+#: doc/classes/ProjectSettings.xml:860
msgid "Maximum number of concurrent input packets for [WebSocketServer]."
msgstr ""
-#: doc/classes/ProjectSettings.xml:861
+#: doc/classes/ProjectSettings.xml:863
msgid "Maximum size (in kiB) for the [WebSocketServer] output buffer."
msgstr ""
-#: doc/classes/ProjectSettings.xml:864
+#: doc/classes/ProjectSettings.xml:866
msgid "Maximum number of concurrent output packets for [WebSocketServer]."
msgstr ""
-#: doc/classes/ProjectSettings.xml:867
+#: doc/classes/ProjectSettings.xml:869
msgid ""
"Amount of read ahead used by remote filesystem. Higher values decrease the "
"effects of latency at the cost of higher bandwidth usage."
msgstr ""
-#: doc/classes/ProjectSettings.xml:870
+#: doc/classes/ProjectSettings.xml:872
msgid "Page size used by remote filesystem (in bytes)."
msgstr ""
-#: doc/classes/ProjectSettings.xml:873
+#: doc/classes/ProjectSettings.xml:875
msgid ""
"CA certificates bundle to use for SSL connections. If not defined, Godot's "
"internal CA certificates are used."
msgstr ""
-#: doc/classes/ProjectSettings.xml:876
+#: doc/classes/ProjectSettings.xml:878
msgid ""
"When creating node names automatically, set the type of casing in this "
"project. This is mostly an editor setting."
msgstr ""
-#: doc/classes/ProjectSettings.xml:879
+#: doc/classes/ProjectSettings.xml:881
msgid ""
"What to use to separate node name from number. This is mostly an editor "
"setting."
msgstr ""
-#: doc/classes/ProjectSettings.xml:882
+#: doc/classes/ProjectSettings.xml:884
msgid "Size of the hash table used for the broad-phase 2D hash grid algorithm."
msgstr ""
-#: doc/classes/ProjectSettings.xml:885
+#: doc/classes/ProjectSettings.xml:887
msgid "Cell size used for the broad-phase 2D hash grid algorithm."
msgstr ""
-#: doc/classes/ProjectSettings.xml:888
+#: doc/classes/ProjectSettings.xml:890
msgid "The default angular damp in 2D."
msgstr ""
-#: doc/classes/ProjectSettings.xml:891
+#: doc/classes/ProjectSettings.xml:893
msgid ""
"The default gravity strength in 2D.\n"
"[b]Note:[/b] This property is only read when the project starts. To change "
@@ -39342,7 +39318,7 @@ msgid ""
"[/codeblock]"
msgstr ""
-#: doc/classes/ProjectSettings.xml:899
+#: doc/classes/ProjectSettings.xml:901
msgid ""
"The default gravity direction in 2D.\n"
"[b]Note:[/b] This property is only read when the project starts. To change "
@@ -39354,38 +39330,38 @@ msgid ""
"[/codeblock]"
msgstr ""
-#: doc/classes/ProjectSettings.xml:907
+#: doc/classes/ProjectSettings.xml:909
msgid "The default linear damp in 2D."
msgstr ""
-#: doc/classes/ProjectSettings.xml:910
+#: doc/classes/ProjectSettings.xml:912
msgid ""
"Threshold defining the surface size that constitutes a large object with "
"regard to cells in the broad-phase 2D hash grid algorithm."
msgstr ""
-#: doc/classes/ProjectSettings.xml:913
+#: doc/classes/ProjectSettings.xml:915
msgid ""
"Sets which physics engine to use for 2D physics.\n"
-"\"DEFAULT\" and \"GodotPhysics\" are the same, as there is currently no "
+"\"DEFAULT\" and \"GodotPhysics2D\" are the same, as there is currently no "
"alternative 2D physics server implemented."
msgstr ""
-#: doc/classes/ProjectSettings.xml:917
+#: doc/classes/ProjectSettings.xml:919
msgid ""
"Threshold angular velocity under which a 2D physics body will be considered "
"inactive. See [constant PhysicsServer2D."
"SPACE_PARAM_BODY_ANGULAR_VELOCITY_SLEEP_THRESHOLD]."
msgstr ""
-#: doc/classes/ProjectSettings.xml:920
+#: doc/classes/ProjectSettings.xml:922
msgid ""
"Threshold linear velocity under which a 2D physics body will be considered "
"inactive. See [constant PhysicsServer2D."
"SPACE_PARAM_BODY_LINEAR_VELOCITY_SLEEP_THRESHOLD]."
msgstr ""
-#: doc/classes/ProjectSettings.xml:923
+#: doc/classes/ProjectSettings.xml:925
msgid ""
"Sets whether physics is run on the main thread or a separate one. Running "
"the server on a thread increases performance, but restricts API access to "
@@ -39395,23 +39371,23 @@ msgid ""
"give you extra performance and no regressions when using it."
msgstr ""
-#: doc/classes/ProjectSettings.xml:927
+#: doc/classes/ProjectSettings.xml:929
msgid ""
"Time (in seconds) of inactivity before which a 2D physics body will put to "
"sleep. See [constant PhysicsServer2D.SPACE_PARAM_BODY_TIME_TO_SLEEP]."
msgstr ""
-#: doc/classes/ProjectSettings.xml:930
+#: doc/classes/ProjectSettings.xml:932
msgid ""
"Sets whether the 3D physics world will be created with support for "
"[SoftBody3D] physics. Only applies to the Bullet physics engine."
msgstr ""
-#: doc/classes/ProjectSettings.xml:933
+#: doc/classes/ProjectSettings.xml:935
msgid "The default angular damp in 3D."
msgstr ""
-#: doc/classes/ProjectSettings.xml:936
+#: doc/classes/ProjectSettings.xml:938
msgid ""
"The default gravity strength in 3D.\n"
"[b]Note:[/b] This property is only read when the project starts. To change "
@@ -39423,7 +39399,7 @@ msgid ""
"[/codeblock]"
msgstr ""
-#: doc/classes/ProjectSettings.xml:944
+#: doc/classes/ProjectSettings.xml:946
msgid ""
"The default gravity direction in 3D.\n"
"[b]Note:[/b] This property is only read when the project starts. To change "
@@ -39435,23 +39411,23 @@ msgid ""
"[/codeblock]"
msgstr ""
-#: doc/classes/ProjectSettings.xml:952
+#: doc/classes/ProjectSettings.xml:954
msgid "The default linear damp in 3D."
msgstr ""
-#: doc/classes/ProjectSettings.xml:955
+#: doc/classes/ProjectSettings.xml:957
msgid ""
"Sets which physics engine to use for 3D physics.\n"
"\"DEFAULT\" is currently the [url=https://bulletphysics.org]Bullet[/url] "
-"physics engine. The \"GodotPhysics\" engine is still supported as an "
+"physics engine. The \"GodotPhysics3D\" engine is still supported as an "
"alternative."
msgstr ""
-#: doc/classes/ProjectSettings.xml:959
+#: doc/classes/ProjectSettings.xml:961
msgid "Enables [member Viewport.physics_object_picking] on the root viewport."
msgstr ""
-#: doc/classes/ProjectSettings.xml:962
+#: doc/classes/ProjectSettings.xml:964
msgid ""
"The number of fixed iterations per second. This controls how often physics "
"simulation and [method Node._physics_process] methods are run.\n"
@@ -39460,7 +39436,7 @@ msgid ""
"instead."
msgstr ""
-#: doc/classes/ProjectSettings.xml:966
+#: doc/classes/ProjectSettings.xml:968
msgid ""
"Fix to improve physics jitter, specially on monitors where refresh rate is "
"different than the physics FPS.\n"
@@ -39468,7 +39444,7 @@ msgid ""
"the physics FPS at runtime, set [member Engine.physics_jitter_fix] instead."
msgstr ""
-#: doc/classes/ProjectSettings.xml:970
+#: doc/classes/ProjectSettings.xml:972
msgid ""
"Default background clear color. Overridable per [Viewport] using its "
"[Environment]. See [member Environment.background_mode] and [member "
@@ -39476,7 +39452,7 @@ msgid ""
"programmatically, use [method RenderingServer.set_default_clear_color]."
msgstr ""
-#: doc/classes/ProjectSettings.xml:973
+#: doc/classes/ProjectSettings.xml:975
msgid ""
"[Environment] that will be used as a fallback environment in case a scene "
"does not specify its own environment. The default environment is loaded in "
@@ -39486,14 +39462,14 @@ msgid ""
"here."
msgstr ""
-#: doc/classes/ProjectSettings.xml:976
+#: doc/classes/ProjectSettings.xml:980
msgid ""
"Max amount of elements renderable in a frame. If more than this are visible "
"per frame, they will be dropped. Keep in mind elements refer to mesh "
"surfaces and not meshes themselves."
msgstr ""
-#: doc/classes/ProjectSettings.xml:979
+#: doc/classes/ProjectSettings.xml:985
msgid ""
"Some NVIDIA GPU drivers have a bug which produces flickering issues for the "
"[code]draw_rect[/code] method, especially as used in [TileMap]. Refer to "
@@ -39505,39 +39481,73 @@ msgid ""
"using the Vulkan backend."
msgstr ""
-#: doc/classes/ProjectSettings.xml:983
+#: doc/classes/ProjectSettings.xml:989
msgid ""
"If [code]true[/code], forces snapping of polygons to pixels in 2D rendering. "
"May help in some pixel art styles."
msgstr ""
-#: doc/classes/ProjectSettings.xml:986
+#: doc/classes/ProjectSettings.xml:992
+msgid ""
+"Sets the quality of the depth of field effect. Higher quality takes more "
+"samples, which is slower but looks smoother."
+msgstr ""
+
+#: doc/classes/ProjectSettings.xml:995
+msgid ""
+"Sets the depth of field shape. Can be Box, Hexagon, or Circle. Box is the "
+"fastest. Circle is the most realistic, but also the most expensive to "
+"compute."
+msgstr ""
+
+#: doc/classes/ProjectSettings.xml:998
+msgid ""
+"If [code]true[/code], jitters DOF samples to make effect slightly blurrier "
+"and hide lines created from low sample rates. This can result in a slightly "
+"grainy appearance when used with a low number of samples."
+msgstr ""
+
+#: doc/classes/ProjectSettings.xml:1001
msgid ""
"Disables depth pre-pass for some GPU vendors (usually mobile), as their "
"architecture already does this."
msgstr ""
-#: doc/classes/ProjectSettings.xml:989
+#: doc/classes/ProjectSettings.xml:1004
msgid ""
"If [code]true[/code], performs a previous depth pass before rendering "
"materials. This increases performance in scenes with high overdraw, when "
"complex materials and lighting are used."
msgstr ""
-#: doc/classes/ProjectSettings.xml:992
+#: doc/classes/ProjectSettings.xml:1007
msgid ""
"The directional shadow's size in pixels. Higher values will result in "
"sharper shadows, at the cost of performance. The value will be rounded up to "
"the nearest power of 2."
msgstr ""
-#: doc/classes/ProjectSettings.xml:995
+#: doc/classes/ProjectSettings.xml:1010
msgid ""
"Lower-end override for [member rendering/quality/directional_shadow/size] on "
"mobile devices, due to performance concerns or driver support."
msgstr ""
-#: doc/classes/ProjectSettings.xml:998
+#: doc/classes/ProjectSettings.xml:1013
+msgid ""
+"Quality setting for shadows cast by [DirectionalLight3D]s. Higher quality "
+"settings use more samples when reading from shadow maps and are thus slower. "
+"Low quality settings may result in shadows looking grainy."
+msgstr ""
+
+#: doc/classes/ProjectSettings.xml:1016
+msgid ""
+"Lower-end override for [member rendering/quality/directional_shadow/"
+"soft_shadow_quality] on mobile devices, due to performance concerns or "
+"driver support."
+msgstr ""
+
+#: doc/classes/ProjectSettings.xml:1019
msgid ""
"The video driver to use (\"GLES2\" or \"Vulkan\").\n"
"[b]Note:[/b] The backend in use can be overridden at runtime via the [code]--"
@@ -39547,25 +39557,33 @@ msgid ""
"get_current_video_driver[/code] to query it at run-time."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1012
+#: doc/classes/ProjectSettings.xml:1025
msgid ""
-"Sets the number of MSAA samples to use. MSAA is used to reduce aliasing "
-"around the edges of polygons. A higher MSAA value results in smoother edges "
-"but can be significantly slower on some hardware.\n"
-"[b]Note:[/b] MSAA is not available on HTML5 export using the GLES2 backend."
+"If [code]true[/code], take additional samples when rendering objects "
+"affected by a [GIProbe] to reduce artifacts from only sampling in one "
+"direction."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1020
+#: doc/classes/ProjectSettings.xml:1028
msgid ""
-"If [code]true[/code], uses nearest-neighbor mipmap filtering when using "
-"mipmaps (also called \"bilinear filtering\"), which will result in visible "
-"seams appearing between mipmap stages. This may increase performance in "
-"mobile as less memory bandwidth is used. If [code]false[/code], linear "
-"mipmap filtering (also called \"trilinear filtering\") is used."
+"Sets the number of cone samples taken when rendering objects affected by "
+"[GIProbe]s."
msgstr ""
#: doc/classes/ProjectSettings.xml:1031
msgid ""
+"Sets how the glow effect is upscaled before being copied onto the screen. "
+"Linear is faster, but looks blocky. Bicubic is slower but looks smooth."
+msgstr ""
+
+#: doc/classes/ProjectSettings.xml:1034
+msgid ""
+"Lower-end override for [member rendering/quality/glow/upscale_mode] on "
+"mobile devices, due to performance concerns or driver support."
+msgstr ""
+
+#: doc/classes/ProjectSettings.xml:1037
+msgid ""
"Strategy used for framebuffer allocation. The simpler it is, the less "
"resources it uses (but the less features it supports). If set to \"2D "
"Without Sampling\" or \"3D Without Effects\", sample buffers will not be "
@@ -39574,41 +39592,41 @@ msgid ""
"be available in the [Environment]."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1034
+#: doc/classes/ProjectSettings.xml:1040
msgid ""
"Lower-end override for [member rendering/quality/intended_usage/"
"framebuffer_allocation] on mobile devices, due to performance concerns or "
"driver support."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1037
+#: doc/classes/ProjectSettings.xml:1043
msgid ""
"Number of cubemaps to store in the reflection atlas. The number of "
"[ReflectionProbe]s in a scene will be limited by this amount. A higher "
"number requires more VRAM."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1040
+#: doc/classes/ProjectSettings.xml:1046
msgid ""
"Size of cubemap faces for [ReflectionProbe]s. A higher number requires more "
"VRAM and may make reflection probe updating slower."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1043
+#: doc/classes/ProjectSettings.xml:1049
msgid ""
"Lower-end override for [member rendering/quality/reflection_atlas/"
"reflection_size] on mobile devices, due to performance concerns or driver "
"support."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1046
+#: doc/classes/ProjectSettings.xml:1052
msgid ""
"Use a higher quality variant of the fast filtering algorithm. Significantly "
"slower than using default quality, but results in smoother reflections. "
"Should only be used when the scene is especially detailed."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1049
+#: doc/classes/ProjectSettings.xml:1055
msgid ""
"Sets the number of samples to take when using importance sampling for [Sky]s "
"and [ReflectionProbe]s. A higher value will result in smoother, higher "
@@ -39618,19 +39636,19 @@ msgid ""
"environments with a high level of detail."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1052
+#: doc/classes/ProjectSettings.xml:1058
msgid ""
"Lower-end override for [member rendering/quality/reflections/ggx_samples] on "
"mobile devices, due to performance concerns or driver support."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1055
+#: doc/classes/ProjectSettings.xml:1061
msgid ""
"Limits the number of layers to use in radiance maps when using importance "
"sampling. A lower number will be slightly faster and take up less VRAM."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1058
+#: doc/classes/ProjectSettings.xml:1064
msgid ""
"If [code]true[/code], uses texture arrays instead of mipmaps for reflection "
"probes and panorama backgrounds (sky). This reduces jitter noise and "
@@ -39639,128 +39657,229 @@ msgid ""
"memory."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1061
+#: doc/classes/ProjectSettings.xml:1067
msgid ""
"Lower-end override for [member rendering/quality/reflections/"
"texture_array_reflections] on mobile devices, due to performance concerns or "
"driver support."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1066
+#: doc/classes/ProjectSettings.xml:1070
+msgid ""
+"Sets the number of MSAA samples to use. MSAA is used to reduce aliasing "
+"around the edges of polygons. A higher MSAA value results in smoother edges "
+"but can be significantly slower on some hardware.\n"
+"[b]Note:[/b] MSAA is not available on HTML5 export using the GLES2 backend."
+msgstr ""
+
+#: doc/classes/ProjectSettings.xml:1074
+msgid ""
+"Sets the screen-space antialiasing mode for the default screen [Viewport]. "
+"Screen-space antialiasing works by selectively blurring edges in a post-"
+"process shader. It differs from MSAA which takes multiple coverage samples "
+"while rendering objects. Screen-space AA methods are typically faster than "
+"MSAA and will smooth out specular aliasing, but tend to make scenes appear "
+"blurry.\n"
+"Another way to combat specular aliasing is to enable [member rendering/"
+"quality/screen_filters/screen_space_roughness_limiter]."
+msgstr ""
+
+#: doc/classes/ProjectSettings.xml:1078
+msgid ""
+"Enables the screen-space roughness limiter which increases material "
+"roughness in areas with a high normal frequency (i.e. when normals change a "
+"lot from pixel to pixel). This helps to reduce the amount of specular "
+"aliasing in a scene. Specular aliasing looks like random bright pixels that "
+"occur in reflections."
+msgstr ""
+
+#: doc/classes/ProjectSettings.xml:1081
+msgid ""
+"Curves the amount of the roughness limited effect. A higher value limits the "
+"effect to very sharply curved surfaces, while a lower threshold extends the "
+"effect to smoother surfaces."
+msgstr ""
+
+#: doc/classes/ProjectSettings.xml:1084
+msgid ""
+"Sets the quality for rough screen-space reflections. Turning off will make "
+"all screen space reflections sharp, while higher values make rough "
+"reflections look better."
+msgstr ""
+
+#: doc/classes/ProjectSettings.xml:1087
msgid ""
"If [code]true[/code], uses faster but lower-quality Blinn model to generate "
"blurred reflections instead of the GGX model."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1069
+#: doc/classes/ProjectSettings.xml:1090
msgid ""
"Lower-end override for [member rendering/quality/shading/"
"force_blinn_over_ggx] on mobile devices, due to performance concerns or "
"driver support."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1072
+#: doc/classes/ProjectSettings.xml:1093
msgid ""
"If [code]true[/code], uses faster but lower-quality Lambert material "
"lighting model instead of Burley."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1075
+#: doc/classes/ProjectSettings.xml:1096
msgid ""
"Lower-end override for [member rendering/quality/shading/"
"force_lambert_over_burley] on mobile devices, due to performance concerns or "
"driver support."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1078
+#: doc/classes/ProjectSettings.xml:1099
msgid ""
"If [code]true[/code], forces vertex shading for all rendering. This can "
"increase performance a lot, but also reduces quality immensely. Can be used "
"to optimize performance on low-end mobile devices."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1081
+#: doc/classes/ProjectSettings.xml:1102
msgid ""
"Lower-end override for [member rendering/quality/shading/"
"force_vertex_shading] on mobile devices, due to performance concerns or "
"driver support."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1084 doc/classes/ProjectSettings.xml:1087
-#: doc/classes/ProjectSettings.xml:1090 doc/classes/ProjectSettings.xml:1093
+#: doc/classes/ProjectSettings.xml:1105 doc/classes/ProjectSettings.xml:1108
+#: doc/classes/ProjectSettings.xml:1111 doc/classes/ProjectSettings.xml:1114
msgid ""
"Subdivision quadrant size for shadow mapping. See shadow mapping "
"documentation."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1096
+#: doc/classes/ProjectSettings.xml:1117
msgid ""
"Size for shadow atlas (used for OmniLights and SpotLights). See "
"documentation."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1099
+#: doc/classes/ProjectSettings.xml:1120
msgid ""
"Lower-end override for [member rendering/quality/shadow_atlas/size] on "
"mobile devices, due to performance concerns or driver support."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1102
+#: doc/classes/ProjectSettings.xml:1123
msgid ""
-"Shadow filter mode. Higher-quality settings result in smoother shadows that "
-"flicker less when moving. \"Disabled\" is the fastest option, but also has "
-"the lowest quality. \"PCF5\" is smoother but is also slower. \"PCF13\" is "
-"the smoothest option, but is also the slowest."
+"Quality setting for shadows cast by [OmniLight3D]s and [SpotLight3D]s. "
+"Higher quality settings use more samples when reading from shadow maps and "
+"are thus slower. Low quality settings may result in shadows looking grainy."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1105
+#: doc/classes/ProjectSettings.xml:1126
msgid ""
-"Lower-end override for [member rendering/quality/shadows/filter_mode] on "
-"mobile devices, due to performance concerns or driver support."
+"Lower-end override for [member rendering/quality/shadows/"
+"soft_shadow_quality] on mobile devices, due to performance concerns or "
+"driver support."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1118
+#: doc/classes/ProjectSettings.xml:1129
+msgid ""
+"If [code]true[/code], screen-space ambient occlusion will be rendered at "
+"half size and then upscaled before being added to the scene. This is "
+"significantly faster but may miss small details."
+msgstr ""
+
+#: doc/classes/ProjectSettings.xml:1132
+msgid ""
+"Sets the quality of the screen-space ambient occlusion effect. Higher values "
+"take more samples and so will result in better quality, at the cost of "
+"performance."
+msgstr ""
+
+#: doc/classes/ProjectSettings.xml:1135
+msgid ""
+"Scales the depth over which the subsurface scattering effect is applied. A "
+"high value may allow light to scatter into a part of the mesh or another "
+"mesh that is close in screen space but far in depth."
+msgstr ""
+
+#: doc/classes/ProjectSettings.xml:1138
+msgid ""
+"Sets the quality of the subsurface scattering effect. Higher values are "
+"slower but look nicer."
+msgstr ""
+
+#: doc/classes/ProjectSettings.xml:1141
+msgid ""
+"Scales the distance over which samples are taken for subsurface scattering "
+"effect. Changing this does not impact performance, but higher values will "
+"result in significant artifacts as the samples will become obviously spread "
+"out. A lower value results in a smaller spread of scattered light."
+msgstr ""
+
+#: doc/classes/ProjectSettings.xml:1144
+msgid ""
+"Sets the maximum number of samples to take when using anisotropic filtering "
+"on textures. A higher sample count will result in sharper textures at "
+"oblique angles, but is more expensive to compute.\n"
+"Only power of two values are valid ([code]1[/code], [code]2[/code], [code]4[/"
+"code], [code]8[/code], [code]16[/code]). A value of [code]1[/code] forcibly "
+"disables anisotropic filtering, even on materials where it is enabled."
+msgstr ""
+
+#: doc/classes/ProjectSettings.xml:1148
+msgid ""
+"If [code]true[/code], uses nearest-neighbor mipmap filtering when using "
+"mipmaps (also called \"bilinear filtering\"), which will result in visible "
+"seams appearing between mipmap stages. This may increase performance in "
+"mobile as less memory bandwidth is used. If [code]false[/code], linear "
+"mipmap filtering (also called \"trilinear filtering\") is used."
+msgstr ""
+
+#: doc/classes/ProjectSettings.xml:1151
msgid ""
"Thread model for rendering. Rendering on a thread can vastly improve "
"performance, but synchronizing to the main thread can cause a bit more "
"jitter."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1121
+#: doc/classes/ProjectSettings.xml:1154
msgid ""
"If [code]true[/code], the texture importer will import VRAM-compressed "
"textures using the BPTC algorithm. This texture compression algorithm is "
"only supported on desktop platforms, and only when using the Vulkan renderer."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1124
+#: doc/classes/ProjectSettings.xml:1157
msgid ""
"If [code]true[/code], the texture importer will import VRAM-compressed "
"textures using the Ericsson Texture Compression algorithm. This algorithm "
"doesn't support alpha channels in textures."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1127
+#: doc/classes/ProjectSettings.xml:1160
msgid ""
"If [code]true[/code], the texture importer will import VRAM-compressed "
"textures using the Ericsson Texture Compression 2 algorithm. This texture "
"compression algorithm is only supported when using the Vulkan renderer."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1130
+#: doc/classes/ProjectSettings.xml:1163
msgid ""
"If [code]true[/code], the texture importer will import VRAM-compressed "
"textures using the PowerVR Texture Compression algorithm. This texture "
"compression algorithm is only supported on iOS."
msgstr ""
-#: doc/classes/ProjectSettings.xml:1133
+#: doc/classes/ProjectSettings.xml:1166
msgid ""
"If [code]true[/code], the texture importer will import VRAM-compressed "
"textures using the S3 Texture Compression algorithm. This algorithm is only "
"supported on desktop platforms and consoles."
msgstr ""
+#: doc/classes/ProjectSettings.xml:1177
+msgid "Cell size used for the 2D hash grid that [VisibilityNotifier2D] uses."
+msgstr ""
+
#: doc/classes/ProximityGroup3D.xml:4 doc/classes/ProximityGroup3D.xml:7
msgid "General-purpose proximity detection node."
msgstr ""
@@ -40861,11 +40980,11 @@ msgstr ""
#: doc/classes/RenderingServer.xml:7
msgid ""
-"Server for anything visible. The visual server is the API backend for "
+"Server for anything visible. The rendering server is the API backend for "
"everything visible. The whole scene system mounts on it to display.\n"
-"The visual server is completely opaque, the internals are entirely "
+"The rendering server is completely opaque, the internals are entirely "
"implementation specific and cannot be accessed.\n"
-"The visual server can be used to bypass the scene system entirely.\n"
+"The rendering server can be used to bypass the scene system entirely.\n"
"Resources are created using the [code]*_create[/code] functions.\n"
"All objects are drawn to a viewport. You can use the [Viewport] attached to "
"the [SceneTree] or you can create one yourself with [method "
@@ -40873,10 +40992,10 @@ msgid ""
"canvas needs to be attached to the viewport using [method "
"viewport_set_scenario] or [method viewport_attach_canvas].\n"
"In 3D, all visual objects must be associated with a scenario. The scenario "
-"is a visual representation of the world. If accessing the visual server from "
-"a running game, the scenario can be accessed from the scene tree from any "
-"[Node3D] node with [method Node3D.get_world]. Otherwise, a scenario can be "
-"created with [method scenario_create].\n"
+"is a visual representation of the world. If accessing the rendering server "
+"from a running game, the scenario can be accessed from the scene tree from "
+"any [Node3D] node with [method Node3D.get_world]. Otherwise, a scenario can "
+"be created with [method scenario_create].\n"
"Similarly in 2D, a canvas is needed to draw all canvas items.\n"
"In 3D, all visible objects are comprised of a resource and an instance. A "
"resource can be a mesh, a particle system, a light, or any other 3D object. "
@@ -41302,42 +41421,42 @@ msgstr ""
msgid "Returns the id of a white texture. Creates one if none exists."
msgstr ""
-#: doc/classes/RenderingServer.xml:954
+#: doc/classes/RenderingServer.xml:1006
msgid ""
"Returns [code]true[/code] if changes have been made to the RenderingServer's "
"data. [method force_draw] is usually called if this happens."
msgstr ""
-#: doc/classes/RenderingServer.xml:963
+#: doc/classes/RenderingServer.xml:1015
msgid "Not yet implemented. Always returns [code]false[/code]."
msgstr ""
-#: doc/classes/RenderingServer.xml:972
+#: doc/classes/RenderingServer.xml:1024
msgid ""
"Returns [code]true[/code] if the OS supports a certain feature. Features "
"might be [code]s3tc[/code], [code]etc[/code], [code]etc2[/code] and "
"[code]pvrtc[/code]."
msgstr ""
-#: doc/classes/RenderingServer.xml:985
+#: doc/classes/RenderingServer.xml:1037
msgid ""
"Sets up [ImmediateGeometry3D] internals to prepare for drawing. Equivalent "
"to [method ImmediateGeometry3D.begin]."
msgstr ""
-#: doc/classes/RenderingServer.xml:994
+#: doc/classes/RenderingServer.xml:1046
msgid ""
"Clears everything that was set up between [method immediate_begin] and "
"[method immediate_end]. Equivalent to [method ImmediateGeometry3D.clear]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1005
+#: doc/classes/RenderingServer.xml:1057
msgid ""
"Sets the color to be used with next vertex. Equivalent to [method "
"ImmediateGeometry3D.set_color]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1012
+#: doc/classes/RenderingServer.xml:1064
msgid ""
"Creates an immediate geometry and adds it to the RenderingServer. It can be "
"accessed with the RID that is returned. This RID will be used in all "
@@ -41348,78 +41467,78 @@ msgid ""
"[method instance_set_base] using the returned RID."
msgstr ""
-#: doc/classes/RenderingServer.xml:1023
+#: doc/classes/RenderingServer.xml:1075
msgid ""
"Ends drawing the [ImmediateGeometry3D] and displays it. Equivalent to "
"[method ImmediateGeometry3D.end]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1032
+#: doc/classes/RenderingServer.xml:1084
msgid "Returns the material assigned to the [ImmediateGeometry3D]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1043
+#: doc/classes/RenderingServer.xml:1095
msgid ""
"Sets the normal to be used with next vertex. Equivalent to [method "
"ImmediateGeometry3D.set_normal]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1054
+#: doc/classes/RenderingServer.xml:1106
msgid "Sets the material to be used to draw the [ImmediateGeometry3D]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1065
+#: doc/classes/RenderingServer.xml:1117
msgid ""
"Sets the tangent to be used with next vertex. Equivalent to [method "
"ImmediateGeometry3D.set_tangent]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1076
+#: doc/classes/RenderingServer.xml:1128
msgid ""
"Sets the UV to be used with next vertex. Equivalent to [method "
"ImmediateGeometry3D.set_uv]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1087
+#: doc/classes/RenderingServer.xml:1139
msgid ""
"Sets the UV2 to be used with next vertex. Equivalent to [method "
"ImmediateGeometry3D.set_uv2]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1098
+#: doc/classes/RenderingServer.xml:1150
msgid ""
"Adds the next vertex using the information provided in advance. Equivalent "
"to [method ImmediateGeometry3D.add_vertex]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1109
+#: doc/classes/RenderingServer.xml:1161
msgid ""
"Adds the next vertex using the information provided in advance. This is a "
"helper class that calls [method immediate_vertex] under the hood. Equivalent "
"to [method ImmediateGeometry3D.add_vertex]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1116
+#: doc/classes/RenderingServer.xml:1168
msgid ""
-"Initializes the visual server. This function is called internally by "
+"Initializes the rendering server. This function is called internally by "
"platform-dependent code during engine initialization. If called from a "
"running game, it will not do anything."
msgstr ""
-#: doc/classes/RenderingServer.xml:1127
+#: doc/classes/RenderingServer.xml:1179
msgid ""
"Attaches a unique Object ID to instance. Object ID must be attached to "
"instance for proper culling with [method instances_cull_aabb], [method "
"instances_cull_convex], and [method instances_cull_ray]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1138
+#: doc/classes/RenderingServer.xml:1190
msgid ""
"Attaches a skeleton to an instance. Removes the previous skeleton from the "
"instance."
msgstr ""
-#: doc/classes/RenderingServer.xml:1145
+#: doc/classes/RenderingServer.xml:1197
msgid ""
"Creates a visual instance and adds it to the RenderingServer. It can be "
"accessed with the RID that is returned. This RID will be used in all "
@@ -41431,7 +41550,7 @@ msgid ""
"instance to be visible in the scenario using [method instance_set_base]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1158
+#: doc/classes/RenderingServer.xml:1210
msgid ""
"Creates a visual instance, adds it to the RenderingServer, and sets both "
"base and scenario. It can be accessed with the RID that is returned. This "
@@ -41440,31 +41559,31 @@ msgid ""
"RenderingServer's [method free_rid] static method."
msgstr ""
-#: doc/classes/RenderingServer.xml:1170 doc/classes/RenderingServer.xml:1198
-#: doc/classes/RenderingServer.xml:1488
+#: doc/classes/RenderingServer.xml:1222 doc/classes/RenderingServer.xml:1250
+#: doc/classes/RenderingServer.xml:1540
msgid "Not implemented in Godot 3.x."
msgstr ""
-#: doc/classes/RenderingServer.xml:1181
+#: doc/classes/RenderingServer.xml:1233
msgid ""
"Sets the shadow casting setting to one of [enum ShadowCastingSetting]. "
"Equivalent to [member GeometryInstance3D.cast_shadow]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1211
+#: doc/classes/RenderingServer.xml:1263
msgid ""
"Sets the flag for a given [enum InstanceFlags]. See [enum InstanceFlags] for "
"more details."
msgstr ""
-#: doc/classes/RenderingServer.xml:1222
+#: doc/classes/RenderingServer.xml:1274
msgid ""
"Sets a material that will override the material for all surfaces on the mesh "
"associated with this instance. Equivalent to [member GeometryInstance3D."
"material_override]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1233
+#: doc/classes/RenderingServer.xml:1285
msgid ""
"Sets the base of the instance. A base can be any of the 3D objects that are "
"created in the RenderingServer that can be displayed. For example, any of "
@@ -41473,62 +41592,62 @@ msgid ""
"be set as the base of an instance in order to be displayed in the scenario."
msgstr ""
-#: doc/classes/RenderingServer.xml:1246
+#: doc/classes/RenderingServer.xml:1298
msgid "Sets the weight for a given blend shape associated with this instance."
msgstr ""
-#: doc/classes/RenderingServer.xml:1257
+#: doc/classes/RenderingServer.xml:1309
msgid ""
"Sets a custom AABB to use when culling objects from the view frustum. "
"Equivalent to [method GeometryInstance3D.set_custom_aabb]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1268
+#: doc/classes/RenderingServer.xml:1320
msgid "Function not implemented in Godot 3.x."
msgstr ""
-#: doc/classes/RenderingServer.xml:1279
+#: doc/classes/RenderingServer.xml:1331
msgid ""
"Sets a margin to increase the size of the AABB when culling objects from the "
"view frustum. This allows you avoid culling objects that fall outside the "
"view frustum. Equivalent to [member GeometryInstance3D.extra_cull_margin]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1290
+#: doc/classes/RenderingServer.xml:1342
msgid ""
"Sets the render layers that this instance will be drawn to. Equivalent to "
"[member VisualInstance3D.layers]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1301
+#: doc/classes/RenderingServer.xml:1353
msgid ""
"Sets the scenario that the instance is in. The scenario is the 3D world that "
"the objects will be displayed in."
msgstr ""
-#: doc/classes/RenderingServer.xml:1314
+#: doc/classes/RenderingServer.xml:1366
msgid ""
"Sets the material of a specific surface. Equivalent to [method "
"MeshInstance3D.set_surface_material]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1325
+#: doc/classes/RenderingServer.xml:1377
msgid ""
"Sets the world space transform of the instance. Equivalent to [member Node3D."
"transform]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1338
+#: doc/classes/RenderingServer.xml:1390
msgid "Sets the lightmap to use with this instance."
msgstr ""
-#: doc/classes/RenderingServer.xml:1349
+#: doc/classes/RenderingServer.xml:1401
msgid ""
"Sets whether an instance is drawn or not. Equivalent to [member Node3D."
"visible]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1360
+#: doc/classes/RenderingServer.xml:1412
msgid ""
"Returns an array of object IDs intersecting with the provided AABB. Only "
"visual 3D nodes are considered, such as [MeshInstance3D] or "
@@ -41540,7 +41659,7 @@ msgid ""
"game use cases, prefer physics collision."
msgstr ""
-#: doc/classes/RenderingServer.xml:1372
+#: doc/classes/RenderingServer.xml:1424
msgid ""
"Returns an array of object IDs intersecting with the provided convex shape. "
"Only visual 3D nodes are considered, such as [MeshInstance3D] or "
@@ -41552,7 +41671,7 @@ msgid ""
"game use cases, prefer physics collision."
msgstr ""
-#: doc/classes/RenderingServer.xml:1386
+#: doc/classes/RenderingServer.xml:1438
msgid ""
"Returns an array of object IDs intersecting with the provided 3D ray. Only "
"visual 3D nodes are considered, such as [MeshInstance3D] or "
@@ -41564,58 +41683,58 @@ msgid ""
"game use cases, prefer physics collision."
msgstr ""
-#: doc/classes/RenderingServer.xml:1398
+#: doc/classes/RenderingServer.xml:1450
msgid ""
"If [code]true[/code], this directional light will blend between shadow map "
"splits resulting in a smoother transition between them. Equivalent to "
"[member DirectionalLight3D.directional_shadow_blend_splits]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1409
+#: doc/classes/RenderingServer.xml:1461
msgid ""
"Sets the shadow depth range mode for this directional light. Equivalent to "
"[member DirectionalLight3D.directional_shadow_depth_range]. See [enum "
"LightDirectionalShadowDepthRangeMode] for options."
msgstr ""
-#: doc/classes/RenderingServer.xml:1420
+#: doc/classes/RenderingServer.xml:1472
msgid ""
"Sets the shadow mode for this directional light. Equivalent to [member "
"DirectionalLight3D.directional_shadow_mode]. See [enum "
"LightDirectionalShadowMode] for options."
msgstr ""
-#: doc/classes/RenderingServer.xml:1431
+#: doc/classes/RenderingServer.xml:1483
msgid ""
"Sets whether to use a dual paraboloid or a cubemap for the shadow map. Dual "
"paraboloid is faster but may suffer from artifacts. Equivalent to [member "
"OmniLight3D.omni_shadow_mode]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1442
+#: doc/classes/RenderingServer.xml:1494
msgid ""
"Sets the color of the light. Equivalent to [member Light3D.light_color]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1453
+#: doc/classes/RenderingServer.xml:1505
msgid ""
"Sets the cull mask for this Light3D. Lights only affect objects in the "
"selected layers. Equivalent to [member Light3D.light_cull_mask]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1464
+#: doc/classes/RenderingServer.xml:1516
msgid ""
"If [code]true[/code], light will subtract light instead of adding light. "
"Equivalent to [member Light3D.light_negative]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1477
+#: doc/classes/RenderingServer.xml:1529
msgid ""
"Sets the specified light parameter. See [enum LightParam] for options. "
"Equivalent to [method Light3D.set_param]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1499
+#: doc/classes/RenderingServer.xml:1551
msgid ""
"If [code]true[/code], reverses the backface culling of the mesh. This can be "
"useful when you have a flat mesh that has a light behind it. If you need to "
@@ -41624,23 +41743,23 @@ msgid ""
"to [member Light3D.shadow_reverse_cull_face]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1510
+#: doc/classes/RenderingServer.xml:1562
msgid ""
"If [code]true[/code], light will cast shadows. Equivalent to [member Light3D."
"shadow_enabled]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1521
+#: doc/classes/RenderingServer.xml:1573
msgid ""
"Sets the color of the shadow cast by the light. Equivalent to [member "
"Light3D.shadow_color]."
msgstr ""
-#: doc/classes/RenderingServer.xml:1532
+#: doc/classes/RenderingServer.xml:1584
msgid "Sets whether GI probes capture light information from this light."
msgstr ""
-#: doc/classes/RenderingServer.xml:1539
+#: doc/classes/RenderingServer.xml:1591
msgid ""
"Creates a lightmap capture and adds it to the RenderingServer. It can be "
"accessed with the RID that is returned. This RID will be used in all "
@@ -41651,54 +41770,54 @@ msgid ""
"[method instance_set_base] using the returned RID."
msgstr ""
-#: doc/classes/RenderingServer.xml:1550
+#: doc/classes/RenderingServer.xml:1602
msgid "Returns the size of the lightmap capture area."
msgstr ""
-#: doc/classes/RenderingServer.xml:1559
+#: doc/classes/RenderingServer.xml:1611
msgid "Returns the energy multiplier used by the lightmap capture."
msgstr ""
-#: doc/classes/RenderingServer.xml:1568
+#: doc/classes/RenderingServer.xml:1620
msgid "Returns the octree used by the lightmap capture."
msgstr ""
-#: doc/classes/RenderingServer.xml:1577
+#: doc/classes/RenderingServer.xml:1629
msgid ""
"Returns the cell subdivision amount used by this lightmap capture's octree."
msgstr ""
-#: doc/classes/RenderingServer.xml:1586
+#: doc/classes/RenderingServer.xml:1638
msgid "Returns the cell transform for this lightmap capture's octree."
msgstr ""
-#: doc/classes/RenderingServer.xml:1597
+#: doc/classes/RenderingServer.xml:1649
msgid "Sets the size of the area covered by the lightmap capture."
msgstr ""
-#: doc/classes/RenderingServer.xml:1608
+#: doc/classes/RenderingServer.xml:1660
msgid "Sets the energy multiplier for this lightmap capture."
msgstr ""
-#: doc/classes/RenderingServer.xml:1619
+#: doc/classes/RenderingServer.xml:1671
msgid "Sets the octree to be used by this lightmap capture."
msgstr ""
-#: doc/classes/RenderingServer.xml:1630
+#: doc/classes/RenderingServer.xml:1682
msgid "Sets the subdivision level of this lightmap capture's octree."
msgstr ""
-#: doc/classes/RenderingServer.xml:1641
+#: doc/classes/RenderingServer.xml:1693
msgid "Sets the octree cell transform for this lightmap capture's octree."
msgstr ""
-#: doc/classes/RenderingServer.xml:1654
+#: doc/classes/RenderingServer.xml:1706
msgid ""
"Returns a mesh of a sphere with the given amount of horizontal and vertical "
"subdivisions."
msgstr ""
-#: doc/classes/RenderingServer.xml:1661
+#: doc/classes/RenderingServer.xml:1713
msgid ""
"Creates an empty material and adds it to the RenderingServer. It can be "
"accessed with the RID that is returned. This RID will be used in all "
@@ -41707,31 +41826,31 @@ msgid ""
"RenderingServer's [method free_rid] static method."
msgstr ""
-#: doc/classes/RenderingServer.xml:1673
+#: doc/classes/RenderingServer.xml:1725
msgid "Returns the value of a certain material's parameter."
msgstr ""
-#: doc/classes/RenderingServer.xml:1684
+#: doc/classes/RenderingServer.xml:1736
msgid "Sets an object's next material."
msgstr ""
-#: doc/classes/RenderingServer.xml:1697
+#: doc/classes/RenderingServer.xml:1749
msgid "Sets a material's parameter."
msgstr ""
-#: doc/classes/RenderingServer.xml:1708
+#: doc/classes/RenderingServer.xml:1760
msgid "Sets a material's render priority."
msgstr ""
-#: doc/classes/RenderingServer.xml:1719
+#: doc/classes/RenderingServer.xml:1771
msgid "Sets a shader material's shader."
msgstr ""
-#: doc/classes/RenderingServer.xml:1748
+#: doc/classes/RenderingServer.xml:1800
msgid "Removes all surfaces from a mesh."
msgstr ""
-#: doc/classes/RenderingServer.xml:1755
+#: doc/classes/RenderingServer.xml:1807
msgid ""
"Creates a new mesh and adds it to the RenderingServer. It can be accessed "
"with the RID that is returned. This RID will be used in all [code]mesh_*[/"
@@ -41742,58 +41861,58 @@ msgid ""
"instance_set_base] using the returned RID."
msgstr ""
-#: doc/classes/RenderingServer.xml:1766
+#: doc/classes/RenderingServer.xml:1818
msgid "Returns a mesh's blend shape count."
msgstr ""
-#: doc/classes/RenderingServer.xml:1775
+#: doc/classes/RenderingServer.xml:1827
msgid "Returns a mesh's blend shape mode."
msgstr ""
-#: doc/classes/RenderingServer.xml:1784
+#: doc/classes/RenderingServer.xml:1836
msgid "Returns a mesh's custom aabb."
msgstr ""
-#: doc/classes/RenderingServer.xml:1793
+#: doc/classes/RenderingServer.xml:1845
msgid "Returns a mesh's number of surfaces."
msgstr ""
-#: doc/classes/RenderingServer.xml:1804
+#: doc/classes/RenderingServer.xml:1856
msgid "Sets a mesh's blend shape mode."
msgstr ""
-#: doc/classes/RenderingServer.xml:1815
+#: doc/classes/RenderingServer.xml:1867
msgid "Sets a mesh's custom aabb."
msgstr ""
-#: doc/classes/RenderingServer.xml:1826
+#: doc/classes/RenderingServer.xml:1878
msgid "Returns a mesh's surface's buffer arrays."
msgstr ""
-#: doc/classes/RenderingServer.xml:1837
+#: doc/classes/RenderingServer.xml:1889
msgid "Returns a mesh's surface's arrays for blend shapes."
msgstr ""
-#: doc/classes/RenderingServer.xml:1852 doc/classes/RenderingServer.xml:1865
+#: doc/classes/RenderingServer.xml:1904 doc/classes/RenderingServer.xml:1917
msgid "Function is unused in Godot 3.x."
msgstr ""
-#: doc/classes/RenderingServer.xml:1876
+#: doc/classes/RenderingServer.xml:1928
msgid "Returns a mesh's surface's material."
msgstr ""
-#: doc/classes/RenderingServer.xml:1889
+#: doc/classes/RenderingServer.xml:1941
msgid "Sets a mesh's surface's material."
msgstr ""
-#: doc/classes/RenderingServer.xml:1904
+#: doc/classes/RenderingServer.xml:1956
msgid ""
"Updates a specific region of a vertex buffer for the specified surface. "
"Warning: this function alters the vertex buffer directly with no safety "
"mechanisms, you can easily corrupt your mesh."
msgstr ""
-#: doc/classes/RenderingServer.xml:1927
+#: doc/classes/RenderingServer.xml:1979
msgid ""
"Creates a new multimesh on the RenderingServer and returns an [RID] handle. "
"This RID will be used in all [code]multimesh_*[/code] RenderingServer "
@@ -41804,82 +41923,82 @@ msgid ""
"instance_set_base] using the returned RID."
msgstr ""
-#: doc/classes/RenderingServer.xml:1938
+#: doc/classes/RenderingServer.xml:1990
msgid ""
"Calculates and returns the axis-aligned bounding box that encloses all "
"instances within the multimesh."
msgstr ""
-#: doc/classes/RenderingServer.xml:1955
+#: doc/classes/RenderingServer.xml:2007
msgid "Returns the number of instances allocated for this multimesh."
msgstr ""
-#: doc/classes/RenderingServer.xml:1964
+#: doc/classes/RenderingServer.xml:2016
msgid ""
"Returns the RID of the mesh that will be used in drawing this multimesh."
msgstr ""
-#: doc/classes/RenderingServer.xml:1973
+#: doc/classes/RenderingServer.xml:2025
msgid "Returns the number of visible instances for this multimesh."
msgstr ""
-#: doc/classes/RenderingServer.xml:1984
+#: doc/classes/RenderingServer.xml:2036
msgid "Returns the color by which the specified instance will be modulated."
msgstr ""
-#: doc/classes/RenderingServer.xml:1995
+#: doc/classes/RenderingServer.xml:2047
msgid "Returns the custom data associated with the specified instance."
msgstr ""
-#: doc/classes/RenderingServer.xml:2006
+#: doc/classes/RenderingServer.xml:2058
msgid "Returns the [Transform] of the specified instance."
msgstr ""
-#: doc/classes/RenderingServer.xml:2017
+#: doc/classes/RenderingServer.xml:2069
msgid ""
"Returns the [Transform2D] of the specified instance. For use when the "
"multimesh is set to use 2D transforms."
msgstr ""
-#: doc/classes/RenderingServer.xml:2030
+#: doc/classes/RenderingServer.xml:2082
msgid ""
"Sets the color by which this instance will be modulated. Equivalent to "
"[method MultiMesh.set_instance_color]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2043
+#: doc/classes/RenderingServer.xml:2095
msgid ""
"Sets the custom data for this instance. Custom data is passed as a [Color], "
"but is interpreted as a [code]vec4[/code] in the shader. Equivalent to "
"[method MultiMesh.set_instance_custom_data]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2056
+#: doc/classes/RenderingServer.xml:2108
msgid ""
"Sets the [Transform] for this instance. Equivalent to [method MultiMesh."
"set_instance_transform]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2069
+#: doc/classes/RenderingServer.xml:2121
msgid ""
"Sets the [Transform2D] for this instance. For use when multimesh is used in "
"2D. Equivalent to [method MultiMesh.set_instance_transform_2d]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2090
+#: doc/classes/RenderingServer.xml:2142
msgid ""
"Sets the mesh to be drawn by the multimesh. Equivalent to [member MultiMesh."
"mesh]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2101
+#: doc/classes/RenderingServer.xml:2153
msgid ""
"Sets the number of instances visible at a given time. If -1, all instances "
"that have been allocated are drawn. Equivalent to [member MultiMesh."
"visible_instance_count]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2108
+#: doc/classes/RenderingServer.xml:2160
msgid ""
"Creates a new omni light and adds it to the RenderingServer. It can be "
"accessed with the RID that is returned. This RID can be used in most "
@@ -41890,7 +42009,7 @@ msgid ""
"instance_set_base] using the returned RID."
msgstr ""
-#: doc/classes/RenderingServer.xml:2117
+#: doc/classes/RenderingServer.xml:2169
msgid ""
"Creates a particle system and adds it to the RenderingServer. It can be "
"accessed with the RID that is returned. This RID will be used in all "
@@ -41901,23 +42020,23 @@ msgid ""
"instance_set_base] using the returned RID."
msgstr ""
-#: doc/classes/RenderingServer.xml:2128
+#: doc/classes/RenderingServer.xml:2180
msgid ""
"Calculates and returns the axis-aligned bounding box that contains all the "
"particles. Equivalent to [method GPUParticles3D.capture_aabb]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2137
+#: doc/classes/RenderingServer.xml:2189
msgid "Returns [code]true[/code] if particles are currently set to emitting."
msgstr ""
-#: doc/classes/RenderingServer.xml:2146
+#: doc/classes/RenderingServer.xml:2198
msgid ""
"Returns [code]true[/code] if particles are not emitting and particles are "
"set to inactive."
msgstr ""
-#: doc/classes/RenderingServer.xml:2155
+#: doc/classes/RenderingServer.xml:2207
msgid ""
"Add particle system to list of particle systems that need to be updated. "
"Update will take place on the next frame, or on the next call to [method "
@@ -41925,121 +42044,121 @@ msgid ""
"instances_cull_ray]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2164
+#: doc/classes/RenderingServer.xml:2216
msgid ""
"Reset the particles on the next update. Equivalent to [method GPUParticles3D."
"restart]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2175
+#: doc/classes/RenderingServer.xml:2227
msgid ""
"Sets the number of particles to be drawn and allocates the memory for them. "
"Equivalent to [member GPUParticles3D.amount]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2186
+#: doc/classes/RenderingServer.xml:2238
msgid ""
"Sets a custom axis-aligned bounding box for the particle system. Equivalent "
"to [member GPUParticles3D.visibility_aabb]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2197
+#: doc/classes/RenderingServer.xml:2249
msgid ""
"Sets the draw order of the particles to one of the named enums from [enum "
"ParticlesDrawOrder]. See [enum ParticlesDrawOrder] for options. Equivalent "
"to [member GPUParticles3D.draw_order]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2210
+#: doc/classes/RenderingServer.xml:2262
msgid ""
"Sets the mesh to be used for the specified draw pass. Equivalent to [member "
"GPUParticles3D.draw_pass_1], [member GPUParticles3D.draw_pass_2], [member "
"GPUParticles3D.draw_pass_3], and [member GPUParticles3D.draw_pass_4]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2221
+#: doc/classes/RenderingServer.xml:2273
msgid ""
"Sets the number of draw passes to use. Equivalent to [member GPUParticles3D."
"draw_passes]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2232
+#: doc/classes/RenderingServer.xml:2284
msgid ""
"Sets the [Transform] that will be used by the particles when they first emit."
msgstr ""
-#: doc/classes/RenderingServer.xml:2243
+#: doc/classes/RenderingServer.xml:2295
msgid ""
"If [code]true[/code], particles will emit over time. Setting to false does "
"not reset the particles, but only stops their emission. Equivalent to "
"[member GPUParticles3D.emitting]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2254
+#: doc/classes/RenderingServer.xml:2306
msgid ""
"Sets the explosiveness ratio. Equivalent to [member GPUParticles3D."
"explosiveness]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2265
+#: doc/classes/RenderingServer.xml:2317
msgid ""
"Sets the frame rate that the particle system rendering will be fixed to. "
"Equivalent to [member GPUParticles3D.fixed_fps]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2276
+#: doc/classes/RenderingServer.xml:2328
msgid ""
"If [code]true[/code], uses fractional delta which smooths the movement of "
"the particles. Equivalent to [member GPUParticles3D.fract_delta]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2287
+#: doc/classes/RenderingServer.xml:2339
msgid ""
"Sets the lifetime of each particle in the system. Equivalent to [member "
"GPUParticles3D.lifetime]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2298
+#: doc/classes/RenderingServer.xml:2350
msgid ""
"If [code]true[/code], particles will emit once and then stop. Equivalent to "
"[member GPUParticles3D.one_shot]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2309
+#: doc/classes/RenderingServer.xml:2361
msgid ""
"Sets the preprocess time for the particles animation. This lets you delay "
"starting an animation until after the particles have begun emitting. "
"Equivalent to [member GPUParticles3D.preprocess]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2320
+#: doc/classes/RenderingServer.xml:2372
msgid ""
"Sets the material for processing the particles. Note: this is not the "
"material used to draw the materials. Equivalent to [member GPUParticles3D."
"process_material]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2331
+#: doc/classes/RenderingServer.xml:2383
msgid ""
"Sets the emission randomness ratio. This randomizes the emission of "
"particles within their phase. Equivalent to [member GPUParticles3D."
"randomness]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2342
+#: doc/classes/RenderingServer.xml:2394
msgid ""
"Sets the speed scale of the particle system. Equivalent to [member "
"GPUParticles3D.speed_scale]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2353
+#: doc/classes/RenderingServer.xml:2405
msgid ""
"If [code]true[/code], particles use local coordinates. If [code]false[/code] "
"they use global coordinates. Equivalent to [member GPUParticles3D."
"local_coords]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2360
+#: doc/classes/RenderingServer.xml:2412
msgid ""
"Creates a reflection probe and adds it to the RenderingServer. It can be "
"accessed with the RID that is returned. This RID will be used in all "
@@ -42050,59 +42169,59 @@ msgid ""
"[method instance_set_base] using the returned RID."
msgstr ""
-#: doc/classes/RenderingServer.xml:2373
+#: doc/classes/RenderingServer.xml:2425
msgid ""
"If [code]true[/code], reflections will ignore sky contribution. Equivalent "
"to [member ReflectionProbe.interior_enable]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2384
+#: doc/classes/RenderingServer.xml:2436
msgid ""
"Sets the render cull mask for this reflection probe. Only instances with a "
"matching cull mask will be rendered by this probe. Equivalent to [member "
"ReflectionProbe.cull_mask]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2395
+#: doc/classes/RenderingServer.xml:2447
msgid ""
"If [code]true[/code], uses box projection. This can make reflections look "
"more correct in certain situations. Equivalent to [member ReflectionProbe."
"box_projection]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2406
+#: doc/classes/RenderingServer.xml:2458
msgid ""
"If [code]true[/code], computes shadows in the reflection probe. This makes "
"the reflection much slower to compute. Equivalent to [member ReflectionProbe."
"enable_shadows]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2417
+#: doc/classes/RenderingServer.xml:2469
msgid ""
"Sets the size of the area that the reflection probe will capture. Equivalent "
"to [member ReflectionProbe.extents]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2428
+#: doc/classes/RenderingServer.xml:2480
msgid ""
"Sets the intensity of the reflection probe. Intensity modulates the strength "
"of the reflection. Equivalent to [member ReflectionProbe.intensity]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2439
+#: doc/classes/RenderingServer.xml:2491
msgid ""
"Sets the ambient light color for this reflection probe when set to interior "
"mode. Equivalent to [member ReflectionProbe.interior_ambient_color]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2450
+#: doc/classes/RenderingServer.xml:2502
msgid ""
"Sets the energy multiplier for this reflection probes ambient light "
"contribution when set to interior mode. Equivalent to [member "
"ReflectionProbe.interior_ambient_energy]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2461
+#: doc/classes/RenderingServer.xml:2513
msgid ""
"Sets the contribution value for how much the reflection affects the ambient "
"light for this reflection probe when set to interior mode. Useful so that "
@@ -42110,25 +42229,25 @@ msgid ""
"ReflectionProbe.interior_ambient_contrib]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2472
+#: doc/classes/RenderingServer.xml:2524
msgid ""
"Sets the max distance away from the probe an object can be before it is "
"culled. Equivalent to [member ReflectionProbe.max_distance]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2483
+#: doc/classes/RenderingServer.xml:2535
msgid ""
"Sets the origin offset to be used when this reflection probe is in box "
"project mode. Equivalent to [member ReflectionProbe.origin_offset]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2494
+#: doc/classes/RenderingServer.xml:2546
msgid ""
"Sets how often the reflection probe updates. Can either be once or every "
"frame. See [enum ReflectionProbeUpdateMode] for options."
msgstr ""
-#: doc/classes/RenderingServer.xml:2507
+#: doc/classes/RenderingServer.xml:2559
msgid ""
"Schedules a callback to the corresponding named [code]method[/code] on "
"[code]where[/code] after a frame has been drawn.\n"
@@ -42136,7 +42255,7 @@ msgid ""
"[code]userdata[/code]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2515
+#: doc/classes/RenderingServer.xml:2567
msgid ""
"Creates a scenario and adds it to the RenderingServer. It can be accessed "
"with the RID that is returned. This RID will be used in all "
@@ -42146,24 +42265,24 @@ msgid ""
"The scenario is the 3D world that all the visual instances exist in."
msgstr ""
-#: doc/classes/RenderingServer.xml:2528
+#: doc/classes/RenderingServer.xml:2580
msgid ""
"Sets the [enum ScenarioDebugMode] for this scenario. See [enum "
"ScenarioDebugMode] for options."
msgstr ""
-#: doc/classes/RenderingServer.xml:2539
+#: doc/classes/RenderingServer.xml:2591
msgid "Sets the environment that will be used with this scenario."
msgstr ""
-#: doc/classes/RenderingServer.xml:2550
+#: doc/classes/RenderingServer.xml:2602
msgid ""
"Sets the fallback environment to be used by this scenario. The fallback "
"environment is used if no environment is set. Internally, this is used by "
"the editor to provide a default environment."
msgstr ""
-#: doc/classes/RenderingServer.xml:2565
+#: doc/classes/RenderingServer.xml:2617
msgid ""
"Sets a boot image. The color defines the background color. If [code]scale[/"
"code] is [code]true[/code], the image will be scaled to fit the screen size. "
@@ -42172,19 +42291,19 @@ msgid ""
"the image will be scaled with nearest-neighbor interpolation."
msgstr ""
-#: doc/classes/RenderingServer.xml:2574
+#: doc/classes/RenderingServer.xml:2626
msgid ""
"If [code]true[/code], the engine will generate wireframes for use with the "
"wireframe debug mode."
msgstr ""
-#: doc/classes/RenderingServer.xml:2583
+#: doc/classes/RenderingServer.xml:2635
msgid ""
"Sets the default clear color which is used when a specific clear color has "
"not been selected."
msgstr ""
-#: doc/classes/RenderingServer.xml:2590
+#: doc/classes/RenderingServer.xml:2642
msgid ""
"Creates an empty shader and adds it to the RenderingServer. It can be "
"accessed with the RID that is returned. This RID will be used in all "
@@ -42193,47 +42312,47 @@ msgid ""
"RenderingServer's [method free_rid] static method."
msgstr ""
-#: doc/classes/RenderingServer.xml:2600
+#: doc/classes/RenderingServer.xml:2652
msgid "Returns a shader's code."
msgstr ""
-#: doc/classes/RenderingServer.xml:2611
+#: doc/classes/RenderingServer.xml:2663
msgid "Returns a default texture from a shader searched by name."
msgstr ""
-#: doc/classes/RenderingServer.xml:2630
+#: doc/classes/RenderingServer.xml:2682
msgid "Returns the parameters of a shader."
msgstr ""
-#: doc/classes/RenderingServer.xml:2641
+#: doc/classes/RenderingServer.xml:2693
msgid "Sets a shader's code."
msgstr ""
-#: doc/classes/RenderingServer.xml:2654
+#: doc/classes/RenderingServer.xml:2706
msgid "Sets a shader's default texture. Overwrites the texture given by name."
msgstr ""
-#: doc/classes/RenderingServer.xml:2667
+#: doc/classes/RenderingServer.xml:2719
msgid "Allocates the GPU buffers for this skeleton."
msgstr ""
-#: doc/classes/RenderingServer.xml:2678
+#: doc/classes/RenderingServer.xml:2730
msgid "Returns the [Transform] set for a specific bone of this skeleton."
msgstr ""
-#: doc/classes/RenderingServer.xml:2689
+#: doc/classes/RenderingServer.xml:2741
msgid "Returns the [Transform2D] set for a specific bone of this skeleton."
msgstr ""
-#: doc/classes/RenderingServer.xml:2702
+#: doc/classes/RenderingServer.xml:2754
msgid "Sets the [Transform] for a specific bone of this skeleton."
msgstr ""
-#: doc/classes/RenderingServer.xml:2715
+#: doc/classes/RenderingServer.xml:2767
msgid "Sets the [Transform2D] for a specific bone of this skeleton."
msgstr ""
-#: doc/classes/RenderingServer.xml:2722
+#: doc/classes/RenderingServer.xml:2774
msgid ""
"Creates a skeleton and adds it to the RenderingServer. It can be accessed "
"with the RID that is returned. This RID will be used in all "
@@ -42242,11 +42361,11 @@ msgid ""
"RenderingServer's [method free_rid] static method."
msgstr ""
-#: doc/classes/RenderingServer.xml:2732
+#: doc/classes/RenderingServer.xml:2784
msgid "Returns the number of bones allocated for this skeleton."
msgstr ""
-#: doc/classes/RenderingServer.xml:2739
+#: doc/classes/RenderingServer.xml:2791
msgid ""
"Creates an empty sky and adds it to the RenderingServer. It can be accessed "
"with the RID that is returned. This RID will be used in all [code]sky_*[/"
@@ -42255,13 +42374,13 @@ msgid ""
"RenderingServer's [method free_rid] static method."
msgstr ""
-#: doc/classes/RenderingServer.xml:2751
+#: doc/classes/RenderingServer.xml:2803
msgid ""
"Sets the material that the sky uses to render the background and reflection "
"maps."
msgstr ""
-#: doc/classes/RenderingServer.xml:2758
+#: doc/classes/RenderingServer.xml:2810
msgid ""
"Creates a spot light and adds it to the RenderingServer. It can be accessed "
"with the RID that is returned. This RID can be used in most [code]light_*[/"
@@ -42272,15 +42391,15 @@ msgid ""
"instance_set_base] using the returned RID."
msgstr ""
-#: doc/classes/RenderingServer.xml:2787
+#: doc/classes/RenderingServer.xml:2839
msgid "Sets a viewport's camera."
msgstr ""
-#: doc/classes/RenderingServer.xml:2798
+#: doc/classes/RenderingServer.xml:2850
msgid "Sets a viewport's canvas."
msgstr ""
-#: doc/classes/RenderingServer.xml:2811
+#: doc/classes/RenderingServer.xml:2863
msgid ""
"Copies the viewport to a region of the screen specified by [code]rect[/"
"code]. If [method viewport_set_render_direct_to_screen] is [code]true[/"
@@ -42302,7 +42421,7 @@ msgid ""
"viewport_set_render_direct_to_screen]."
msgstr ""
-#: doc/classes/RenderingServer.xml:2825
+#: doc/classes/RenderingServer.xml:2877
msgid ""
"Creates an empty viewport and adds it to the RenderingServer. It can be "
"accessed with the RID that is returned. This RID will be used in all "
@@ -42311,72 +42430,72 @@ msgid ""
"RenderingServer's [method free_rid] static method."
msgstr ""
-#: doc/classes/RenderingServer.xml:2837
+#: doc/classes/RenderingServer.xml:2889
msgid ""
"Returns a viewport's render information. For options, see the [enum "
"ViewportRenderInfo] constants."
msgstr ""
-#: doc/classes/RenderingServer.xml:2846
+#: doc/classes/RenderingServer.xml:2898
msgid "Returns the viewport's last rendered frame."
msgstr ""
-#: doc/classes/RenderingServer.xml:2857
+#: doc/classes/RenderingServer.xml:2909
msgid "Detaches a viewport from a canvas and vice versa."
msgstr ""
-#: doc/classes/RenderingServer.xml:2868
+#: doc/classes/RenderingServer.xml:2920
msgid "If [code]true[/code], sets the viewport active, else sets it inactive."
msgstr ""
-#: doc/classes/RenderingServer.xml:2883
+#: doc/classes/RenderingServer.xml:2935
msgid ""
"Sets the stacking order for a viewport's canvas.\n"
"[code]layer[/code] is the actual canvas layer, while [code]sublayer[/code] "
"specifies the stacking order of the canvas among those in the same layer."
msgstr ""
-#: doc/classes/RenderingServer.xml:2897
+#: doc/classes/RenderingServer.xml:2949
msgid "Sets the transformation of a viewport's canvas."
msgstr ""
-#: doc/classes/RenderingServer.xml:2908
+#: doc/classes/RenderingServer.xml:2960
msgid ""
"Sets the clear mode of a viewport. See [enum ViewportClearMode] for options."
msgstr ""
-#: doc/classes/RenderingServer.xml:2919
+#: doc/classes/RenderingServer.xml:2971
msgid ""
"Sets the debug draw mode of a viewport. See [enum ViewportDebugDraw] for "
"options."
msgstr ""
-#: doc/classes/RenderingServer.xml:2930
+#: doc/classes/RenderingServer.xml:2982
msgid ""
"If [code]true[/code], rendering of a viewport's environment is disabled."
msgstr ""
-#: doc/classes/RenderingServer.xml:2941
+#: doc/classes/RenderingServer.xml:2993
msgid "Sets the viewport's global transformation matrix."
msgstr ""
-#: doc/classes/RenderingServer.xml:2952
+#: doc/classes/RenderingServer.xml:3004
msgid "If [code]true[/code], the viewport's canvas is not rendered."
msgstr ""
-#: doc/classes/RenderingServer.xml:2963
+#: doc/classes/RenderingServer.xml:3015
msgid "Currently unimplemented in Godot 3.x."
msgstr ""
-#: doc/classes/RenderingServer.xml:2974
+#: doc/classes/RenderingServer.xml:3026
msgid "Sets the anti-aliasing mode. See [enum ViewportMSAA] for options."
msgstr ""
-#: doc/classes/RenderingServer.xml:2985
+#: doc/classes/RenderingServer.xml:3037
msgid "Sets the viewport's parent to another viewport."
msgstr ""
-#: doc/classes/RenderingServer.xml:2996
+#: doc/classes/RenderingServer.xml:3048
msgid ""
"If [code]true[/code], render the contents of the viewport directly to "
"screen. This allows a low-level optimization where you can skip drawing a "
@@ -42392,708 +42511,864 @@ msgid ""
"significantly larger than the window size."
msgstr ""
-#: doc/classes/RenderingServer.xml:3007
+#: doc/classes/RenderingServer.xml:3059
msgid ""
"Sets a viewport's scenario.\n"
"The scenario contains information about the [enum ScenarioDebugMode], "
"environment information, reflection atlas etc."
msgstr ""
-#: doc/classes/RenderingServer.xml:3021
+#: doc/classes/RenderingServer.xml:3073
msgid "Sets the shadow atlas quadrant's subdivision."
msgstr ""
-#: doc/classes/RenderingServer.xml:3032
+#: doc/classes/RenderingServer.xml:3084
msgid ""
"Sets the size of the shadow atlas's images (used for omni and spot lights). "
"The value will be rounded up to the nearest power of 2."
msgstr ""
-#: doc/classes/RenderingServer.xml:3045
+#: doc/classes/RenderingServer.xml:3097
msgid "Sets the viewport's width and height."
msgstr ""
-#: doc/classes/RenderingServer.xml:3056
+#: doc/classes/RenderingServer.xml:3108
msgid ""
"If [code]true[/code], the viewport renders its background as transparent."
msgstr ""
-#: doc/classes/RenderingServer.xml:3067
+#: doc/classes/RenderingServer.xml:3119
msgid ""
"Sets when the viewport should be updated. See [enum ViewportUpdateMode] "
"constants for options."
msgstr ""
-#: doc/classes/RenderingServer.xml:3078
+#: doc/classes/RenderingServer.xml:3130
msgid ""
"If [code]true[/code], the viewport uses augmented or virtual reality "
-"technologies. See [ARVRInterface]."
+"technologies. See [XRInterface]."
msgstr ""
-#: doc/classes/RenderingServer.xml:3085
+#: doc/classes/RenderingServer.xml:3137
msgid ""
"Emitted at the end of the frame, after the RenderingServer has finished "
"updating all the Viewports."
msgstr ""
-#: doc/classes/RenderingServer.xml:3090
+#: doc/classes/RenderingServer.xml:3142
msgid ""
"Emitted at the beginning of the frame, before the RenderingServer updates "
"all the Viewports."
msgstr ""
-#: doc/classes/RenderingServer.xml:3096
+#: doc/classes/RenderingServer.xml:3148
msgid "Marks an error that shows that the index array is empty."
msgstr ""
-#: doc/classes/RenderingServer.xml:3099
+#: doc/classes/RenderingServer.xml:3151
msgid "Number of weights/bones per vertex."
msgstr ""
-#: doc/classes/RenderingServer.xml:3102
+#: doc/classes/RenderingServer.xml:3154
msgid "The minimum Z-layer for canvas items."
msgstr ""
-#: doc/classes/RenderingServer.xml:3105
+#: doc/classes/RenderingServer.xml:3157
msgid "The maximum Z-layer for canvas items."
msgstr ""
-#: doc/classes/RenderingServer.xml:3108
+#: doc/classes/RenderingServer.xml:3160
msgid ""
"Max number of glow levels that can be used with glow post-process effect."
msgstr ""
-#: doc/classes/RenderingServer.xml:3111
+#: doc/classes/RenderingServer.xml:3163
msgid "Unused enum in Godot 3.x."
msgstr ""
-#: doc/classes/RenderingServer.xml:3114
-msgid "The minimum renderpriority of all materials."
-msgstr ""
-
-#: doc/classes/RenderingServer.xml:3117
-msgid "The maximum renderpriority of all materials."
-msgstr ""
-
-#: doc/classes/RenderingServer.xml:3138
+#: doc/classes/RenderingServer.xml:3184
msgid "Shader is a 3D shader."
msgstr ""
-#: doc/classes/RenderingServer.xml:3141
+#: doc/classes/RenderingServer.xml:3187
msgid "Shader is a 2D shader."
msgstr ""
-#: doc/classes/RenderingServer.xml:3144
+#: doc/classes/RenderingServer.xml:3190
msgid "Shader is a particle shader."
msgstr ""
-#: doc/classes/RenderingServer.xml:3147
+#: doc/classes/RenderingServer.xml:3193
msgid "Shader is a sky shader."
msgstr ""
-#: doc/classes/RenderingServer.xml:3150
+#: doc/classes/RenderingServer.xml:3196
msgid "Represents the size of the [enum ShaderMode] enum."
msgstr ""
-#: doc/classes/RenderingServer.xml:3153
+#: doc/classes/RenderingServer.xml:3199
+msgid "The minimum renderpriority of all materials."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3202
+msgid "The maximum renderpriority of all materials."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3205
msgid "Array is a vertex array."
msgstr ""
-#: doc/classes/RenderingServer.xml:3156
+#: doc/classes/RenderingServer.xml:3208
msgid "Array is a normal array."
msgstr ""
-#: doc/classes/RenderingServer.xml:3159
+#: doc/classes/RenderingServer.xml:3211
msgid "Array is a tangent array."
msgstr ""
-#: doc/classes/RenderingServer.xml:3162
+#: doc/classes/RenderingServer.xml:3214
msgid "Array is a color array."
msgstr ""
-#: doc/classes/RenderingServer.xml:3165
+#: doc/classes/RenderingServer.xml:3217
msgid "Array is an UV coordinates array."
msgstr ""
-#: doc/classes/RenderingServer.xml:3168
+#: doc/classes/RenderingServer.xml:3220
msgid "Array is an UV coordinates array for the second UV coordinates."
msgstr ""
-#: doc/classes/RenderingServer.xml:3171
+#: doc/classes/RenderingServer.xml:3223
msgid "Array contains bone information."
msgstr ""
-#: doc/classes/RenderingServer.xml:3174
+#: doc/classes/RenderingServer.xml:3226
msgid "Array is weight information."
msgstr ""
-#: doc/classes/RenderingServer.xml:3177
+#: doc/classes/RenderingServer.xml:3229
msgid "Array is index array."
msgstr ""
-#: doc/classes/RenderingServer.xml:3183
+#: doc/classes/RenderingServer.xml:3235
msgid "Flag used to mark a vertex array."
msgstr ""
-#: doc/classes/RenderingServer.xml:3186
+#: doc/classes/RenderingServer.xml:3238
msgid "Flag used to mark a normal array."
msgstr ""
-#: doc/classes/RenderingServer.xml:3189
+#: doc/classes/RenderingServer.xml:3241
msgid "Flag used to mark a tangent array."
msgstr ""
-#: doc/classes/RenderingServer.xml:3192
+#: doc/classes/RenderingServer.xml:3244
msgid "Flag used to mark a color array."
msgstr ""
-#: doc/classes/RenderingServer.xml:3195
+#: doc/classes/RenderingServer.xml:3247
msgid "Flag used to mark an UV coordinates array."
msgstr ""
-#: doc/classes/RenderingServer.xml:3198
+#: doc/classes/RenderingServer.xml:3250
msgid ""
"Flag used to mark an UV coordinates array for the second UV coordinates."
msgstr ""
-#: doc/classes/RenderingServer.xml:3201
+#: doc/classes/RenderingServer.xml:3253
msgid "Flag used to mark a bone information array."
msgstr ""
-#: doc/classes/RenderingServer.xml:3204
+#: doc/classes/RenderingServer.xml:3256
msgid "Flag used to mark a weights array."
msgstr ""
-#: doc/classes/RenderingServer.xml:3207
+#: doc/classes/RenderingServer.xml:3259
msgid "Flag used to mark an index array."
msgstr ""
-#: doc/classes/RenderingServer.xml:3236
+#: doc/classes/RenderingServer.xml:3288
msgid "Primitive to draw consists of points."
msgstr ""
-#: doc/classes/RenderingServer.xml:3239
+#: doc/classes/RenderingServer.xml:3291
msgid "Primitive to draw consists of lines."
msgstr ""
-#: doc/classes/RenderingServer.xml:3242
+#: doc/classes/RenderingServer.xml:3294
msgid "Primitive to draw consists of a line strip from start to end."
msgstr ""
-#: doc/classes/RenderingServer.xml:3245
+#: doc/classes/RenderingServer.xml:3297
msgid "Primitive to draw consists of triangles."
msgstr ""
-#: doc/classes/RenderingServer.xml:3248
+#: doc/classes/RenderingServer.xml:3300
msgid ""
"Primitive to draw consists of a triangle strip (the last 3 vertices are "
"always combined to make a triangle)."
msgstr ""
-#: doc/classes/RenderingServer.xml:3251
+#: doc/classes/RenderingServer.xml:3303
msgid "Represents the size of the [enum PrimitiveType] enum."
msgstr ""
-#: doc/classes/RenderingServer.xml:3260
+#: doc/classes/RenderingServer.xml:3312
msgid "Use [Transform2D] to store MultiMesh transform."
msgstr ""
-#: doc/classes/RenderingServer.xml:3263
+#: doc/classes/RenderingServer.xml:3315
msgid "Use [Transform] to store MultiMesh transform."
msgstr ""
-#: doc/classes/RenderingServer.xml:3266
+#: doc/classes/RenderingServer.xml:3318
msgid "Is a directional (sun) light."
msgstr ""
-#: doc/classes/RenderingServer.xml:3269
+#: doc/classes/RenderingServer.xml:3321
msgid "Is an omni light."
msgstr ""
-#: doc/classes/RenderingServer.xml:3272
+#: doc/classes/RenderingServer.xml:3324
msgid "Is a spot light."
msgstr ""
-#: doc/classes/RenderingServer.xml:3275
+#: doc/classes/RenderingServer.xml:3327
msgid "The light's energy."
msgstr ""
-#: doc/classes/RenderingServer.xml:3280
+#: doc/classes/RenderingServer.xml:3332
msgid "The light's influence on specularity."
msgstr ""
-#: doc/classes/RenderingServer.xml:3283
+#: doc/classes/RenderingServer.xml:3335
msgid "The light's range."
msgstr ""
-#: doc/classes/RenderingServer.xml:3286
+#: doc/classes/RenderingServer.xml:3338
+msgid ""
+"The size of the light when using spot light or omni light. The angular size "
+"of the light when using directional light."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3341
msgid "The light's attenuation."
msgstr ""
-#: doc/classes/RenderingServer.xml:3289
+#: doc/classes/RenderingServer.xml:3344
msgid "The spotlight's angle."
msgstr ""
-#: doc/classes/RenderingServer.xml:3292
+#: doc/classes/RenderingServer.xml:3347
msgid "The spotlight's attenuation."
msgstr ""
-#: doc/classes/RenderingServer.xml:3295
-msgid "Scales the shadow color."
-msgstr ""
-
-#: doc/classes/RenderingServer.xml:3298
+#: doc/classes/RenderingServer.xml:3350
msgid "Max distance that shadows will be rendered."
msgstr ""
-#: doc/classes/RenderingServer.xml:3301
+#: doc/classes/RenderingServer.xml:3353
msgid "Proportion of shadow atlas occupied by the first split."
msgstr ""
-#: doc/classes/RenderingServer.xml:3304
+#: doc/classes/RenderingServer.xml:3356
msgid "Proportion of shadow atlas occupied by the second split."
msgstr ""
-#: doc/classes/RenderingServer.xml:3307
+#: doc/classes/RenderingServer.xml:3359
msgid ""
"Proportion of shadow atlas occupied by the third split. The fourth split "
"occupies the rest."
msgstr ""
-#: doc/classes/RenderingServer.xml:3312
+#: doc/classes/RenderingServer.xml:3362
+msgid ""
+"Proportion of shadow max distance where the shadow will start to fade out."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3365
msgid ""
"Normal bias used to offset shadow lookup by object normal. Can be used to "
"fix self-shadowing artifacts."
msgstr ""
-#: doc/classes/RenderingServer.xml:3315
+#: doc/classes/RenderingServer.xml:3368
msgid "Bias the shadow lookup to fix self-shadowing artifacts."
msgstr ""
-#: doc/classes/RenderingServer.xml:3318
-msgid ""
-"Increases bias on further splits to fix self-shadowing that only occurs far "
-"away from the camera."
-msgstr ""
-
-#: doc/classes/RenderingServer.xml:3321
+#: doc/classes/RenderingServer.xml:3379
msgid "Represents the size of the [enum LightParam] enum."
msgstr ""
-#: doc/classes/RenderingServer.xml:3324
+#: doc/classes/RenderingServer.xml:3382
msgid "Use a dual paraboloid shadow map for omni lights."
msgstr ""
-#: doc/classes/RenderingServer.xml:3327
+#: doc/classes/RenderingServer.xml:3385
msgid ""
"Use a cubemap shadow map for omni lights. Slower but better quality than "
"dual paraboloid."
msgstr ""
-#: doc/classes/RenderingServer.xml:3330
+#: doc/classes/RenderingServer.xml:3388
msgid "Use orthogonal shadow projection for directional light."
msgstr ""
-#: doc/classes/RenderingServer.xml:3333
+#: doc/classes/RenderingServer.xml:3391
msgid "Use 2 splits for shadow projection when using directional light."
msgstr ""
-#: doc/classes/RenderingServer.xml:3336
+#: doc/classes/RenderingServer.xml:3394
msgid "Use 4 splits for shadow projection when using directional light."
msgstr ""
-#: doc/classes/RenderingServer.xml:3339
+#: doc/classes/RenderingServer.xml:3397
msgid ""
"Keeps shadows stable as camera moves but has lower effective resolution."
msgstr ""
-#: doc/classes/RenderingServer.xml:3342
+#: doc/classes/RenderingServer.xml:3400
msgid ""
"Optimize use of shadow maps, increasing the effective resolution. But may "
"result in shadows moving or flickering slightly."
msgstr ""
-#: doc/classes/RenderingServer.xml:3345
+#: doc/classes/RenderingServer.xml:3403
msgid "Reflection probe will update reflections once and then stop."
msgstr ""
-#: doc/classes/RenderingServer.xml:3348
+#: doc/classes/RenderingServer.xml:3406
msgid ""
"Reflection probe will update each frame. This mode is necessary to capture "
"moving objects."
msgstr ""
-#: doc/classes/RenderingServer.xml:3351
+#: doc/classes/RenderingServer.xml:3419
msgid "Draw particles in the order that they appear in the particles array."
msgstr ""
-#: doc/classes/RenderingServer.xml:3354
+#: doc/classes/RenderingServer.xml:3422
msgid "Sort particles based on their lifetime."
msgstr ""
-#: doc/classes/RenderingServer.xml:3357
+#: doc/classes/RenderingServer.xml:3425
msgid "Sort particles based on their distance to the camera."
msgstr ""
-#: doc/classes/RenderingServer.xml:3360
+#: doc/classes/RenderingServer.xml:3428
msgid "Do not update the viewport."
msgstr ""
-#: doc/classes/RenderingServer.xml:3363
+#: doc/classes/RenderingServer.xml:3431
msgid "Update the viewport once then set to disabled."
msgstr ""
-#: doc/classes/RenderingServer.xml:3366
+#: doc/classes/RenderingServer.xml:3434
msgid "Update the viewport whenever it is visible."
msgstr ""
-#: doc/classes/RenderingServer.xml:3371
+#: doc/classes/RenderingServer.xml:3439
msgid "Always update the viewport."
msgstr ""
-#: doc/classes/RenderingServer.xml:3374
+#: doc/classes/RenderingServer.xml:3442
msgid "The viewport is always cleared before drawing."
msgstr ""
-#: doc/classes/RenderingServer.xml:3377
+#: doc/classes/RenderingServer.xml:3445
msgid "The viewport is never cleared before drawing."
msgstr ""
-#: doc/classes/RenderingServer.xml:3380
+#: doc/classes/RenderingServer.xml:3448
msgid ""
"The viewport is cleared once, then the clear mode is set to [constant "
"VIEWPORT_CLEAR_NEVER]."
msgstr ""
-#: doc/classes/RenderingServer.xml:3383
+#: doc/classes/RenderingServer.xml:3451
msgid "Multisample antialiasing is disabled."
msgstr ""
-#: doc/classes/RenderingServer.xml:3386
-msgid "Multisample antialiasing is set to 2×."
-msgstr ""
-
-#: doc/classes/RenderingServer.xml:3389
-msgid "Multisample antialiasing is set to 4×."
-msgstr ""
-
-#: doc/classes/RenderingServer.xml:3392
-msgid "Multisample antialiasing is set to 8×."
+#: doc/classes/RenderingServer.xml:3454
+msgid "Multisample antialiasing uses 2 samples per pixel."
msgstr ""
-#: doc/classes/RenderingServer.xml:3395
-msgid "Multisample antialiasing is set to 16×."
+#: doc/classes/RenderingServer.xml:3457
+msgid "Multisample antialiasing uses 4 samples per pixel."
msgstr ""
-#: doc/classes/RenderingServer.xml:3398
-msgid ""
-"Multisample antialiasing is set to 2× on external texture. Special mode for "
-"GLES2 Android VR (Oculus Quest and Go)."
+#: doc/classes/RenderingServer.xml:3460
+msgid "Multisample antialiasing uses 8 samples per pixel."
msgstr ""
-#: doc/classes/RenderingServer.xml:3401
-msgid ""
-"Multisample antialiasing is set to 4× on external texture. Special mode for "
-"GLES2 Android VR (Oculus Quest and Go)."
+#: doc/classes/RenderingServer.xml:3463
+msgid "Multisample antialiasing uses 16 samples per pixel."
msgstr ""
-#: doc/classes/RenderingServer.xml:3404
+#: doc/classes/RenderingServer.xml:3474
msgid "Number of objects drawn in a single frame."
msgstr ""
-#: doc/classes/RenderingServer.xml:3407
+#: doc/classes/RenderingServer.xml:3477
msgid "Number of vertices drawn in a single frame."
msgstr ""
-#: doc/classes/RenderingServer.xml:3410
+#: doc/classes/RenderingServer.xml:3480
msgid "Number of material changes during this frame."
msgstr ""
-#: doc/classes/RenderingServer.xml:3413
+#: doc/classes/RenderingServer.xml:3483
msgid "Number of shader changes during this frame."
msgstr ""
-#: doc/classes/RenderingServer.xml:3416
+#: doc/classes/RenderingServer.xml:3486
msgid "Number of surface changes during this frame."
msgstr ""
-#: doc/classes/RenderingServer.xml:3419
+#: doc/classes/RenderingServer.xml:3489
msgid "Number of draw calls during this frame."
msgstr ""
-#: doc/classes/RenderingServer.xml:3422
+#: doc/classes/RenderingServer.xml:3492
msgid "Represents the size of the [enum ViewportRenderInfo] enum."
msgstr ""
-#: doc/classes/RenderingServer.xml:3425
+#: doc/classes/RenderingServer.xml:3495
msgid "Debug draw is disabled. Default setting."
msgstr ""
-#: doc/classes/RenderingServer.xml:3428
-msgid "Debug draw sets objects to unshaded."
+#: doc/classes/RenderingServer.xml:3498 doc/classes/Viewport.xml:348
+msgid "Objects are displayed without light information."
msgstr ""
-#: doc/classes/RenderingServer.xml:3433
-msgid "Overwrites clear color to [code](0,0,0,0)[/code]."
+#: doc/classes/RenderingServer.xml:3501
+msgid "Objects are displayed with only light information."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3504 doc/classes/Viewport.xml:353
+msgid ""
+"Objects are displayed semi-transparent with additive blending so you can see "
+"where they are drawing over top of one another. A higher overdraw means you "
+"are wasting performance on drawing pixels that are being hidden behind "
+"others."
msgstr ""
-#: doc/classes/RenderingServer.xml:3436
+#: doc/classes/RenderingServer.xml:3507
msgid "Debug draw draws objects in wireframe."
msgstr ""
-#: doc/classes/RenderingServer.xml:3461
+#: doc/classes/RenderingServer.xml:3510
+msgid ""
+"Normal buffer is drawn instead of regular scene so you can see the per-pixel "
+"normals that will be used by post-processing effects."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3513 doc/classes/Viewport.xml:361
+msgid "Objects are displayed with only the albedo value from [GIProbe]s."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3516 doc/classes/Viewport.xml:364
+msgid "Objects are displayed with only the lighting value from [GIProbe]s."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3519 doc/classes/Viewport.xml:367
+msgid "Objects are displayed with only the emission color from [GIProbe]s."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3522 doc/classes/Viewport.xml:370
+msgid ""
+"Draws the shadow atlas that stores shadows from [OmniLight3D]s and "
+"[SpotLight3D]s in the upper left quadrant of the [Viewport]."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3525 doc/classes/Viewport.xml:373
+msgid ""
+"Draws the shadow atlas that stores shadows from [DirectionalLight3D]s in the "
+"upper left quadrant of the [Viewport]."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3530
+msgid ""
+"Draws the screen space ambient occlusion texture instead of the scene so "
+"that you can clearly see how it is affecting objects. In order for this "
+"display mode to work, you must have [member Environment.ssao_enabled] set in "
+"your [WorldEnvironment]."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3533 doc/classes/Viewport.xml:381
+msgid ""
+"Draws the roughness limiter post process over the Viewport so you can see "
+"where it has an effect. It must be enabled in [member ProjectSettings."
+"rendering/quality/screen_filters/screen_space_roughness_limiter] to work."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3536
+msgid ""
+"Colors each PSSM split for the [DirectionalLight3D]s in the scene a "
+"different color so you can see where the splits are. In order they will be "
+"colored red, green, blue, yellow."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3541
+msgid ""
+"Uses high quality importance sampling to process the radiance map. In "
+"general, this results in much higher quality than [constant Sky."
+"PROCESS_MODE_REALTIME] but takes much longer to generate. This should not be "
+"used if you plan on changing the sky at runtime. If you are finding that the "
+"reflection is not blurry enough and is showing sparkles or fireflies, try "
+"increasing [member ProjectSettings.rendering/quality/reflections/"
+"ggx_samples]."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3544
+msgid ""
+"Uses the fast filtering algorithm to process the radiance map. In general "
+"this results in lower quality, but substantially faster run times.\n"
+"[b]Note:[/b] The fast filtering algorithm is limited to 256x256 cubemaps, so "
+"[member Sky.radiance_size] must be set to [constant Sky.RADIANCE_SIZE_256]."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3548
msgid "Use the clear color as background."
msgstr ""
-#: doc/classes/RenderingServer.xml:3464
+#: doc/classes/RenderingServer.xml:3551
msgid "Use a specified color as the background."
msgstr ""
-#: doc/classes/RenderingServer.xml:3467
+#: doc/classes/RenderingServer.xml:3554
msgid "Use a sky resource for the background."
msgstr ""
-#: doc/classes/RenderingServer.xml:3470
+#: doc/classes/RenderingServer.xml:3557
msgid ""
"Use a specified canvas layer as the background. This can be useful for "
"instantiating a 2D scene in a 3D world."
msgstr ""
-#: doc/classes/RenderingServer.xml:3473
+#: doc/classes/RenderingServer.xml:3560
msgid ""
"Do not clear the background, use whatever was rendered last frame as the "
"background."
msgstr ""
-#: doc/classes/RenderingServer.xml:3479
+#: doc/classes/RenderingServer.xml:3566
msgid "Represents the size of the [enum EnvironmentBG] enum."
msgstr ""
-#: doc/classes/RenderingServer.xml:3506
+#: doc/classes/RenderingServer.xml:3605
msgid "Output color as they came in."
msgstr ""
-#: doc/classes/RenderingServer.xml:3509
+#: doc/classes/RenderingServer.xml:3608
msgid "Use the Reinhard tonemapper."
msgstr ""
-#: doc/classes/RenderingServer.xml:3512
+#: doc/classes/RenderingServer.xml:3611
msgid "Use the filmic tonemapper."
msgstr ""
-#: doc/classes/RenderingServer.xml:3515
+#: doc/classes/RenderingServer.xml:3614
msgid "Use the ACES tonemapper."
msgstr ""
-#: doc/classes/RenderingServer.xml:3518
+#: doc/classes/RenderingServer.xml:3625
msgid "Disables the blur set for SSAO. Will make SSAO look noisier."
msgstr ""
-#: doc/classes/RenderingServer.xml:3521
+#: doc/classes/RenderingServer.xml:3628
msgid "Perform a 1x1 blur on the SSAO output."
msgstr ""
-#: doc/classes/RenderingServer.xml:3524
+#: doc/classes/RenderingServer.xml:3631
msgid "Performs a 2x2 blur on the SSAO output."
msgstr ""
-#: doc/classes/RenderingServer.xml:3527
+#: doc/classes/RenderingServer.xml:3634
msgid "Performs a 3x3 blur on the SSAO output. Use this for smoothest SSAO."
msgstr ""
-#: doc/classes/RenderingServer.xml:3530
+#: doc/classes/RenderingServer.xml:3637
msgid "Lowest quality of screen space ambient occlusion."
msgstr ""
-#: doc/classes/RenderingServer.xml:3533
+#: doc/classes/RenderingServer.xml:3640
msgid "Medium quality screen space ambient occlusion."
msgstr ""
-#: doc/classes/RenderingServer.xml:3536
+#: doc/classes/RenderingServer.xml:3643
+msgid "High quality screen space ambient occlusion."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3646
msgid "Highest quality screen space ambient occlusion."
msgstr ""
-#: doc/classes/RenderingServer.xml:3555
+#: doc/classes/RenderingServer.xml:3657
+msgid ""
+"Lowest quality DOF blur. This is the fastest setting, but you may be able to "
+"see filtering artifacts."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3660
+msgid "Low quality DOF blur."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3663
+msgid "Medium quality DOF blur."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3666
+msgid ""
+"Highest quality DOF blur. Results in the smoothest looking blur by taking "
+"the most samples, but is also significantly slower."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3669
+msgid ""
+"Calculate the DOF blur using a box filter. The fastest option, but results "
+"in obvious lines in blur pattern."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3672
+msgid "Calculates DOF blur using a hexagon shaped filter."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3675
+msgid ""
+"Calculates DOF blur using a circle shaped filter. Best quality and most "
+"realistic, but slowest. Use only for areas where a lot of performance can be "
+"dedicated to post-processing (e.g. cutscenes)."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3690
msgid "Do not use a debug mode."
msgstr ""
-#: doc/classes/RenderingServer.xml:3558
+#: doc/classes/RenderingServer.xml:3693
msgid "Draw all objects as wireframe models."
msgstr ""
-#: doc/classes/RenderingServer.xml:3561
+#: doc/classes/RenderingServer.xml:3696
msgid ""
"Draw all objects in a way that displays how much overdraw is occurring. "
"Overdraw occurs when a section of pixels is drawn and shaded and then "
"another object covers it up. To optimize a scene, you should reduce overdraw."
msgstr ""
-#: doc/classes/RenderingServer.xml:3564
+#: doc/classes/RenderingServer.xml:3699
msgid ""
"Draw all objects without shading. Equivalent to setting all objects shaders "
"to [code]unshaded[/code]."
msgstr ""
-#: doc/classes/RenderingServer.xml:3567
+#: doc/classes/RenderingServer.xml:3702
msgid "The instance does not have a type."
msgstr ""
-#: doc/classes/RenderingServer.xml:3570
+#: doc/classes/RenderingServer.xml:3705
msgid "The instance is a mesh."
msgstr ""
-#: doc/classes/RenderingServer.xml:3573
+#: doc/classes/RenderingServer.xml:3708
msgid "The instance is a multimesh."
msgstr ""
-#: doc/classes/RenderingServer.xml:3576
+#: doc/classes/RenderingServer.xml:3711
msgid "The instance is an immediate geometry."
msgstr ""
-#: doc/classes/RenderingServer.xml:3579
+#: doc/classes/RenderingServer.xml:3714
msgid "The instance is a particle emitter."
msgstr ""
-#: doc/classes/RenderingServer.xml:3582
+#: doc/classes/RenderingServer.xml:3717
msgid "The instance is a light."
msgstr ""
-#: doc/classes/RenderingServer.xml:3585
+#: doc/classes/RenderingServer.xml:3720
msgid "The instance is a reflection probe."
msgstr ""
-#: doc/classes/RenderingServer.xml:3588
+#: doc/classes/RenderingServer.xml:3723
+msgid "The instance is a decal."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3726
msgid "The instance is a GI probe."
msgstr ""
-#: doc/classes/RenderingServer.xml:3591
+#: doc/classes/RenderingServer.xml:3729
msgid "The instance is a lightmap capture."
msgstr ""
-#: doc/classes/RenderingServer.xml:3594
+#: doc/classes/RenderingServer.xml:3732
msgid "Represents the size of the [enum InstanceType] enum."
msgstr ""
-#: doc/classes/RenderingServer.xml:3597
+#: doc/classes/RenderingServer.xml:3735
msgid ""
"A combination of the flags of geometry instances (mesh, multimesh, immediate "
"and particles)."
msgstr ""
-#: doc/classes/RenderingServer.xml:3600
+#: doc/classes/RenderingServer.xml:3738
msgid "Allows the instance to be used in baked lighting."
msgstr ""
-#: doc/classes/RenderingServer.xml:3605
+#: doc/classes/RenderingServer.xml:3741
+msgid "Allows the instance to be used with dynamic global illumination."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3744
msgid "When set, manually requests to draw geometry on next frame."
msgstr ""
-#: doc/classes/RenderingServer.xml:3608
+#: doc/classes/RenderingServer.xml:3747
msgid "Represents the size of the [enum InstanceFlags] enum."
msgstr ""
-#: doc/classes/RenderingServer.xml:3611
+#: doc/classes/RenderingServer.xml:3750
msgid "Disable shadows from this instance."
msgstr ""
-#: doc/classes/RenderingServer.xml:3614
+#: doc/classes/RenderingServer.xml:3753
msgid "Cast shadows from this instance."
msgstr ""
-#: doc/classes/RenderingServer.xml:3617
+#: doc/classes/RenderingServer.xml:3756
msgid ""
"Disable backface culling when rendering the shadow of the object. This is "
"slightly slower but may result in more correct shadows."
msgstr ""
-#: doc/classes/RenderingServer.xml:3620
+#: doc/classes/RenderingServer.xml:3759
msgid ""
"Only render the shadows from the object. The object itself will not be drawn."
msgstr ""
-#: doc/classes/RenderingServer.xml:3623
+#: doc/classes/RenderingServer.xml:3762
msgid "The nine patch gets stretched where needed."
msgstr ""
-#: doc/classes/RenderingServer.xml:3626
+#: doc/classes/RenderingServer.xml:3765
msgid "The nine patch gets filled with tiles where needed."
msgstr ""
-#: doc/classes/RenderingServer.xml:3629
+#: doc/classes/RenderingServer.xml:3768
msgid ""
"The nine patch gets filled with tiles where needed and stretches them a bit "
"if needed."
msgstr ""
-#: doc/classes/RenderingServer.xml:3658
+#: doc/classes/RenderingServer.xml:3771
+msgid "Uses the default filter mode for this [Viewport]."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3783 doc/classes/Viewport.xml:399
+msgid ""
+"The texture filter blends between the nearest 4 pixels and between the "
+"nearest 2 mipmaps."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3792
+msgid "Max value for [enum CanvasItemTextureFilter] enum."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3795
+msgid "Uses the default repeat mode for this [Viewport]."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3798 doc/classes/Viewport.xml:405
+msgid ""
+"Disables textures repeating. Instead, when reading UVs outside the 0-1 "
+"range, the value will be clamped to the edge of the texture, resulting in a "
+"stretched out look at the borders of the texture."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3804 doc/classes/Viewport.xml:411
+msgid ""
+"Flip the texture when repeating so that the edge lines up instead of "
+"abruptly changing."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3807
+msgid "Max value for [enum CanvasItemTextureRepeat] enum."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3810
msgid "Adds light color additive to the canvas."
msgstr ""
-#: doc/classes/RenderingServer.xml:3661
+#: doc/classes/RenderingServer.xml:3813
msgid "Adds light color subtractive to the canvas."
msgstr ""
-#: doc/classes/RenderingServer.xml:3664
+#: doc/classes/RenderingServer.xml:3816
msgid "The light adds color depending on transparency."
msgstr ""
-#: doc/classes/RenderingServer.xml:3667
+#: doc/classes/RenderingServer.xml:3819
msgid "The light adds color depending on mask."
msgstr ""
-#: doc/classes/RenderingServer.xml:3670
+#: doc/classes/RenderingServer.xml:3822
msgid "Do not apply a filter to canvas light shadows."
msgstr ""
-#: doc/classes/RenderingServer.xml:3673
+#: doc/classes/RenderingServer.xml:3825
msgid "Use PCF5 filtering to filter canvas light shadows."
msgstr ""
-#: doc/classes/RenderingServer.xml:3676
+#: doc/classes/RenderingServer.xml:3828
msgid "Use PCF13 filtering to filter canvas light shadows."
msgstr ""
-#: doc/classes/RenderingServer.xml:3681
+#: doc/classes/RenderingServer.xml:3831
+msgid "Max value of the [enum CanvasLightShadowFilter] enum."
+msgstr ""
+
+#: doc/classes/RenderingServer.xml:3834
msgid "Culling of the canvas occluder is disabled."
msgstr ""
-#: doc/classes/RenderingServer.xml:3684
+#: doc/classes/RenderingServer.xml:3837
msgid "Culling of the canvas occluder is clockwise."
msgstr ""
-#: doc/classes/RenderingServer.xml:3687
+#: doc/classes/RenderingServer.xml:3840
msgid "Culling of the canvas occluder is counterclockwise."
msgstr ""
-#: doc/classes/RenderingServer.xml:3690
+#: doc/classes/RenderingServer.xml:3901
msgid "The amount of objects in the frame."
msgstr ""
-#: doc/classes/RenderingServer.xml:3693
+#: doc/classes/RenderingServer.xml:3904
msgid "The amount of vertices in the frame."
msgstr ""
-#: doc/classes/RenderingServer.xml:3696
+#: doc/classes/RenderingServer.xml:3907
msgid "The amount of modified materials in the frame."
msgstr ""
-#: doc/classes/RenderingServer.xml:3699
+#: doc/classes/RenderingServer.xml:3910
msgid "The amount of shader rebinds in the frame."
msgstr ""
-#: doc/classes/RenderingServer.xml:3702
+#: doc/classes/RenderingServer.xml:3913
msgid "The amount of surface changes in the frame."
msgstr ""
-#: doc/classes/RenderingServer.xml:3705
+#: doc/classes/RenderingServer.xml:3916
msgid "The amount of draw calls in frame."
msgstr ""
-#: doc/classes/RenderingServer.xml:3720
+#: doc/classes/RenderingServer.xml:3931
msgid "Hardware supports shaders. This enum is currently unused in Godot 3.x."
msgstr ""
-#: doc/classes/RenderingServer.xml:3723
+#: doc/classes/RenderingServer.xml:3934
msgid ""
"Hardware supports multithreading. This enum is currently unused in Godot 3.x."
msgstr ""
@@ -44091,15 +44366,11 @@ msgid ""
"Physics > 2d[/b]."
msgstr ""
-#: doc/classes/RigidBody2D.xml:158 doc/classes/RigidBody3D.xml:174
-msgid "The body's mass."
-msgstr ""
-
#: doc/classes/RigidBody2D.xml:161
msgid "The body's mode. See [enum Mode] for possible values."
msgstr ""
-#: doc/classes/RigidBody2D.xml:164 doc/classes/RigidBody3D.xml:180
+#: doc/classes/RigidBody2D.xml:164 doc/classes/RigidBody3D.xml:181
#: doc/classes/StaticBody2D.xml:22 doc/classes/StaticBody3D.xml:22
msgid ""
"The physics material override for the body.\n"
@@ -44228,22 +44499,32 @@ msgid ""
"for a body."
msgstr ""
+#: doc/classes/RigidBody3D.xml:31
+msgid ""
+"Adds a constant directional force (i.e. acceleration) without affecting "
+"rotation.\n"
+"This is equivalent to [code]add_force(force, Vector3(0,0,0))[/code]."
+msgstr ""
+
#: doc/classes/RigidBody3D.xml:43
-msgid "Adds a constant force (i.e. acceleration)."
+msgid ""
+"Adds a constant directional force (i.e. acceleration).\n"
+"The position uses the rotation of the global coordinate system, but is "
+"centered at the object's origin."
msgstr ""
-#: doc/classes/RigidBody3D.xml:52
+#: doc/classes/RigidBody3D.xml:53
msgid ""
"Adds a constant rotational force (i.e. a motor) without affecting position."
msgstr ""
-#: doc/classes/RigidBody3D.xml:61
+#: doc/classes/RigidBody3D.xml:62
msgid ""
"Applies a directional impulse without affecting rotation.\n"
"This is equivalent to [code]apply_impulse(Vector3(0,0,0), impulse)[/code]."
msgstr ""
-#: doc/classes/RigidBody3D.xml:73
+#: doc/classes/RigidBody3D.xml:74
msgid ""
"Applies a positioned impulse to the body. An impulse is time independent! "
"Applying an impulse every frame would result in a framerate-dependent force. "
@@ -44252,19 +44533,19 @@ msgid ""
"at the object's origin."
msgstr ""
-#: doc/classes/RigidBody3D.xml:82
+#: doc/classes/RigidBody3D.xml:83
msgid ""
"Applies a torque impulse which will be affected by the body mass and shape. "
"This will rotate the body around the [code]impulse[/code] vector passed."
msgstr ""
-#: doc/classes/RigidBody3D.xml:91
+#: doc/classes/RigidBody3D.xml:92
msgid ""
"Returns [code]true[/code] if the specified linear or rotational axis is "
"locked."
msgstr ""
-#: doc/classes/RigidBody3D.xml:98
+#: doc/classes/RigidBody3D.xml:99
msgid ""
"Returns a list of the bodies colliding with this one. By default, number of "
"max contacts reported is at 0, see the [member contacts_reported] property "
@@ -44274,64 +44555,32 @@ msgid ""
"physics step. Consider using signals instead."
msgstr ""
-#: doc/classes/RigidBody3D.xml:110
+#: doc/classes/RigidBody3D.xml:111
msgid "Locks the specified linear or rotational axis."
msgstr ""
-#: doc/classes/RigidBody3D.xml:125
+#: doc/classes/RigidBody3D.xml:126
msgid "Damps RigidBody3D's rotational forces."
msgstr ""
-#: doc/classes/RigidBody3D.xml:128
+#: doc/classes/RigidBody3D.xml:129
msgid "RigidBody3D's rotational velocity."
msgstr ""
-#: doc/classes/RigidBody3D.xml:131
-msgid "Lock the body's rotation in the X axis."
-msgstr ""
-
-#: doc/classes/RigidBody3D.xml:134
-msgid "Lock the body's rotation in the Y axis."
-msgstr ""
-
-#: doc/classes/RigidBody3D.xml:137
-msgid "Lock the body's rotation in the Z axis."
-msgstr ""
-
-#: doc/classes/RigidBody3D.xml:140
-msgid "Lock the body's movement in the X axis."
-msgstr ""
-
-#: doc/classes/RigidBody3D.xml:143
-msgid "Lock the body's movement in the Y axis."
-msgstr ""
-
-#: doc/classes/RigidBody3D.xml:146
-msgid "Lock the body's movement in the Z axis."
-msgstr ""
-
-#: doc/classes/RigidBody3D.xml:149
-msgid ""
-"If [code]true[/code], the RigidBody3D will not calculate forces and will act "
-"as a static body while there is no movement. It will wake up when forces are "
-"applied through other collisions or when the [code]apply_impulse[/code] "
-"method is used."
-msgstr ""
-
-#: doc/classes/RigidBody3D.xml:152
+#: doc/classes/RigidBody3D.xml:153
msgid ""
"If [code]true[/code], the RigidBody3D will emit signals when it collides "
"with another RigidBody3D."
msgstr ""
-#: doc/classes/RigidBody3D.xml:155
+#: doc/classes/RigidBody3D.xml:156
msgid ""
"The maximum contacts to report. Bodies can keep a log of the contacts with "
"other bodies, this is enabled by setting the maximum amount of contacts "
"reported to a number greater than 0."
msgstr ""
-#: doc/classes/RigidBody3D.xml:158
+#: doc/classes/RigidBody3D.xml:159
msgid ""
"If [code]true[/code], continuous collision detection is used.\n"
"Continuous collision detection tries to predict where a moving body will "
@@ -44341,7 +44590,7 @@ msgid ""
"faster to compute, but can miss small, fast-moving objects."
msgstr ""
-#: doc/classes/RigidBody3D.xml:162
+#: doc/classes/RigidBody3D.xml:163
msgid ""
"If [code]true[/code], internal force integration will be disabled (like "
"gravity or air friction) for this body. Other than collision response, the "
@@ -44349,7 +44598,7 @@ msgid ""
"function, if defined."
msgstr ""
-#: doc/classes/RigidBody3D.xml:165
+#: doc/classes/RigidBody3D.xml:166
msgid ""
"This is multiplied by the global 3D gravity setting found in [b]Project > "
"Project Settings > Physics > 3d[/b] to produce RigidBody3D's gravity. For "
@@ -44357,14 +44606,14 @@ msgid ""
"and 0.5 will apply half gravity to this object."
msgstr ""
-#: doc/classes/RigidBody3D.xml:168
+#: doc/classes/RigidBody3D.xml:169
msgid ""
"The body's linear damp. Cannot be less than -1.0. If this value is different "
"from -1.0, any linear damp derived from the world or areas will be "
"overridden."
msgstr ""
-#: doc/classes/RigidBody3D.xml:171
+#: doc/classes/RigidBody3D.xml:172
msgid ""
"The body's linear velocity. Can be used sporadically, but [b]don't set this "
"every frame[/b], because physics may run in another thread and runs at a "
@@ -44372,35 +44621,29 @@ msgid ""
"for precise control of the body state."
msgstr ""
-#: doc/classes/RigidBody3D.xml:177
+#: doc/classes/RigidBody3D.xml:178
msgid "The body mode. See [enum Mode] for possible values."
msgstr ""
-#: doc/classes/RigidBody3D.xml:184
+#: doc/classes/RigidBody3D.xml:185
msgid ""
"If [code]true[/code], the body is sleeping and will not calculate forces "
"until woken up by a collision or the [code]apply_impulse[/code] method."
msgstr ""
-#: doc/classes/RigidBody3D.xml:187
-msgid ""
-"The body's weight based on its mass and the global 3D gravity. Global values "
-"are set in [b]Project > Project Settings > Physics > 3d[/b]."
-msgstr ""
-
-#: doc/classes/RigidBody3D.xml:195
+#: doc/classes/RigidBody3D.xml:196
msgid ""
"Emitted when a body enters into contact with this one. Contact monitor and "
"contacts reported must be enabled for this to work."
msgstr ""
-#: doc/classes/RigidBody3D.xml:202
+#: doc/classes/RigidBody3D.xml:203
msgid ""
"Emitted when a body shape exits contact with this one. Contact monitor and "
"contacts reported must be enabled for this to work."
msgstr ""
-#: doc/classes/RigidBody3D.xml:215
+#: doc/classes/RigidBody3D.xml:216
msgid ""
"Emitted when a body enters into contact with this one. Contact monitor and "
"contacts reported must be enabled for this to work.\n"
@@ -44410,7 +44653,7 @@ msgid ""
"([code]local_shape[/code]) the other body collided with."
msgstr ""
-#: doc/classes/RigidBody3D.xml:229
+#: doc/classes/RigidBody3D.xml:230
msgid ""
"Emitted when a body shape exits contact with this one. Contact monitor and "
"contacts reported must be enabled for this to work.\n"
@@ -44420,30 +44663,30 @@ msgid ""
"([code]local_shape[/code]) the other body stopped colliding with."
msgstr ""
-#: doc/classes/RigidBody3D.xml:235
+#: doc/classes/RigidBody3D.xml:236
msgid ""
"Emitted when the body changes its sleeping state. Either by sleeping or "
"waking up."
msgstr ""
-#: doc/classes/RigidBody3D.xml:241
+#: doc/classes/RigidBody3D.xml:242
msgid ""
"Rigid body mode. This is the \"natural\" state of a rigid body. It is "
"affected by forces, and can move, rotate, and be affected by user code."
msgstr ""
-#: doc/classes/RigidBody3D.xml:244
+#: doc/classes/RigidBody3D.xml:245
msgid ""
"Static mode. The body behaves like a [StaticBody3D], and can only move by "
"user code."
msgstr ""
-#: doc/classes/RigidBody3D.xml:247
+#: doc/classes/RigidBody3D.xml:248
msgid ""
"Character body mode. This behaves like a rigid body, but can not rotate."
msgstr ""
-#: doc/classes/RigidBody3D.xml:250
+#: doc/classes/RigidBody3D.xml:251
msgid ""
"Kinematic body mode. The body behaves like a [KinematicBody3D], and can only "
"move by user code."
@@ -45067,27 +45310,33 @@ msgstr ""
msgid "Godot editor's script editor."
msgstr ""
-#: doc/classes/ScriptEditor.xml:39
+#: doc/classes/ScriptEditor.xml:7
+msgid ""
+"[b]Note:[/b] This class shouldn't be instantiated directly. Instead, access "
+"the singleton using [method EditorInterface.get_script_editor]."
+msgstr ""
+
+#: doc/classes/ScriptEditor.xml:40
msgid "Returns a [Script] that is currently active in editor."
msgstr ""
-#: doc/classes/ScriptEditor.xml:56
+#: doc/classes/ScriptEditor.xml:57
msgid ""
"Returns an array with all [Script] objects which are currently open in "
"editor."
msgstr ""
-#: doc/classes/ScriptEditor.xml:65
+#: doc/classes/ScriptEditor.xml:66
msgid "Goes to the specified line in the current script."
msgstr ""
-#: doc/classes/ScriptEditor.xml:84
+#: doc/classes/ScriptEditor.xml:85
msgid ""
"Emitted when user changed active script. Argument is a freshly activated "
"[Script]."
msgstr ""
-#: doc/classes/ScriptEditor.xml:91
+#: doc/classes/ScriptEditor.xml:92
msgid ""
"Emitted when editor is about to close the active script. Argument is a "
"[Script] that is going to be closed."
@@ -45149,7 +45398,7 @@ msgid ""
"visible."
msgstr ""
-#: doc/classes/ScrollContainer.xml:37 doc/classes/TextEdit.xml:441
+#: doc/classes/ScrollContainer.xml:37 doc/classes/TextEdit.xml:442
msgid "The current horizontal scroll value."
msgstr ""
@@ -45157,7 +45406,7 @@ msgstr ""
msgid "If [code]true[/code], enables horizontal scrolling."
msgstr ""
-#: doc/classes/ScrollContainer.xml:43 doc/classes/TextEdit.xml:444
+#: doc/classes/ScrollContainer.xml:43 doc/classes/TextEdit.xml:445
msgid "The current vertical scroll value."
msgstr ""
@@ -45687,7 +45936,10 @@ msgid ""
"Uses high quality importance sampling to process the radiance map. In "
"general, this results in much higher quality than [constant "
"PROCESS_MODE_REALTIME] but takes much longer to generate. This should not be "
-"used if you plan on changing the sky at runtime."
+"used if you plan on changing the sky at runtime. If you are finding that the "
+"reflection is not blurry enough and is showing sparkles or fireflies, try "
+"increasing [member ProjectSettings.rendering/quality/reflections/"
+"ggx_samples]."
msgstr ""
#: doc/classes/Sky.xml:55
@@ -47881,65 +48133,65 @@ msgid ""
msgstr ""
#: doc/classes/SubViewport.xml:13
-msgid "If [code]true[/code], the sub-viewport will be used in AR/VR process."
-msgstr ""
-
-#: doc/classes/SubViewport.xml:16
msgid "The clear mode when the sub-viewport is used as a render target."
msgstr ""
-#: doc/classes/SubViewport.xml:19
+#: doc/classes/SubViewport.xml:16
msgid "The update mode when the sub-viewport is used as a render target."
msgstr ""
-#: doc/classes/SubViewport.xml:22
+#: doc/classes/SubViewport.xml:19
msgid "The width and height of the sub-viewport."
msgstr ""
-#: doc/classes/SubViewport.xml:25
+#: doc/classes/SubViewport.xml:22
msgid ""
"The 2D size override of the sub-viewport. If either the width or height is "
"[code]0[/code], the override is disabled."
msgstr ""
-#: doc/classes/SubViewport.xml:28
+#: doc/classes/SubViewport.xml:25
msgid "If [code]true[/code], the 2D size override affects stretch as well."
msgstr ""
+#: doc/classes/SubViewport.xml:28
+msgid "If [code]true[/code], the sub-viewport will be used in AR/VR process."
+msgstr ""
+
#: doc/classes/SubViewport.xml:33
-msgid "Do not update the render target."
+msgid "Always clear the render target before drawing."
msgstr ""
#: doc/classes/SubViewport.xml:36
-msgid ""
-"Update the render target once, then switch to [constant UPDATE_DISABLED]."
+msgid "Never clear the render target."
msgstr ""
#: doc/classes/SubViewport.xml:39
msgid ""
-"Update the render target only when it is visible. This is the default value."
+"Clear the render target next frame, then switch to [constant "
+"CLEAR_MODE_NEVER]."
msgstr ""
#: doc/classes/SubViewport.xml:42
-msgid "Update the render target only when the its parent is visible."
+msgid "Do not update the render target."
msgstr ""
#: doc/classes/SubViewport.xml:45
-msgid "Always update the render target."
+msgid ""
+"Update the render target once, then switch to [constant UPDATE_DISABLED]."
msgstr ""
#: doc/classes/SubViewport.xml:48
-msgid "Always clear the render target before drawing."
+msgid ""
+"Update the render target only when it is visible. This is the default value."
msgstr ""
#: doc/classes/SubViewport.xml:51
-msgid "Never clear the render target."
+msgid "Update the render target only when the its parent is visible."
msgstr ""
#: doc/classes/SubViewport.xml:54
-msgid ""
-"Clear the render target next frame, then switch to [constant "
-"CLEAR_MODE_NEVER]."
+msgid "Always update the render target."
msgstr ""
#: doc/classes/SubViewportContainer.xml:4
@@ -47994,85 +48246,90 @@ msgid ""
"information to a mesh.\n"
"Additionally, the attributes used before the first vertex is added determine "
"the format of the mesh. For example, if you only add UVs to the first "
-"vertex, you cannot add color to any of the subsequent vertices."
+"vertex, you cannot add color to any of the subsequent vertices.\n"
+"See also [ArrayMesh], [ImmediateGeometry3D] and [MeshDataTool] for "
+"procedural geometry generation.\n"
+"[b]Note:[/b] Godot uses clockwise [url=https://learnopengl.com/Advanced-"
+"OpenGL/Face-culling]winding order[/url] for front faces of triangle "
+"primitive modes."
msgstr ""
-#: doc/classes/SurfaceTool.xml:28
+#: doc/classes/SurfaceTool.xml:30
msgid ""
"Adds an array of bones for the next vertex to use. [code]bones[/code] must "
"contain 4 integers."
msgstr ""
-#: doc/classes/SurfaceTool.xml:37
+#: doc/classes/SurfaceTool.xml:39
msgid "Specifies a [Color] for the next vertex to use."
msgstr ""
-#: doc/classes/SurfaceTool.xml:46
+#: doc/classes/SurfaceTool.xml:48
msgid ""
"Adds an index to index array if you are using indexed vertices. Does not "
"need to be called before adding vertices."
msgstr ""
-#: doc/classes/SurfaceTool.xml:55
+#: doc/classes/SurfaceTool.xml:57
msgid "Specifies a normal for the next vertex to use."
msgstr ""
-#: doc/classes/SurfaceTool.xml:64
+#: doc/classes/SurfaceTool.xml:66
msgid ""
"Specifies whether the current vertex (if using only vertex arrays) or "
"current index (if also using index arrays) should use smooth normals for "
"normal calculation."
msgstr ""
-#: doc/classes/SurfaceTool.xml:73
+#: doc/classes/SurfaceTool.xml:75
msgid "Specifies a tangent for the next vertex to use."
msgstr ""
-#: doc/classes/SurfaceTool.xml:92
+#: doc/classes/SurfaceTool.xml:94
msgid ""
"Inserts a triangle fan made of array data into [Mesh] being constructed.\n"
"Requires the primitive type be set to [constant Mesh.PRIMITIVE_TRIANGLES]."
msgstr ""
-#: doc/classes/SurfaceTool.xml:102
+#: doc/classes/SurfaceTool.xml:104
msgid "Specifies a set of UV coordinates to use for the next vertex."
msgstr ""
-#: doc/classes/SurfaceTool.xml:111
+#: doc/classes/SurfaceTool.xml:113
msgid ""
"Specifies an optional second set of UV coordinates to use for the next "
"vertex."
msgstr ""
-#: doc/classes/SurfaceTool.xml:120
+#: doc/classes/SurfaceTool.xml:122
msgid ""
"Specifies the position of current vertex. Should be called after specifying "
"other vertex properties (e.g. Color, UV)."
msgstr ""
-#: doc/classes/SurfaceTool.xml:129
+#: doc/classes/SurfaceTool.xml:131
msgid ""
"Specifies weight values for next vertex to use. [code]weights[/code] must "
"contain 4 values."
msgstr ""
-#: doc/classes/SurfaceTool.xml:142
+#: doc/classes/SurfaceTool.xml:144
msgid ""
"Append vertices from a given [Mesh] surface onto the current vertex array "
"with specified [Transform]."
msgstr ""
-#: doc/classes/SurfaceTool.xml:151
+#: doc/classes/SurfaceTool.xml:153
msgid ""
"Called before adding any vertices. Takes the primitive type as an argument "
"(e.g. [constant Mesh.PRIMITIVE_TRIANGLES])."
msgstr ""
-#: doc/classes/SurfaceTool.xml:158
+#: doc/classes/SurfaceTool.xml:160
msgid "Clear all information passed into the surface tool so far."
msgstr ""
-#: doc/classes/SurfaceTool.xml:169
+#: doc/classes/SurfaceTool.xml:171
msgid ""
"Returns a constructed [ArrayMesh] from current information passed in. If an "
"existing [ArrayMesh] is passed in as an argument, will add an extra surface "
@@ -48082,28 +48339,28 @@ msgid ""
"flags."
msgstr ""
-#: doc/classes/SurfaceTool.xml:177
+#: doc/classes/SurfaceTool.xml:179
msgid ""
"Commits the data to the same format used by [method ArrayMesh."
"add_surface_from_arrays]. This way you can further process the mesh data "
"using the [ArrayMesh] API."
msgstr ""
-#: doc/classes/SurfaceTool.xml:188
+#: doc/classes/SurfaceTool.xml:190
msgid "Creates a vertex array from an existing [Mesh]."
msgstr ""
-#: doc/classes/SurfaceTool.xml:201
+#: doc/classes/SurfaceTool.xml:203
msgid ""
"Creates a vertex array from the specified blend shape of an existing [Mesh]. "
"This can be used to extract a specific pose from a blend shape."
msgstr ""
-#: doc/classes/SurfaceTool.xml:208
+#: doc/classes/SurfaceTool.xml:210
msgid "Removes the index array by expanding the vertex array."
msgstr ""
-#: doc/classes/SurfaceTool.xml:217
+#: doc/classes/SurfaceTool.xml:219
msgid ""
"Generates normals from vertices so you do not have to do it manually. If "
"[code]flip[/code] is [code]true[/code], the resulting normals will be "
@@ -48111,19 +48368,19 @@ msgid ""
"Requires the primitive type to be set to [constant Mesh.PRIMITIVE_TRIANGLES]."
msgstr ""
-#: doc/classes/SurfaceTool.xml:225
+#: doc/classes/SurfaceTool.xml:227
msgid ""
"Generates a tangent vector for each vertex. Requires that each vertex have "
"UVs and normals set already."
msgstr ""
-#: doc/classes/SurfaceTool.xml:232
+#: doc/classes/SurfaceTool.xml:234
msgid ""
"Shrinks the vertex array by creating an index array (avoids reusing "
"vertices)."
msgstr ""
-#: doc/classes/SurfaceTool.xml:241
+#: doc/classes/SurfaceTool.xml:243
msgid "Sets [Material] to be used by the [Mesh] you are constructing."
msgstr ""
@@ -48157,7 +48414,7 @@ msgid "Returns the previously active tab index."
msgstr ""
#: doc/classes/TabContainer.xml:42
-msgid "Returns the currently visible tab's [Control] node."
+msgid "Returns the [Control] node from the tab at index [code]tab_idx[/code]."
msgstr ""
#: doc/classes/TabContainer.xml:49 doc/classes/Tabs.xml:50
@@ -48826,151 +49083,163 @@ msgstr ""
msgid "If [code]true[/code], the line containing the cursor is highlighted."
msgstr ""
-#: doc/classes/TextEdit.xml:438
+#: doc/classes/TextEdit.xml:436
+msgid ""
+"If [code]true[/code], custom [code]font_color_selected[/code] will be used "
+"for selected text."
+msgstr ""
+
+#: doc/classes/TextEdit.xml:439
msgid ""
"If [code]true[/code], read-only mode is enabled. Existing text cannot be "
"modified and new text cannot be added."
msgstr ""
-#: doc/classes/TextEdit.xml:451
+#: doc/classes/TextEdit.xml:452
msgid ""
"If [code]true[/code], line numbers are displayed to the left of the text."
msgstr ""
-#: doc/classes/TextEdit.xml:454
+#: doc/classes/TextEdit.xml:455
msgid ""
"If [code]true[/code], sets the [code]step[/code] of the scrollbars to "
"[code]0.25[/code] which results in smoother scrolling."
msgstr ""
-#: doc/classes/TextEdit.xml:457
+#: doc/classes/TextEdit.xml:458
msgid ""
"If [code]true[/code], any custom color properties that have been set for "
"this [TextEdit] will be visible."
msgstr ""
-#: doc/classes/TextEdit.xml:460
+#: doc/classes/TextEdit.xml:461
msgid "String value of the [TextEdit]."
msgstr ""
-#: doc/classes/TextEdit.xml:463
+#: doc/classes/TextEdit.xml:464
msgid "Vertical scroll sensitivity."
msgstr ""
-#: doc/classes/TextEdit.xml:466
+#: doc/classes/TextEdit.xml:467
msgid ""
"If [code]true[/code], enables text wrapping when it goes beyond the edge of "
"what is visible."
msgstr ""
-#: doc/classes/TextEdit.xml:474
+#: doc/classes/TextEdit.xml:475
msgid "Emitted when a breakpoint is placed via the breakpoint gutter."
msgstr ""
-#: doc/classes/TextEdit.xml:479
+#: doc/classes/TextEdit.xml:480
msgid "Emitted when the cursor changes."
msgstr ""
-#: doc/classes/TextEdit.xml:488
+#: doc/classes/TextEdit.xml:489
msgid "Emitted when the info icon is clicked."
msgstr ""
-#: doc/classes/TextEdit.xml:519
+#: doc/classes/TextEdit.xml:520
msgid "Match case when searching."
msgstr ""
-#: doc/classes/TextEdit.xml:522
+#: doc/classes/TextEdit.xml:523
msgid "Match whole words when searching."
msgstr ""
-#: doc/classes/TextEdit.xml:525
+#: doc/classes/TextEdit.xml:526
msgid "Search from end to beginning."
msgstr ""
-#: doc/classes/TextEdit.xml:528
+#: doc/classes/TextEdit.xml:529
msgid "Used to access the result column from [method search]."
msgstr ""
-#: doc/classes/TextEdit.xml:531
+#: doc/classes/TextEdit.xml:532
msgid "Used to access the result line from [method search]."
msgstr ""
-#: doc/classes/TextEdit.xml:540
+#: doc/classes/TextEdit.xml:541
msgid ""
"Pastes the clipboard text over the selected text (or at the cursor's "
"position)."
msgstr ""
-#: doc/classes/TextEdit.xml:543
+#: doc/classes/TextEdit.xml:544
msgid "Erases the whole [TextEdit] text."
msgstr ""
-#: doc/classes/TextEdit.xml:546
+#: doc/classes/TextEdit.xml:547
msgid "Selects the whole [TextEdit] text."
msgstr ""
-#: doc/classes/TextEdit.xml:552
+#: doc/classes/TextEdit.xml:553
msgid "Redoes the previous action."
msgstr ""
-#: doc/classes/TextEdit.xml:560
+#: doc/classes/TextEdit.xml:561
msgid ""
"Sets the background [Color] of this [TextEdit]. [member syntax_highlighting] "
"has to be enabled."
msgstr ""
-#: doc/classes/TextEdit.xml:563
+#: doc/classes/TextEdit.xml:564
msgid ""
"Sets the [Color] of the bookmark marker. [member syntax_highlighting] has to "
"be enabled."
msgstr ""
-#: doc/classes/TextEdit.xml:568 doc/classes/TextEdit.xml:595
+#: doc/classes/TextEdit.xml:569 doc/classes/TextEdit.xml:596
msgid ""
"Sets the [Color] of the breakpoints. [member breakpoint_gutter] has to be "
"enabled."
msgstr ""
-#: doc/classes/TextEdit.xml:606
+#: doc/classes/TextEdit.xml:607
msgid "Sets the default [Font]."
msgstr ""
-#: doc/classes/TextEdit.xml:609
+#: doc/classes/TextEdit.xml:610
msgid "Sets the font [Color]."
msgstr ""
-#: doc/classes/TextEdit.xml:618
+#: doc/classes/TextEdit.xml:615
+msgid ""
+"Sets the [Color] of the selected text. [member override_selected_font_color] "
+"has to be enabled."
+msgstr ""
+
+#: doc/classes/TextEdit.xml:620
msgid ""
"Sets the [Color] of the line numbers. [member show_line_numbers] has to be "
"enabled."
msgstr ""
-#: doc/classes/TextEdit.xml:621
+#: doc/classes/TextEdit.xml:623
msgid "Sets the spacing between the lines."
msgstr ""
-#: doc/classes/TextEdit.xml:624
+#: doc/classes/TextEdit.xml:626
msgid "Sets the [Color] of marked text."
msgstr ""
-#: doc/classes/TextEdit.xml:629
+#: doc/classes/TextEdit.xml:631
msgid "Sets the [StyleBox] of this [TextEdit]."
msgstr ""
-#: doc/classes/TextEdit.xml:634
+#: doc/classes/TextEdit.xml:636
msgid ""
"Sets the [StyleBox] of this [TextEdit] when [member readonly] is enabled."
msgstr ""
-#: doc/classes/TextEdit.xml:639
+#: doc/classes/TextEdit.xml:641
msgid "Sets the highlight [Color] of text selections."
msgstr ""
-#: doc/classes/TextEdit.xml:646
+#: doc/classes/TextEdit.xml:648
msgid "Sets a custom [Texture2D] for tab text characters."
msgstr ""
-#: doc/classes/TextEdit.xml:649
+#: doc/classes/TextEdit.xml:651
msgid ""
"Sets the highlight [Color] of multiple occurrences. [member "
"highlight_all_occurrences] has to be enabled."
@@ -49642,8 +49911,8 @@ msgstr ""
#: doc/classes/TileMap.xml:46
msgid ""
-"Returns the coordinate of the autotile variation in the tileset. Returns a "
-"zero vector if the cell doesn't have autotiling."
+"Returns the coordinate (subtile column and row) of the autotile variation in "
+"the tileset. Returns a zero vector if the cell doesn't have autotiling."
msgstr ""
#: doc/classes/TileMap.xml:55
@@ -49700,7 +49969,8 @@ msgid ""
"Sets the tile index for the cell given by a Vector2.\n"
"An index of [code]-1[/code] clears the cell.\n"
"Optionally, the tile can also be flipped, transposed, or given autotile "
-"coordinates.\n"
+"coordinates. The autotile coordinate refers to the column and row of the "
+"subtile.\n"
"[b]Note:[/b] Data such as navigation polygons and collision shapes are not "
"immediately updated for performance reasons.\n"
"If you need these to be immediately updated, you can call [method "
@@ -50507,9 +50777,10 @@ msgid ""
"using matrix multiplication. The axis must be a normalized vector."
msgstr ""
-#: doc/classes/Transform.xml:138 doc/classes/Transform2D.xml:140
+#: doc/classes/Transform.xml:138
msgid ""
-"Scales the transform by the given scale factor, using matrix multiplication."
+"Scales basis and origin of the transform by the given scale factor, using "
+"matrix multiplication."
msgstr ""
#: doc/classes/Transform.xml:147 doc/classes/Transform2D.xml:149
@@ -50619,6 +50890,11 @@ msgid ""
"multiplication."
msgstr ""
+#: doc/classes/Transform2D.xml:140
+msgid ""
+"Scales the transform by the given scale factor, using matrix multiplication."
+msgstr ""
+
#: doc/classes/Transform2D.xml:159
msgid ""
"Transforms the given [Vector2], [Rect2], or [PackedVector2Array] by this "
@@ -50776,7 +51052,8 @@ msgid ""
"[/codeblock]\n"
"To iterate over all the [TreeItem] objects in a [Tree] object, use [method "
"TreeItem.get_next] and [method TreeItem.get_children] after getting the root "
-"through [method get_root]."
+"through [method get_root]. You can use [method Object.free] on a [TreeItem] "
+"to remove it from the [Tree]."
msgstr ""
#: doc/classes/Tree.xml:28
@@ -51262,10 +51539,11 @@ msgstr ""
#: doc/classes/TreeItem.xml:7
msgid ""
"Control for a single item inside a [Tree]. May have child [TreeItem]s and be "
-"styled as well as contain buttons."
+"styled as well as contain buttons.\n"
+"You can remove a [TreeItem] by using [method Object.free]."
msgstr ""
-#: doc/classes/TreeItem.xml:26
+#: doc/classes/TreeItem.xml:27
msgid ""
"Adds a button with [Texture2D] [code]button[/code] at column [code]column[/"
"code]. The [code]button_idx[/code] index is used to identify the button when "
@@ -51275,89 +51553,89 @@ msgid ""
"have a [code]tooltip[/code]."
msgstr ""
-#: doc/classes/TreeItem.xml:35
+#: doc/classes/TreeItem.xml:36
msgid ""
"Calls the [code]method[/code] on the actual TreeItem and its children "
"recursively. Pass parameters as a comma separated list."
msgstr ""
-#: doc/classes/TreeItem.xml:44
+#: doc/classes/TreeItem.xml:45
msgid "Resets the background color for the given column to default."
msgstr ""
-#: doc/classes/TreeItem.xml:53
+#: doc/classes/TreeItem.xml:54
msgid "Resets the color for the given column to default."
msgstr ""
-#: doc/classes/TreeItem.xml:62
+#: doc/classes/TreeItem.xml:63
msgid "Deselects the given column."
msgstr ""
-#: doc/classes/TreeItem.xml:73
+#: doc/classes/TreeItem.xml:74
msgid ""
"Removes the button at index [code]button_idx[/code] in column [code]column[/"
"code]."
msgstr ""
-#: doc/classes/TreeItem.xml:84
+#: doc/classes/TreeItem.xml:85
msgid ""
"Returns the [Texture2D] of the button at index [code]button_idx[/code] in "
"column [code]column[/code]."
msgstr ""
-#: doc/classes/TreeItem.xml:93
+#: doc/classes/TreeItem.xml:94
msgid ""
"Returns the number of buttons in column [code]column[/code]. May be used to "
"get the most recently added button's index, if no index was specified."
msgstr ""
-#: doc/classes/TreeItem.xml:104
+#: doc/classes/TreeItem.xml:105
msgid ""
"Returns the tooltip string for the button at index [code]button_idx[/code] "
"in column [code]column[/code]."
msgstr ""
-#: doc/classes/TreeItem.xml:113
+#: doc/classes/TreeItem.xml:114
msgid "Returns the column's cell mode."
msgstr ""
-#: doc/classes/TreeItem.xml:120
+#: doc/classes/TreeItem.xml:121
msgid "Returns the TreeItem's child items."
msgstr ""
-#: doc/classes/TreeItem.xml:129
+#: doc/classes/TreeItem.xml:130
msgid "Returns the custom background color of column [code]column[/code]."
msgstr ""
-#: doc/classes/TreeItem.xml:138
+#: doc/classes/TreeItem.xml:139
msgid "Returns the custom color of column [code]column[/code]."
msgstr ""
-#: doc/classes/TreeItem.xml:147
+#: doc/classes/TreeItem.xml:148
msgid "Returns [code]true[/code] if [code]expand_right[/code] is set."
msgstr ""
-#: doc/classes/TreeItem.xml:156
+#: doc/classes/TreeItem.xml:157
msgid "Returns the given column's icon [Texture2D]. Error if no icon is set."
msgstr ""
-#: doc/classes/TreeItem.xml:165
+#: doc/classes/TreeItem.xml:166
msgid "Returns the column's icon's maximum width."
msgstr ""
-#: doc/classes/TreeItem.xml:174
+#: doc/classes/TreeItem.xml:175
msgid "Returns the [Color] modulating the column's icon."
msgstr ""
-#: doc/classes/TreeItem.xml:183
+#: doc/classes/TreeItem.xml:184
msgid "Returns the icon [Texture2D] region as [Rect2]."
msgstr ""
-#: doc/classes/TreeItem.xml:198
+#: doc/classes/TreeItem.xml:199
msgid "Returns the next TreeItem in the tree."
msgstr ""
-#: doc/classes/TreeItem.xml:207
+#: doc/classes/TreeItem.xml:208
msgid ""
"Returns the next visible TreeItem in the tree.\n"
"If [code]wrap[/code] is enabled, the method will wrap around to the first "
@@ -51365,15 +51643,15 @@ msgid ""
"otherwise it returns [code]null[/code]."
msgstr ""
-#: doc/classes/TreeItem.xml:215
+#: doc/classes/TreeItem.xml:216
msgid "Returns the parent TreeItem."
msgstr ""
-#: doc/classes/TreeItem.xml:222
+#: doc/classes/TreeItem.xml:223
msgid "Returns the previous TreeItem in the tree."
msgstr ""
-#: doc/classes/TreeItem.xml:231
+#: doc/classes/TreeItem.xml:232
msgid ""
"Returns the previous visible TreeItem in the tree.\n"
"If [code]wrap[/code] is enabled, the method will wrap around to the last "
@@ -51381,89 +51659,92 @@ msgid ""
"otherwise it returns [code]null[/code]."
msgstr ""
-#: doc/classes/TreeItem.xml:257
+#: doc/classes/TreeItem.xml:258
msgid "Returns the given column's text."
msgstr ""
-#: doc/classes/TreeItem.xml:266
+#: doc/classes/TreeItem.xml:267
msgid "Returns the given column's text alignment."
msgstr ""
-#: doc/classes/TreeItem.xml:275
+#: doc/classes/TreeItem.xml:276
msgid "Returns the given column's tooltip."
msgstr ""
-#: doc/classes/TreeItem.xml:286
+#: doc/classes/TreeItem.xml:287
msgid ""
"Returns [code]true[/code] if the button at index [code]button_idx[/code] for "
"the given column is disabled."
msgstr ""
-#: doc/classes/TreeItem.xml:295
+#: doc/classes/TreeItem.xml:296
msgid "Returns [code]true[/code] if the given column is checked."
msgstr ""
-#: doc/classes/TreeItem.xml:312
+#: doc/classes/TreeItem.xml:313
msgid "Returns [code]true[/code] if column [code]column[/code] is editable."
msgstr ""
-#: doc/classes/TreeItem.xml:321
+#: doc/classes/TreeItem.xml:322
msgid "Returns [code]true[/code] if column [code]column[/code] is selectable."
msgstr ""
-#: doc/classes/TreeItem.xml:330
+#: doc/classes/TreeItem.xml:331
msgid "Returns [code]true[/code] if column [code]column[/code] is selected."
msgstr ""
-#: doc/classes/TreeItem.xml:337
+#: doc/classes/TreeItem.xml:338
msgid "Moves this TreeItem to the bottom in the [Tree] hierarchy."
msgstr ""
-#: doc/classes/TreeItem.xml:344
+#: doc/classes/TreeItem.xml:345
msgid "Moves this TreeItem to the top in the [Tree] hierarchy."
msgstr ""
-#: doc/classes/TreeItem.xml:353
-msgid "Removes the given child TreeItem."
+#: doc/classes/TreeItem.xml:354
+msgid ""
+"Removes the given child [TreeItem] and all its children from the [Tree]. "
+"Note that it doesn't free the item from memory, so it can be reused later. "
+"To completely remove a [TreeItem] use [method Object.free]."
msgstr ""
-#: doc/classes/TreeItem.xml:362
+#: doc/classes/TreeItem.xml:363
msgid "Selects the column [code]column[/code]."
msgstr ""
-#: doc/classes/TreeItem.xml:375
+#: doc/classes/TreeItem.xml:376
msgid ""
"Sets the given column's button [Texture2D] at index [code]button_idx[/code] "
"to [code]button[/code]."
msgstr ""
-#: doc/classes/TreeItem.xml:388
+#: doc/classes/TreeItem.xml:389
msgid ""
"If [code]true[/code], disables the button at index [code]button_idx[/code] "
"in column [code]column[/code]."
msgstr ""
-#: doc/classes/TreeItem.xml:399
+#: doc/classes/TreeItem.xml:400
msgid ""
"Sets the given column's cell mode to [code]mode[/code]. See [enum "
"TreeCellMode] constants."
msgstr ""
-#: doc/classes/TreeItem.xml:410
+#: doc/classes/TreeItem.xml:411
msgid "If [code]true[/code], the column [code]column[/code] is checked."
msgstr ""
-#: doc/classes/TreeItem.xml:433
+#: doc/classes/TreeItem.xml:434
msgid ""
"Sets the given column's custom background color and whether to just use it "
"as an outline."
msgstr ""
-#: doc/classes/TreeItem.xml:444
+#: doc/classes/TreeItem.xml:445
msgid "Sets the given column's custom color."
msgstr ""
-#: doc/classes/TreeItem.xml:457
+#: doc/classes/TreeItem.xml:458
msgid ""
"Sets the given column's custom draw callback to [code]callback[/code] method "
"on [code]object[/code].\n"
@@ -51471,82 +51752,82 @@ msgid ""
"is drawn and its position and size as a [Rect2]."
msgstr ""
-#: doc/classes/TreeItem.xml:469
+#: doc/classes/TreeItem.xml:470
msgid "If [code]true[/code], column [code]column[/code] is editable."
msgstr ""
-#: doc/classes/TreeItem.xml:480
+#: doc/classes/TreeItem.xml:481
msgid ""
"If [code]true[/code], column [code]column[/code] is expanded to the right."
msgstr ""
-#: doc/classes/TreeItem.xml:491
+#: doc/classes/TreeItem.xml:492
msgid "Sets the given column's icon [Texture2D]."
msgstr ""
-#: doc/classes/TreeItem.xml:502
+#: doc/classes/TreeItem.xml:503
msgid "Sets the given column's icon's maximum width."
msgstr ""
-#: doc/classes/TreeItem.xml:513
+#: doc/classes/TreeItem.xml:514
msgid "Modulates the given column's icon with [code]modulate[/code]."
msgstr ""
-#: doc/classes/TreeItem.xml:524
+#: doc/classes/TreeItem.xml:525
msgid "Sets the given column's icon's texture region."
msgstr ""
-#: doc/classes/TreeItem.xml:571
+#: doc/classes/TreeItem.xml:572
msgid "If [code]true[/code], the given column is selectable."
msgstr ""
-#: doc/classes/TreeItem.xml:592
+#: doc/classes/TreeItem.xml:593
msgid ""
"Sets the given column's text alignment. See [enum TextAlign] for possible "
"values."
msgstr ""
-#: doc/classes/TreeItem.xml:603
+#: doc/classes/TreeItem.xml:604
msgid "Sets the given column's tooltip text."
msgstr ""
-#: doc/classes/TreeItem.xml:609
+#: doc/classes/TreeItem.xml:610
msgid "If [code]true[/code], the TreeItem is collapsed."
msgstr ""
-#: doc/classes/TreeItem.xml:612
+#: doc/classes/TreeItem.xml:613
msgid "The custom minimum height."
msgstr ""
-#: doc/classes/TreeItem.xml:615
+#: doc/classes/TreeItem.xml:616
msgid "If [code]true[/code], folding is disabled for this TreeItem."
msgstr ""
-#: doc/classes/TreeItem.xml:620
+#: doc/classes/TreeItem.xml:621
msgid "Cell contains a string."
msgstr ""
-#: doc/classes/TreeItem.xml:623
+#: doc/classes/TreeItem.xml:624
msgid "Cell can be checked."
msgstr ""
-#: doc/classes/TreeItem.xml:626
+#: doc/classes/TreeItem.xml:627
msgid "Cell contains a range."
msgstr ""
-#: doc/classes/TreeItem.xml:629
+#: doc/classes/TreeItem.xml:630
msgid "Cell contains an icon."
msgstr ""
-#: doc/classes/TreeItem.xml:634
+#: doc/classes/TreeItem.xml:635
msgid "Align text to the left. See [code]set_text_align()[/code]."
msgstr ""
-#: doc/classes/TreeItem.xml:637
+#: doc/classes/TreeItem.xml:638
msgid "Center text. See [code]set_text_align()[/code]."
msgstr ""
-#: doc/classes/TreeItem.xml:640
+#: doc/classes/TreeItem.xml:641
msgid "Align text to the right. See [code]set_text_align()[/code]."
msgstr ""
@@ -51572,8 +51853,8 @@ msgid ""
"know the final values in advance. For example, interpolating a dynamically-"
"chosen camera zoom value is best done with a [Tween] node; it would be "
"difficult to do the same thing with an [AnimationPlayer] node.\n"
-"Here is a brief usage example that causes a 2D node to move smoothly between "
-"two positions:\n"
+"Here is a brief usage example that makes a 2D node move smoothly between two "
+"positions:\n"
"[codeblock]\n"
"var tween = get_node(\"Tween\")\n"
"tween.interpolate_property($Node2D, \"position\",\n"
@@ -51588,15 +51869,18 @@ msgid ""
"where it would only apply to that particular component.\n"
"Many of the methods accept [code]trans_type[/code] and [code]ease_type[/"
"code]. The first accepts an [enum TransitionType] constant, and refers to "
-"the way the timing of the animation is handled (see [code]http://easings.net/"
-"[/code] for some examples). The second accepts an [enum EaseType] constant, "
-"and controls the where [code]trans_type[/code] is applied to the "
-"interpolation (in the beginning, the end, or both). If you don't know which "
-"transition and easing to pick, you can try different [enum TransitionType] "
-"constants with [constant EASE_IN_OUT], and use the one that looks best."
+"the way the timing of the animation is handled (see [url=https://easings."
+"net/]easings.net[/url] for some examples). The second accepts an [enum "
+"EaseType] constant, and controls the where [code]trans_type[/code] is "
+"applied to the interpolation (in the beginning, the end, or both). If you "
+"don't know which transition and easing to pick, you can try different [enum "
+"TransitionType] constants with [constant EASE_IN_OUT], and use the one that "
+"looks best.\n"
+"[b][url=https://raw.githubusercontent.com/godotengine/godot-docs/master/img/"
+"tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url][/b]"
msgstr ""
-#: doc/classes/Tween.xml:45
+#: doc/classes/Tween.xml:46
msgid ""
"Follows [code]method[/code] of [code]object[/code] and applies the returned "
"value on [code]target_method[/code] of [code]target[/code], beginning from "
@@ -51608,7 +51892,7 @@ msgid ""
"information."
msgstr ""
-#: doc/classes/Tween.xml:71
+#: doc/classes/Tween.xml:72
msgid ""
"Follows [code]property[/code] of [code]object[/code] and applies it on "
"[code]target_property[/code] of [code]target[/code], beginning from "
@@ -51620,21 +51904,21 @@ msgid ""
"information."
msgstr ""
-#: doc/classes/Tween.xml:79
+#: doc/classes/Tween.xml:80
msgid ""
"Returns the total time needed for all tweens to end. If you have two tweens, "
"one lasting 10 seconds and the other 20 seconds, it would return 20 seconds, "
"as by that time all tweens would have finished."
msgstr ""
-#: doc/classes/Tween.xml:102
+#: doc/classes/Tween.xml:103
msgid ""
"Calls [code]callback[/code] of [code]object[/code] after [code]duration[/"
"code]. [code]arg1[/code]-[code]arg5[/code] are arguments to be passed to the "
"callback."
msgstr ""
-#: doc/classes/Tween.xml:125
+#: doc/classes/Tween.xml:126
msgid ""
"Calls [code]callback[/code] of [code]object[/code] after [code]duration[/"
"code] on the main thread (similar to [method Object.call_deferred]). "
@@ -51642,7 +51926,7 @@ msgid ""
"callback."
msgstr ""
-#: doc/classes/Tween.xml:148
+#: doc/classes/Tween.xml:149
msgid ""
"Animates [code]method[/code] of [code]object[/code] from [code]initial_val[/"
"code] to [code]final_val[/code] for [code]duration[/code] seconds, "
@@ -51654,7 +51938,7 @@ msgid ""
"information."
msgstr ""
-#: doc/classes/Tween.xml:172
+#: doc/classes/Tween.xml:173
msgid ""
"Animates [code]property[/code] of [code]object[/code] from "
"[code]initial_val[/code] to [code]final_val[/code] for [code]duration[/code] "
@@ -51666,72 +51950,72 @@ msgid ""
"information."
msgstr ""
-#: doc/classes/Tween.xml:180
+#: doc/classes/Tween.xml:181
msgid ""
"Returns [code]true[/code] if any tweens are currently running.\n"
"[b]Note:[/b] This method doesn't consider tweens that have ended."
msgstr ""
-#: doc/classes/Tween.xml:192
+#: doc/classes/Tween.xml:193
msgid ""
"Stops animation and removes a tween, given its object and property/method "
"pair. By default, all tweens are removed, unless [code]key[/code] is "
"specified."
msgstr ""
-#: doc/classes/Tween.xml:199
+#: doc/classes/Tween.xml:200
msgid "Stops animation and removes all tweens."
msgstr ""
-#: doc/classes/Tween.xml:210
+#: doc/classes/Tween.xml:211
msgid ""
"Resets a tween to its initial value (the one given, not the one before the "
"tween), given its object and property/method pair. By default, all tweens "
"are removed, unless [code]key[/code] is specified."
msgstr ""
-#: doc/classes/Tween.xml:217
+#: doc/classes/Tween.xml:218
msgid ""
"Resets all tweens to their initial values (the ones given, not those before "
"the tween)."
msgstr ""
-#: doc/classes/Tween.xml:228
+#: doc/classes/Tween.xml:229
msgid ""
"Continues animating a stopped tween, given its object and property/method "
"pair. By default, all tweens are resumed, unless [code]key[/code] is "
"specified."
msgstr ""
-#: doc/classes/Tween.xml:235
+#: doc/classes/Tween.xml:236
msgid "Continues animating all stopped tweens."
msgstr ""
-#: doc/classes/Tween.xml:244
+#: doc/classes/Tween.xml:245
msgid "Sets the interpolation to the given [code]time[/code] in seconds."
msgstr ""
-#: doc/classes/Tween.xml:253
+#: doc/classes/Tween.xml:254
msgid ""
"Activates/deactivates the tween. See also [method stop_all] and [method "
"resume_all]."
msgstr ""
-#: doc/classes/Tween.xml:260
+#: doc/classes/Tween.xml:261
msgid "Starts the tween. You can define animations both before and after this."
msgstr ""
-#: doc/classes/Tween.xml:271
+#: doc/classes/Tween.xml:272
msgid ""
"Stops a tween, given its object and property/method pair. By default, all "
"tweens are stopped, unless [code]key[/code] is specified."
msgstr ""
-#: doc/classes/Tween.xml:278
+#: doc/classes/Tween.xml:279
msgid "Stops animating all tweens."
msgstr ""
-#: doc/classes/Tween.xml:303
+#: doc/classes/Tween.xml:304
msgid ""
"Animates [code]method[/code] of [code]object[/code] from the value returned "
"by [code]initial_method[/code] to [code]final_val[/code] for [code]duration[/"
@@ -51743,7 +52027,7 @@ msgid ""
"information."
msgstr ""
-#: doc/classes/Tween.xml:329
+#: doc/classes/Tween.xml:330
msgid ""
"Animates [code]property[/code] of [code]object[/code] from the current value "
"of the [code]initial_val[/code] property of [code]initial[/code] to "
@@ -51755,15 +52039,15 @@ msgid ""
"information."
msgstr ""
-#: doc/classes/Tween.xml:337
+#: doc/classes/Tween.xml:338
msgid "Returns the current time of the tween."
msgstr ""
-#: doc/classes/Tween.xml:343
+#: doc/classes/Tween.xml:344
msgid "The tween's animation process thread. See [enum TweenProcessMode]."
msgstr ""
-#: doc/classes/Tween.xml:346
+#: doc/classes/Tween.xml:347
msgid ""
"The tween's speed multiplier. For example, set it to [code]1.0[/code] for "
"normal speed, [code]2.0[/code] for two times normal speed, or [code]0.5[/"
@@ -51771,100 +52055,100 @@ msgid ""
"animation, but see also [method set_active] or [method stop_all] for this."
msgstr ""
-#: doc/classes/Tween.xml:349
+#: doc/classes/Tween.xml:350
msgid "If [code]true[/code], the tween loops."
msgstr ""
-#: doc/classes/Tween.xml:355
+#: doc/classes/Tween.xml:356
msgid "Emitted when all processes in a tween end."
msgstr ""
-#: doc/classes/Tween.xml:364
+#: doc/classes/Tween.xml:365
msgid "Emitted when a tween ends."
msgstr ""
-#: doc/classes/Tween.xml:373
+#: doc/classes/Tween.xml:374
msgid "Emitted when a tween starts."
msgstr ""
-#: doc/classes/Tween.xml:386
+#: doc/classes/Tween.xml:387
msgid "Emitted at each step of the animation."
msgstr ""
-#: doc/classes/Tween.xml:392
+#: doc/classes/Tween.xml:393
msgid "The tween updates with the [code]_physics_process[/code] callback."
msgstr ""
-#: doc/classes/Tween.xml:395
+#: doc/classes/Tween.xml:396
msgid "The tween updates with the [code]_process[/code] callback."
msgstr ""
-#: doc/classes/Tween.xml:398
+#: doc/classes/Tween.xml:399
msgid "The animation is interpolated linearly."
msgstr ""
-#: doc/classes/Tween.xml:401
+#: doc/classes/Tween.xml:402
msgid "The animation is interpolated using a sine function."
msgstr ""
-#: doc/classes/Tween.xml:404
+#: doc/classes/Tween.xml:405
msgid ""
"The animation is interpolated with a quintic (to the power of 5) function."
msgstr ""
-#: doc/classes/Tween.xml:407
+#: doc/classes/Tween.xml:408
msgid ""
"The animation is interpolated with a quartic (to the power of 4) function."
msgstr ""
-#: doc/classes/Tween.xml:410
+#: doc/classes/Tween.xml:411
msgid ""
"The animation is interpolated with a quadratic (to the power of 2) function."
msgstr ""
-#: doc/classes/Tween.xml:413
+#: doc/classes/Tween.xml:414
msgid ""
"The animation is interpolated with an exponential (to the power of x) "
"function."
msgstr ""
-#: doc/classes/Tween.xml:416
+#: doc/classes/Tween.xml:417
msgid ""
"The animation is interpolated with elasticity, wiggling around the edges."
msgstr ""
-#: doc/classes/Tween.xml:419
+#: doc/classes/Tween.xml:420
msgid ""
"The animation is interpolated with a cubic (to the power of 3) function."
msgstr ""
-#: doc/classes/Tween.xml:422
+#: doc/classes/Tween.xml:423
msgid "The animation is interpolated with a function using square roots."
msgstr ""
-#: doc/classes/Tween.xml:425
+#: doc/classes/Tween.xml:426
msgid "The animation is interpolated by bouncing at the end."
msgstr ""
-#: doc/classes/Tween.xml:428
+#: doc/classes/Tween.xml:429
msgid "The animation is interpolated backing out at ends."
msgstr ""
-#: doc/classes/Tween.xml:431
+#: doc/classes/Tween.xml:432
msgid "The interpolation starts slowly and speeds up towards the end."
msgstr ""
-#: doc/classes/Tween.xml:434
+#: doc/classes/Tween.xml:435
msgid "The interpolation starts quickly and slows down towards the end."
msgstr ""
-#: doc/classes/Tween.xml:437
+#: doc/classes/Tween.xml:438
msgid ""
"A combination of [constant EASE_IN] and [constant EASE_OUT]. The "
"interpolation is slowest at both ends."
msgstr ""
-#: doc/classes/Tween.xml:440
+#: doc/classes/Tween.xml:441
msgid ""
"A combination of [constant EASE_IN] and [constant EASE_OUT]. The "
"interpolation is fastest at both ends."
@@ -53468,69 +53752,90 @@ msgstr ""
msgid "If [code]true[/code], the viewport will process 3D audio streams."
msgstr ""
-#: doc/classes/Viewport.xml:199
+#: doc/classes/Viewport.xml:195
+msgid ""
+"Sets the default filter mode used by [CanvasItem]s in this Viewport. See "
+"[enum DefaultCanvasItemTextureFilter] for options."
+msgstr ""
+
+#: doc/classes/Viewport.xml:198
+msgid ""
+"Sets the default repeat mode used by [CanvasItem]s in this Viewport. See "
+"[enum DefaultCanvasItemTextureRepeat] for options."
+msgstr ""
+
+#: doc/classes/Viewport.xml:201
msgid ""
"The canvas transform of the viewport, useful for changing the on-screen "
"positions of all child [CanvasItem]s. This is relative to the global canvas "
"transform of the viewport."
msgstr ""
-#: doc/classes/Viewport.xml:202
+#: doc/classes/Viewport.xml:204
msgid "The overlay mode for test rendered geometry in debug purposes."
msgstr ""
-#: doc/classes/Viewport.xml:205
+#: doc/classes/Viewport.xml:207
msgid ""
"The global canvas transform of the viewport. The canvas transform is "
"relative to this."
msgstr ""
-#: doc/classes/Viewport.xml:208
+#: doc/classes/Viewport.xml:210
msgid "If [code]true[/code], the viewport will not receive input event."
msgstr ""
-#: doc/classes/Viewport.xml:213
+#: doc/classes/Viewport.xml:215
msgid ""
"If [code]true[/code], the GUI controls on the viewport will lay pixel "
"perfectly."
msgstr ""
-#: doc/classes/Viewport.xml:218
+#: doc/classes/Viewport.xml:220
msgid ""
"The multisample anti-aliasing mode. A higher number results in smoother "
"edges at the cost of significantly worse performance. A value of 4 is best "
"unless targeting very high-end systems."
msgstr ""
-#: doc/classes/Viewport.xml:221
+#: doc/classes/Viewport.xml:223
msgid ""
"If [code]true[/code], the viewport will use [World3D] defined in "
"[code]world[/code] property."
msgstr ""
-#: doc/classes/Viewport.xml:224
+#: doc/classes/Viewport.xml:226
msgid ""
"If [code]true[/code], the objects rendered by viewport become subjects of "
"mouse picking process."
msgstr ""
-#: doc/classes/Viewport.xml:227
+#: doc/classes/Viewport.xml:229
+msgid ""
+"Sets the screen-space antialiasing method used. Screen-space antialiasing "
+"works by selectively blurring edges in a post-process shader. It differs "
+"from MSAA which takes multiple coverage samples while rendering objects. "
+"Screen-space AA methods are typically faster than MSAA and will smooth out "
+"specular aliasing, but tend to make scenes appear blurry."
+msgstr ""
+
+#: doc/classes/Viewport.xml:232
msgid "The subdivision amount of the first quadrant on the shadow atlas."
msgstr ""
-#: doc/classes/Viewport.xml:230
+#: doc/classes/Viewport.xml:235
msgid "The subdivision amount of the second quadrant on the shadow atlas."
msgstr ""
-#: doc/classes/Viewport.xml:233
+#: doc/classes/Viewport.xml:238
msgid "The subdivision amount of the third quadrant on the shadow atlas."
msgstr ""
-#: doc/classes/Viewport.xml:236
+#: doc/classes/Viewport.xml:241
msgid "The subdivision amount of the fourth quadrant on the shadow atlas."
msgstr ""
-#: doc/classes/Viewport.xml:239
+#: doc/classes/Viewport.xml:244
msgid ""
"The shadow atlas' resolution (used for omni and spot lights). The value will "
"be rounded up to the nearest power of 2.\n"
@@ -53539,136 +53844,177 @@ msgid ""
"manually."
msgstr ""
-#: doc/classes/Viewport.xml:243
+#: doc/classes/Viewport.xml:248
msgid ""
"If [code]true[/code], the viewport should render its background as "
"transparent."
msgstr ""
-#: doc/classes/Viewport.xml:246
+#: doc/classes/Viewport.xml:251
msgid "The custom [World3D] which can be used as 3D environment source."
msgstr ""
-#: doc/classes/Viewport.xml:249
+#: doc/classes/Viewport.xml:254
msgid "The custom [World2D] which can be used as 2D environment source."
msgstr ""
-#: doc/classes/Viewport.xml:257
+#: doc/classes/Viewport.xml:262
msgid "Emitted when a Control node grabs keyboard focus."
msgstr ""
-#: doc/classes/Viewport.xml:262
+#: doc/classes/Viewport.xml:267
msgid ""
"Emitted when the size of the viewport is changed, whether by resizing of "
"window, or some other means."
msgstr ""
-#: doc/classes/Viewport.xml:268
+#: doc/classes/Viewport.xml:273
msgid "This quadrant will not be used."
msgstr ""
-#: doc/classes/Viewport.xml:271
+#: doc/classes/Viewport.xml:276
msgid "This quadrant will only be used by one shadow map."
msgstr ""
-#: doc/classes/Viewport.xml:274
+#: doc/classes/Viewport.xml:279
msgid "This quadrant will be split in 4 and used by up to 4 shadow maps."
msgstr ""
-#: doc/classes/Viewport.xml:277
+#: doc/classes/Viewport.xml:282
msgid "This quadrant will be split 16 ways and used by up to 16 shadow maps."
msgstr ""
-#: doc/classes/Viewport.xml:280
+#: doc/classes/Viewport.xml:285
msgid "This quadrant will be split 64 ways and used by up to 64 shadow maps."
msgstr ""
-#: doc/classes/Viewport.xml:283
+#: doc/classes/Viewport.xml:288
msgid ""
"This quadrant will be split 256 ways and used by up to 256 shadow maps. "
"Unless the [member shadow_atlas_size] is very high, the shadows in this "
"quadrant will be very low resolution."
msgstr ""
-#: doc/classes/Viewport.xml:286
+#: doc/classes/Viewport.xml:291
msgid ""
"This quadrant will be split 1024 ways and used by up to 1024 shadow maps. "
"Unless the [member shadow_atlas_size] is very high, the shadows in this "
"quadrant will be very low resolution."
msgstr ""
-#: doc/classes/Viewport.xml:289
+#: doc/classes/Viewport.xml:294
msgid "Represents the size of the [enum ShadowAtlasQuadrantSubdiv] enum."
msgstr ""
-#: doc/classes/Viewport.xml:292
-msgid "Amount of objects in frame."
+#: doc/classes/Viewport.xml:297
+msgid ""
+"Multisample antialiasing mode disabled. This is the default value, and also "
+"the fastest setting."
msgstr ""
-#: doc/classes/Viewport.xml:295
-msgid "Amount of vertices in frame."
+#: doc/classes/Viewport.xml:300
+msgid "Use 2x Multisample Antialiasing."
msgstr ""
-#: doc/classes/Viewport.xml:298
-msgid "Amount of material changes in frame."
+#: doc/classes/Viewport.xml:303
+msgid "Use 4x Multisample Antialiasing."
msgstr ""
-#: doc/classes/Viewport.xml:301
-msgid "Amount of shader changes in frame."
+#: doc/classes/Viewport.xml:306
+msgid ""
+"Use 8x Multisample Antialiasing. Likely unsupported on low-end and older "
+"hardware."
msgstr ""
-#: doc/classes/Viewport.xml:304
-msgid "Amount of surface changes in frame."
+#: doc/classes/Viewport.xml:309
+msgid ""
+"Use 16x Multisample Antialiasing. Likely unsupported on medium and low-end "
+"hardware."
msgstr ""
-#: doc/classes/Viewport.xml:307
-msgid "Amount of draw calls in frame."
+#: doc/classes/Viewport.xml:312
+msgid "Represents the size of the [enum MSAA] enum."
msgstr ""
-#: doc/classes/Viewport.xml:310
-msgid "Represents the size of the [enum RenderInfo] enum."
+#: doc/classes/Viewport.xml:315
+msgid "Do not perform any antialiasing in the full screen post-process."
msgstr ""
-#: doc/classes/Viewport.xml:313
-msgid "Objects are displayed normally."
+#: doc/classes/Viewport.xml:318
+msgid ""
+"Use fast approximate antialiasing. FXAA is a popular screen-space "
+"antialising method, which is fast but will make the image look blurry, "
+"especially at lower resolutions. It can still work relatively well at large "
+"resolutions such as 1440p and 4K."
msgstr ""
-#: doc/classes/Viewport.xml:316
-msgid "Objects are displayed without light information."
+#: doc/classes/Viewport.xml:321
+msgid "Represents the size of the [enum ScreenSpaceAA] enum."
msgstr ""
-#: doc/classes/Viewport.xml:319
-msgid ""
-"Objected are displayed semi-transparent with additive blending so you can "
-"see where they intersect."
+#: doc/classes/Viewport.xml:324
+msgid "Amount of objects in frame."
msgstr ""
-#: doc/classes/Viewport.xml:322
-msgid "Objects are displayed in wireframe style."
+#: doc/classes/Viewport.xml:327
+msgid "Amount of vertices in frame."
+msgstr ""
+
+#: doc/classes/Viewport.xml:330
+msgid "Amount of material changes in frame."
+msgstr ""
+
+#: doc/classes/Viewport.xml:333
+msgid "Amount of shader changes in frame."
+msgstr ""
+
+#: doc/classes/Viewport.xml:336
+msgid "Amount of surface changes in frame."
msgstr ""
#: doc/classes/Viewport.xml:339
-msgid "Multisample anti-aliasing mode disabled. This is the default value."
+msgid "Amount of draw calls in frame."
msgstr ""
#: doc/classes/Viewport.xml:342
-msgid "Use 2x Multisample Antialiasing."
+msgid "Represents the size of the [enum RenderInfo] enum."
msgstr ""
#: doc/classes/Viewport.xml:345
-msgid "Use 4x Multisample Antialiasing."
+msgid "Objects are displayed normally."
msgstr ""
-#: doc/classes/Viewport.xml:348
+#: doc/classes/Viewport.xml:356
+msgid "Objects are displayed in wireframe style."
+msgstr ""
+
+#: doc/classes/Viewport.xml:378
msgid ""
-"Use 8x Multisample Antialiasing. Likely unsupported on low-end and older "
-"hardware."
+"Draws the screen-space ambient occlusion texture instead of the scene so "
+"that you can clearly see how it is affecting objects. In order for this "
+"display mode to work, you must have [member Environment.ssao_enabled] set in "
+"your [WorldEnvironment]."
msgstr ""
-#: doc/classes/Viewport.xml:351
+#: doc/classes/Viewport.xml:384
msgid ""
-"Use 16x Multisample Antialiasing. Likely unsupported on medium and low-end "
-"hardware."
+"Colors each PSSM split for the [DirectionalLight3D]s in the scene a "
+"different color so you can see where the splits are. In order, they will be "
+"colored red, green, blue, and yellow."
+msgstr ""
+
+#: doc/classes/Viewport.xml:387
+msgid ""
+"Draws the decal atlas used by [Decal]s and light projector textures in the "
+"upper left quadrant of the [Viewport]."
+msgstr ""
+
+#: doc/classes/Viewport.xml:402
+msgid "Max value for [enum DefaultCanvasItemTextureFilter] enum."
+msgstr ""
+
+#: doc/classes/Viewport.xml:414
+msgid "Max value for [enum DefaultCanvasItemTextureRepeat] enum."
msgstr ""
#: doc/classes/ViewportTexture.xml:4
@@ -53690,7 +54036,7 @@ msgid ""
msgstr ""
#: doc/classes/VisibilityEnabler2D.xml:4 doc/classes/VisibilityEnabler3D.xml:4
-msgid "Enables certain nodes only when visible."
+msgid "Enables certain nodes only when approximately visible."
msgstr ""
#: doc/classes/VisibilityEnabler2D.xml:7
@@ -53698,78 +54044,82 @@ msgid ""
"The VisibilityEnabler2D will disable [RigidBody2D], [AnimationPlayer], and "
"other nodes when they are not visible. It will only affect nodes with the "
"same root node as the VisibilityEnabler2D, and the root node itself.\n"
-"Note that VisibilityEnabler2D will not affect nodes added after scene "
+"[b]Note:[/b] For performance reasons, VisibilityEnabler2D uses an "
+"approximate heuristic with precision determined by [member ProjectSettings."
+"world/2d/cell_size]. If you need exact visibility checking, use another "
+"method such as adding an [Area2D] node as a child of a [Camera2D] node.\n"
+"[b]Note:[/b] VisibilityEnabler2D will not affect nodes added after scene "
"initialization."
msgstr ""
-#: doc/classes/VisibilityEnabler2D.xml:19
-#: doc/classes/VisibilityEnabler3D.xml:19
+#: doc/classes/VisibilityEnabler2D.xml:20
+#: doc/classes/VisibilityEnabler3D.xml:20
msgid ""
"Returns whether the enabler identified by given [enum Enabler] constant is "
"active."
msgstr ""
-#: doc/classes/VisibilityEnabler2D.xml:30
-#: doc/classes/VisibilityEnabler3D.xml:30
+#: doc/classes/VisibilityEnabler2D.xml:31
+#: doc/classes/VisibilityEnabler3D.xml:31
msgid ""
"Sets active state of the enabler identified by given [enum Enabler] constant."
msgstr ""
-#: doc/classes/VisibilityEnabler2D.xml:36
+#: doc/classes/VisibilityEnabler2D.xml:37
msgid "If [code]true[/code], [RigidBody2D] nodes will be paused."
msgstr ""
-#: doc/classes/VisibilityEnabler2D.xml:39
+#: doc/classes/VisibilityEnabler2D.xml:40
msgid "If [code]true[/code], [AnimatedSprite2D] nodes will be paused."
msgstr ""
-#: doc/classes/VisibilityEnabler2D.xml:42
-#: doc/classes/VisibilityEnabler3D.xml:39
+#: doc/classes/VisibilityEnabler2D.xml:43
+#: doc/classes/VisibilityEnabler3D.xml:40
msgid "If [code]true[/code], [AnimationPlayer] nodes will be paused."
msgstr ""
-#: doc/classes/VisibilityEnabler2D.xml:45
+#: doc/classes/VisibilityEnabler2D.xml:46
msgid "If [code]true[/code], [GPUParticles2D] nodes will be paused."
msgstr ""
-#: doc/classes/VisibilityEnabler2D.xml:48
+#: doc/classes/VisibilityEnabler2D.xml:49
msgid ""
"If [code]true[/code], the parent's [method Node._physics_process] will be "
"stopped."
msgstr ""
-#: doc/classes/VisibilityEnabler2D.xml:51
+#: doc/classes/VisibilityEnabler2D.xml:52
msgid ""
"If [code]true[/code], the parent's [method Node._process] will be stopped."
msgstr ""
-#: doc/classes/VisibilityEnabler2D.xml:56
-#: doc/classes/VisibilityEnabler3D.xml:44
+#: doc/classes/VisibilityEnabler2D.xml:57
+#: doc/classes/VisibilityEnabler3D.xml:45
msgid "This enabler will pause [AnimationPlayer] nodes."
msgstr ""
-#: doc/classes/VisibilityEnabler2D.xml:59
+#: doc/classes/VisibilityEnabler2D.xml:60
msgid "This enabler will freeze [RigidBody2D] nodes."
msgstr ""
-#: doc/classes/VisibilityEnabler2D.xml:62
+#: doc/classes/VisibilityEnabler2D.xml:63
msgid "This enabler will stop [GPUParticles2D] nodes."
msgstr ""
-#: doc/classes/VisibilityEnabler2D.xml:65
+#: doc/classes/VisibilityEnabler2D.xml:66
msgid "This enabler will stop the parent's _process function."
msgstr ""
-#: doc/classes/VisibilityEnabler2D.xml:68
+#: doc/classes/VisibilityEnabler2D.xml:69
msgid "This enabler will stop the parent's _physics_process function."
msgstr ""
-#: doc/classes/VisibilityEnabler2D.xml:71
+#: doc/classes/VisibilityEnabler2D.xml:72
msgid "This enabler will stop [AnimatedSprite2D] nodes animations."
msgstr ""
-#: doc/classes/VisibilityEnabler2D.xml:74
-#: doc/classes/VisibilityEnabler3D.xml:50
+#: doc/classes/VisibilityEnabler2D.xml:75
+#: doc/classes/VisibilityEnabler3D.xml:51
msgid "Represents the size of the [enum Enabler] enum."
msgstr ""
@@ -53778,31 +54128,39 @@ msgid ""
"The VisibilityEnabler3D will disable [RigidBody3D] and [AnimationPlayer] "
"nodes when they are not visible. It will only affect other nodes within the "
"same scene as the VisibilityEnabler3D itself.\n"
-"Note that VisibilityEnabler3D will not affect nodes added after scene "
+"[b]Note:[/b] VisibilityEnabler3D uses an approximate heuristic for "
+"performance reasons. It doesn't take walls and other occlusion into account. "
+"If you need exact visibility checking, use another method such as adding an "
+"[Area3D] node as a child of a [Camera3D] node.\n"
+"[b]Note:[/b] VisibilityEnabler3D will not affect nodes added after scene "
"initialization."
msgstr ""
-#: doc/classes/VisibilityEnabler3D.xml:36
+#: doc/classes/VisibilityEnabler3D.xml:37
msgid "If [code]true[/code], [RigidBody3D] nodes will be paused."
msgstr ""
-#: doc/classes/VisibilityEnabler3D.xml:47
+#: doc/classes/VisibilityEnabler3D.xml:48
msgid "This enabler will freeze [RigidBody3D] nodes."
msgstr ""
#: doc/classes/VisibilityNotifier2D.xml:4
#: doc/classes/VisibilityNotifier3D.xml:4
-msgid "Detects when the node is visible on screen."
+msgid "Detects approximately when the node is visible on screen."
msgstr ""
#: doc/classes/VisibilityNotifier2D.xml:7
msgid ""
"The VisibilityNotifier2D detects when it is visible on the screen. It also "
"notifies when its bounding rectangle enters or exits the screen or a "
-"viewport."
+"viewport.\n"
+"[b]Note:[/b] For performance reasons, VisibilityNotifier2D uses an "
+"approximate heuristic with precision determined by [member ProjectSettings."
+"world/2d/cell_size]. If you need exact visibility checking, use another "
+"method such as adding an [Area2D] node as a child of a [Camera2D] node."
msgstr ""
-#: doc/classes/VisibilityNotifier2D.xml:16
+#: doc/classes/VisibilityNotifier2D.xml:17
msgid ""
"If [code]true[/code], the bounding rectangle is on the screen.\n"
"[b]Note:[/b] It takes one frame for the node's visibility to be assessed "
@@ -53811,23 +54169,23 @@ msgid ""
"pass."
msgstr ""
-#: doc/classes/VisibilityNotifier2D.xml:23
+#: doc/classes/VisibilityNotifier2D.xml:24
msgid "The VisibilityNotifier2D's bounding rectangle."
msgstr ""
-#: doc/classes/VisibilityNotifier2D.xml:29
+#: doc/classes/VisibilityNotifier2D.xml:30
msgid "Emitted when the VisibilityNotifier2D enters the screen."
msgstr ""
-#: doc/classes/VisibilityNotifier2D.xml:34
+#: doc/classes/VisibilityNotifier2D.xml:35
msgid "Emitted when the VisibilityNotifier2D exits the screen."
msgstr ""
-#: doc/classes/VisibilityNotifier2D.xml:41
+#: doc/classes/VisibilityNotifier2D.xml:42
msgid "Emitted when the VisibilityNotifier2D enters a [Viewport]'s view."
msgstr ""
-#: doc/classes/VisibilityNotifier2D.xml:48
+#: doc/classes/VisibilityNotifier2D.xml:49
msgid "Emitted when the VisibilityNotifier2D exits a [Viewport]'s view."
msgstr ""
@@ -53835,10 +54193,14 @@ msgstr ""
msgid ""
"The VisibilityNotifier3D detects when it is visible on the screen. It also "
"notifies when its bounding rectangle enters or exits the screen or a "
-"[Camera3D]'s view."
+"[Camera3D]'s view.\n"
+"[b]Note:[/b] VisibilityNotifier3D uses an approximate heuristic for "
+"performance reasons. It doesn't take walls and other occlusion into account. "
+"If you need exact visibility checking, use another method such as adding an "
+"[Area3D] node as a child of a [Camera3D] node."
msgstr ""
-#: doc/classes/VisibilityNotifier3D.xml:16
+#: doc/classes/VisibilityNotifier3D.xml:17
msgid ""
"If [code]true[/code], the bounding box is on the screen.\n"
"[b]Note:[/b] It takes one frame for the node's visibility to be assessed "
@@ -53847,23 +54209,23 @@ msgid ""
"pass."
msgstr ""
-#: doc/classes/VisibilityNotifier3D.xml:23
+#: doc/classes/VisibilityNotifier3D.xml:24
msgid "The VisibilityNotifier3D's bounding box."
msgstr ""
-#: doc/classes/VisibilityNotifier3D.xml:31
+#: doc/classes/VisibilityNotifier3D.xml:32
msgid "Emitted when the VisibilityNotifier3D enters a [Camera3D]'s view."
msgstr ""
-#: doc/classes/VisibilityNotifier3D.xml:38
+#: doc/classes/VisibilityNotifier3D.xml:39
msgid "Emitted when the VisibilityNotifier3D exits a [Camera3D]'s view."
msgstr ""
-#: doc/classes/VisibilityNotifier3D.xml:43
+#: doc/classes/VisibilityNotifier3D.xml:44
msgid "Emitted when the VisibilityNotifier3D enters the screen."
msgstr ""
-#: doc/classes/VisibilityNotifier3D.xml:48
+#: doc/classes/VisibilityNotifier3D.xml:49
msgid "Emitted when the VisibilityNotifier3D exits the screen."
msgstr ""
@@ -56455,7 +56817,7 @@ msgstr ""
msgid "The background of the area below the grabber."
msgstr ""
-#: doc/classes/VSlider.xml:33
+#: doc/classes/VSlider.xml:35
msgid ""
"The background for the whole slider. Determines the width of the "
"[code]grabber_area[/code]."
@@ -57437,6 +57799,667 @@ msgstr ""
msgid "Unknown node."
msgstr ""
+#: doc/classes/XRAnchor3D.xml:4
+msgid "An anchor point in AR space."
+msgstr ""
+
+#: doc/classes/XRAnchor3D.xml:7
+msgid ""
+"The [XRAnchor3D] point is a spatial node that maps a real world location "
+"identified by the AR platform to a position within the game world. For "
+"example, as long as plane detection in ARKit is on, ARKit will identify and "
+"update the position of planes (tables, floors, etc) and create anchors for "
+"them.\n"
+"This node is mapped to one of the anchors through its unique ID. When you "
+"receive a signal that a new anchor is available, you should add this node to "
+"your scene for that anchor. You can predefine nodes and set the ID; the "
+"nodes will simply remain on 0,0,0 until a plane is recognized.\n"
+"Keep in mind that, as long as plane detection is enabled, the size, placing "
+"and orientation of an anchor will be updated as the detection logic learns "
+"more about the real world out there especially if only part of the surface "
+"is in view."
+msgstr ""
+
+#: doc/classes/XRAnchor3D.xml:18
+msgid "Returns the name given to this anchor."
+msgstr ""
+
+#: doc/classes/XRAnchor3D.xml:25
+msgid ""
+"Returns [code]true[/code] if the anchor is being tracked and [code]false[/"
+"code] if no anchor with this ID is currently known."
+msgstr ""
+
+#: doc/classes/XRAnchor3D.xml:32
+msgid ""
+"If provided by the [XRInterface], this returns a mesh object for the anchor. "
+"For an anchor, this can be a shape related to the object being tracked or it "
+"can be a mesh that provides topology related to the anchor and can be used "
+"to create shadows/reflections on surfaces or for generating collision shapes."
+msgstr ""
+
+#: doc/classes/XRAnchor3D.xml:39
+msgid ""
+"Returns a plane aligned with our anchor; handy for intersection testing."
+msgstr ""
+
+#: doc/classes/XRAnchor3D.xml:46
+msgid ""
+"Returns the estimated size of the plane that was detected. Say when the "
+"anchor relates to a table in the real world, this is the estimated size of "
+"the surface of that table."
+msgstr ""
+
+#: doc/classes/XRAnchor3D.xml:52
+msgid ""
+"The anchor's ID. You can set this before the anchor itself exists. The first "
+"anchor gets an ID of [code]1[/code], the second an ID of [code]2[/code], "
+"etc. When anchors get removed, the engine can then assign the corresponding "
+"ID to new anchors. The most common situation where anchors \"disappear\" is "
+"when the AR server identifies that two anchors represent different parts of "
+"the same plane and merges them."
+msgstr ""
+
+#: doc/classes/XRAnchor3D.xml:60
+msgid ""
+"Emitted when the mesh associated with the anchor changes or when one becomes "
+"available. This is especially important for topology that is constantly "
+"being [code]mesh_updated[/code]."
+msgstr ""
+
+#: doc/classes/XRCamera3D.xml:4
+msgid ""
+"A camera node with a few overrules for AR/VR applied, such as location "
+"tracking."
+msgstr ""
+
+#: doc/classes/XRCamera3D.xml:7
+msgid ""
+"This is a helper spatial node for our camera; note that, if stereoscopic "
+"rendering is applicable (VR-HMD), most of the camera properties are ignored, "
+"as the HMD information overrides them. The only properties that can be "
+"trusted are the near and far planes.\n"
+"The position and orientation of this node is automatically updated by the XR "
+"Server to represent the location of the HMD if such tracking is available "
+"and can thus be used by game logic. Note that, in contrast to the XR "
+"Controller, the render thread has access to the most up-to-date tracking "
+"data of the HMD and the location of the XRCamera3D can lag a few "
+"milliseconds behind what is used for rendering as a result."
+msgstr ""
+
+#: doc/classes/XRCamera3D.xml:11 doc/classes/XRController3D.xml:12
+#: doc/classes/XRInterface.xml:11 doc/classes/XROrigin3D.xml:13
+#: doc/classes/XRPositionalTracker.xml:12 doc/classes/XRServer.xml:10
+msgid "https://docs.godotengine.org/en/latest/tutorials/vr/index.html"
+msgstr ""
+
+#: doc/classes/XRController3D.xml:4
+msgid "A spatial node representing a spatially-tracked controller."
+msgstr ""
+
+#: doc/classes/XRController3D.xml:7
+msgid ""
+"This is a helper spatial node that is linked to the tracking of controllers. "
+"It also offers several handy passthroughs to the state of buttons and such "
+"on the controllers.\n"
+"Controllers are linked by their ID. You can create controller nodes before "
+"the controllers are available. If your game always uses two controllers (one "
+"for each hand), you can predefine the controllers with ID 1 and 2; they will "
+"become active as soon as the controllers are identified. If you expect "
+"additional controllers to be used, you should react to the signals and add "
+"XRController3D nodes to your scene.\n"
+"The position of the controller node is automatically updated by the "
+"[XRServer]. This makes this node ideal to add child nodes to visualize the "
+"controller."
+msgstr ""
+
+#: doc/classes/XRController3D.xml:19
+msgid ""
+"If active, returns the name of the associated controller if provided by the "
+"AR/VR SDK used."
+msgstr ""
+
+#: doc/classes/XRController3D.xml:26
+msgid ""
+"Returns the hand holding this controller, if known. See [enum "
+"XRPositionalTracker.TrackerHand]."
+msgstr ""
+
+#: doc/classes/XRController3D.xml:33
+msgid ""
+"Returns [code]true[/code] if the bound controller is active. XR systems "
+"attempt to track active controllers."
+msgstr ""
+
+#: doc/classes/XRController3D.xml:42
+msgid ""
+"Returns the value of the given axis for things like triggers, touchpads, "
+"etc. that are embedded into the controller."
+msgstr ""
+
+#: doc/classes/XRController3D.xml:49
+msgid ""
+"Returns the ID of the joystick object bound to this. Every controller "
+"tracked by the [XRServer] that has buttons and axis will also be registered "
+"as a joystick within Godot. This means that all the normal joystick tracking "
+"and input mapping will work for buttons and axis found on the AR/VR "
+"controllers. This ID is purely offered as information so you can link up the "
+"controller with its joystick entry."
+msgstr ""
+
+#: doc/classes/XRController3D.xml:56
+msgid ""
+"If provided by the [XRInterface], this returns a mesh associated with the "
+"controller. This can be used to visualize the controller."
+msgstr ""
+
+#: doc/classes/XRController3D.xml:65
+msgid ""
+"Returns [code]true[/code] if the button at index [code]button[/code] is "
+"pressed. See [enum JoystickList], in particular the [code]JOY_VR_*[/code] "
+"constants."
+msgstr ""
+
+#: doc/classes/XRController3D.xml:71
+msgid ""
+"The controller's ID.\n"
+"A controller ID of 0 is unbound and will always result in an inactive node. "
+"Controller ID 1 is reserved for the first controller that identifies itself "
+"as the left-hand controller and ID 2 is reserved for the first controller "
+"that identifies itself as the right-hand controller.\n"
+"For any other controller that the [XRServer] detects, we continue with "
+"controller ID 3.\n"
+"When a controller is turned off, its slot is freed. This ensures controllers "
+"will keep the same ID even when controllers with lower IDs are turned off."
+msgstr ""
+
+#: doc/classes/XRController3D.xml:77
+msgid ""
+"The degree to which the controller vibrates. Ranges from [code]0.0[/code] to "
+"[code]1.0[/code] with precision [code].01[/code]. If changed, updates "
+"[member XRPositionalTracker.rumble] accordingly.\n"
+"This is a useful property to animate if you want the controller to vibrate "
+"for a limited duration."
+msgstr ""
+
+#: doc/classes/XRController3D.xml:86
+msgid "Emitted when a button on this controller is pressed."
+msgstr ""
+
+#: doc/classes/XRController3D.xml:93
+msgid "Emitted when a button on this controller is released."
+msgstr ""
+
+#: doc/classes/XRController3D.xml:100
+msgid ""
+"Emitted when the mesh associated with the controller changes or when one "
+"becomes available. Generally speaking this will be a static mesh after "
+"becoming available."
+msgstr ""
+
+#: doc/classes/XRInterface.xml:4
+msgid "Base class for an AR/VR interface implementation."
+msgstr ""
+
+#: doc/classes/XRInterface.xml:7
+msgid ""
+"This class needs to be implemented to make an AR or VR platform available to "
+"Godot and these should be implemented as C++ modules or GDNative modules "
+"(note that for GDNative the subclass XRScriptInterface should be used). Part "
+"of the interface is exposed to GDScript so you can detect, enable and "
+"configure an AR or VR platform.\n"
+"Interfaces should be written in such a way that simply enabling them will "
+"give us a working setup. You can query the available interfaces through "
+"[XRServer]."
+msgstr ""
+
+#: doc/classes/XRInterface.xml:18
+msgid ""
+"If this is an AR interface that requires displaying a camera feed as the "
+"background, this method returns the feed ID in the [CameraServer] for this "
+"interface."
+msgstr ""
+
+#: doc/classes/XRInterface.xml:25
+msgid ""
+"Returns a combination of [enum Capabilities] flags providing information "
+"about the capabilities of this interface."
+msgstr ""
+
+#: doc/classes/XRInterface.xml:32
+msgid "Returns the name of this interface (OpenVR, OpenHMD, ARKit, etc)."
+msgstr ""
+
+#: doc/classes/XRInterface.xml:39
+msgid ""
+"Returns the resolution at which we should render our intermediate results "
+"before things like lens distortion are applied by the VR platform."
+msgstr ""
+
+#: doc/classes/XRInterface.xml:46
+msgid ""
+"If supported, returns the status of our tracking. This will allow you to "
+"provide feedback to the user whether there are issues with positional "
+"tracking."
+msgstr ""
+
+#: doc/classes/XRInterface.xml:53
+msgid ""
+"Call this to initialize this interface. The first interface that is "
+"initialized is identified as the primary interface and it will be used for "
+"rendering output.\n"
+"After initializing the interface you want to use you then need to enable the "
+"AR/VR mode of a viewport and rendering should commence.\n"
+"[b]Note:[/b] You must enable the AR/VR mode on the main viewport for any "
+"device that uses the main output of Godot, such as for mobile VR.\n"
+"If you do this for a platform that handles its own output (such as OpenVR) "
+"Godot will show just one eye without distortion on screen. Alternatively, "
+"you can add a separate viewport node to your scene and enable AR/VR on that "
+"viewport. It will be used to output to the HMD, leaving you free to do "
+"anything you like in the main window, such as using a separate camera as a "
+"spectator camera or rendering something completely different.\n"
+"While currently not used, you can activate additional interfaces. You may "
+"wish to do this if you want to track controllers from other platforms. "
+"However, at this point in time only one interface can render to an HMD."
+msgstr ""
+
+#: doc/classes/XRInterface.xml:64
+msgid ""
+"Returns [code]true[/code] if the current output of this interface is in "
+"stereo."
+msgstr ""
+
+#: doc/classes/XRInterface.xml:71
+msgid "Turns the interface off."
+msgstr ""
+
+#: doc/classes/XRInterface.xml:77
+msgid "On an AR interface, [code]true[/code] if anchor detection is enabled."
+msgstr ""
+
+#: doc/classes/XRInterface.xml:80
+msgid "[code]true[/code] if this interface been initialized."
+msgstr ""
+
+#: doc/classes/XRInterface.xml:83
+msgid "[code]true[/code] if this is the primary interface."
+msgstr ""
+
+#: doc/classes/XRInterface.xml:88
+msgid "No XR capabilities."
+msgstr ""
+
+#: doc/classes/XRInterface.xml:91
+msgid ""
+"This interface can work with normal rendering output (non-HMD based AR)."
+msgstr ""
+
+#: doc/classes/XRInterface.xml:94
+msgid "This interface supports stereoscopic rendering."
+msgstr ""
+
+#: doc/classes/XRInterface.xml:97
+msgid "This interface supports AR (video background and real world tracking)."
+msgstr ""
+
+#: doc/classes/XRInterface.xml:100
+msgid ""
+"This interface outputs to an external device. If the main viewport is used, "
+"the on screen output is an unmodified buffer of either the left or right eye "
+"(stretched if the viewport size is not changed to the same aspect ratio of "
+"[method get_render_targetsize]). Using a separate viewport node frees up the "
+"main viewport for other purposes."
+msgstr ""
+
+#: doc/classes/XRInterface.xml:103
+msgid ""
+"Mono output, this is mostly used internally when retrieving positioning "
+"information for our camera node or when stereo scopic rendering is not "
+"supported."
+msgstr ""
+
+#: doc/classes/XRInterface.xml:106
+msgid ""
+"Left eye output, this is mostly used internally when rendering the image for "
+"the left eye and obtaining positioning and projection information."
+msgstr ""
+
+#: doc/classes/XRInterface.xml:109
+msgid ""
+"Right eye output, this is mostly used internally when rendering the image "
+"for the right eye and obtaining positioning and projection information."
+msgstr ""
+
+#: doc/classes/XRInterface.xml:112
+msgid "Tracking is behaving as expected."
+msgstr ""
+
+#: doc/classes/XRInterface.xml:115
+msgid ""
+"Tracking is hindered by excessive motion (the player is moving faster than "
+"tracking can keep up)."
+msgstr ""
+
+#: doc/classes/XRInterface.xml:118
+msgid ""
+"Tracking is hindered by insufficient features, it's too dark (for camera-"
+"based tracking), player is blocked, etc."
+msgstr ""
+
+#: doc/classes/XRInterface.xml:121
+msgid ""
+"We don't know the status of the tracking or this interface does not provide "
+"feedback."
+msgstr ""
+
+#: doc/classes/XRInterface.xml:124
+msgid ""
+"Tracking is not functional (camera not plugged in or obscured, lighthouses "
+"turned off, etc.)."
+msgstr ""
+
+#: modules/gdnative/doc_classes/XRInterfaceGDNative.xml:4
+msgid "GDNative wrapper for an XR interface."
+msgstr ""
+
+#: modules/gdnative/doc_classes/XRInterfaceGDNative.xml:7
+msgid ""
+"This is a wrapper class for GDNative implementations of the XR interface. To "
+"use a GDNative XR interface, simply instantiate this object and set your "
+"GDNative library containing the XR interface implementation."
+msgstr ""
+
+#: doc/classes/XROrigin3D.xml:4
+msgid "The origin point in AR/VR."
+msgstr ""
+
+#: doc/classes/XROrigin3D.xml:7
+msgid ""
+"This is a special node within the AR/VR system that maps the physical "
+"location of the center of our tracking space to the virtual location within "
+"our game world.\n"
+"There should be only one of these nodes in your scene and you must have one. "
+"All the XRCamera3D, XRController3D and XRAnchor3D nodes should be direct "
+"children of this node for spatial tracking to work correctly.\n"
+"It is the position of this node that you update when your character needs to "
+"move through your game world while we're not moving in the real world. "
+"Movement in the real world is always in relation to this origin point.\n"
+"For example, if your character is driving a car, the XROrigin3D node should "
+"be a child node of this car. Or, if you're implementing a teleport system to "
+"move your character, you should change the position of this node."
+msgstr ""
+
+#: doc/classes/XROrigin3D.xml:19
+msgid ""
+"Allows you to adjust the scale to your game's units. Most AR/VR platforms "
+"assume a scale of 1 game world unit = 1 real world meter.\n"
+"[b]Note:[/b] This method is a passthrough to the [XRServer] itself."
+msgstr ""
+
+#: doc/classes/XRPositionalTracker.xml:4
+msgid "A tracked object."
+msgstr ""
+
+#: doc/classes/XRPositionalTracker.xml:7
+msgid ""
+"An instance of this object represents a device that is tracked, such as a "
+"controller or anchor point. HMDs aren't represented here as they are handled "
+"internally.\n"
+"As controllers are turned on and the AR/VR interface detects them, instances "
+"of this object are automatically added to this list of active tracking "
+"objects accessible through the [XRServer].\n"
+"The [XRController3D] and [XRAnchor3D] both consume objects of this type and "
+"should be used in your project. The positional trackers are just under-the-"
+"hood objects that make this all work. These are mostly exposed so that "
+"GDNative-based interfaces can interact with them."
+msgstr ""
+
+#: doc/classes/XRPositionalTracker.xml:19
+msgid ""
+"Returns the hand holding this tracker, if known. See [enum TrackerHand] "
+"constants."
+msgstr ""
+
+#: doc/classes/XRPositionalTracker.xml:26
+msgid ""
+"If this is a controller that is being tracked, the controller will also be "
+"represented by a joystick entry with this ID."
+msgstr ""
+
+#: doc/classes/XRPositionalTracker.xml:33
+msgid ""
+"Returns the mesh related to a controller or anchor point if one is available."
+msgstr ""
+
+#: doc/classes/XRPositionalTracker.xml:40
+msgid "Returns the controller or anchor point's name if available."
+msgstr ""
+
+#: doc/classes/XRPositionalTracker.xml:47
+msgid "Returns the controller's orientation matrix."
+msgstr ""
+
+#: doc/classes/XRPositionalTracker.xml:54
+msgid "Returns the world-space controller position."
+msgstr ""
+
+#: doc/classes/XRPositionalTracker.xml:61
+msgid ""
+"Returns the internal tracker ID. This uniquely identifies the tracker per "
+"tracker type and matches the ID you need to specify for nodes such as the "
+"[XRController3D] and [XRAnchor3D] nodes."
+msgstr ""
+
+#: doc/classes/XRPositionalTracker.xml:68
+msgid "Returns [code]true[/code] if this device tracks orientation."
+msgstr ""
+
+#: doc/classes/XRPositionalTracker.xml:75
+msgid "Returns [code]true[/code] if this device tracks position."
+msgstr ""
+
+#: doc/classes/XRPositionalTracker.xml:84
+msgid "Returns the transform combining this device's orientation and position."
+msgstr ""
+
+#: doc/classes/XRPositionalTracker.xml:91
+msgid "Returns the tracker's type."
+msgstr ""
+
+#: doc/classes/XRPositionalTracker.xml:97
+msgid ""
+"The degree to which the tracker rumbles. Ranges from [code]0.0[/code] to "
+"[code]1.0[/code] with precision [code].01[/code]."
+msgstr ""
+
+#: doc/classes/XRPositionalTracker.xml:102
+msgid "The hand this tracker is held in is unknown or not applicable."
+msgstr ""
+
+#: doc/classes/XRPositionalTracker.xml:105
+msgid "This tracker is the left hand controller."
+msgstr ""
+
+#: doc/classes/XRPositionalTracker.xml:108
+msgid "This tracker is the right hand controller."
+msgstr ""
+
+#: doc/classes/XRServer.xml:4
+msgid "Server for AR and VR features."
+msgstr ""
+
+#: doc/classes/XRServer.xml:7
+msgid ""
+"The AR/VR server is the heart of our Advanced and Virtual Reality solution "
+"and handles all the processing."
+msgstr ""
+
+#: doc/classes/XRServer.xml:21
+msgid ""
+"This is an important function to understand correctly. AR and VR platforms "
+"all handle positioning slightly differently.\n"
+"For platforms that do not offer spatial tracking, our origin point (0,0,0) "
+"is the location of our HMD, but you have little control over the direction "
+"the player is facing in the real world.\n"
+"For platforms that do offer spatial tracking, our origin point depends very "
+"much on the system. For OpenVR, our origin point is usually the center of "
+"the tracking space, on the ground. For other platforms, it's often the "
+"location of the tracking camera.\n"
+"This method allows you to center your tracker on the location of the HMD. It "
+"will take the current location of the HMD and use that to adjust all your "
+"tracking data; in essence, realigning the real world to your player's "
+"current position in the game world.\n"
+"For this method to produce usable results, tracking information must be "
+"available. This often takes a few frames after starting your game.\n"
+"You should call this method after a few seconds have passed. For instance, "
+"when the user requests a realignment of the display holding a designated "
+"button on a controller for a short period of time, or when implementing a "
+"teleport mechanism."
+msgstr ""
+
+#: doc/classes/XRServer.xml:35
+msgid ""
+"Finds an interface by its name. For instance, if your project uses "
+"capabilities of an AR/VR platform, you can find the interface for that "
+"platform by name and initialize it."
+msgstr ""
+
+#: doc/classes/XRServer.xml:42
+msgid "Returns the primary interface's transformation."
+msgstr ""
+
+#: doc/classes/XRServer.xml:51
+msgid ""
+"Returns the interface registered at a given index in our list of interfaces."
+msgstr ""
+
+#: doc/classes/XRServer.xml:58
+msgid ""
+"Returns the number of interfaces currently registered with the AR/VR server. "
+"If your project supports multiple AR/VR platforms, you can look through the "
+"available interface, and either present the user with a selection or simply "
+"try to initialize each interface and use the first one that returns "
+"[code]true[/code]."
+msgstr ""
+
+#: doc/classes/XRServer.xml:65
+msgid ""
+"Returns a list of available interfaces the ID and name of each interface."
+msgstr ""
+
+#: doc/classes/XRServer.xml:72
+msgid ""
+"Returns the absolute timestamp (in μs) of the last [XRServer] commit of the "
+"AR/VR eyes to [RenderingServer]. The value comes from an internal call to "
+"[method OS.get_ticks_usec]."
+msgstr ""
+
+#: doc/classes/XRServer.xml:79
+msgid ""
+"Returns the duration (in μs) of the last frame. This is computed as the "
+"difference between [method get_last_commit_usec] and [method "
+"get_last_process_usec] when committing."
+msgstr ""
+
+#: doc/classes/XRServer.xml:86
+msgid ""
+"Returns the absolute timestamp (in μs) of the last [XRServer] process "
+"callback. The value comes from an internal call to [method OS."
+"get_ticks_usec]."
+msgstr ""
+
+#: doc/classes/XRServer.xml:93
+msgid ""
+"Returns the reference frame transform. Mostly used internally and exposed "
+"for GDNative build interfaces."
+msgstr ""
+
+#: doc/classes/XRServer.xml:102
+msgid "Returns the positional tracker at the given ID."
+msgstr ""
+
+#: doc/classes/XRServer.xml:109
+msgid "Returns the number of trackers currently registered."
+msgstr ""
+
+#: doc/classes/XRServer.xml:115
+msgid "The primary [XRInterface] currently bound to the [XRServer]."
+msgstr ""
+
+#: doc/classes/XRServer.xml:118
+msgid ""
+"Allows you to adjust the scale to your game's units. Most AR/VR platforms "
+"assume a scale of 1 game world unit = 1 real world meter."
+msgstr ""
+
+#: doc/classes/XRServer.xml:126
+msgid "Emitted when a new interface has been added."
+msgstr ""
+
+#: doc/classes/XRServer.xml:133
+msgid "Emitted when an interface is removed."
+msgstr ""
+
+#: doc/classes/XRServer.xml:144
+msgid ""
+"Emitted when a new tracker has been added. If you don't use a fixed number "
+"of controllers or if you're using [XRAnchor3D]s for an AR solution, it is "
+"important to react to this signal to add the appropriate [XRController3D] or "
+"[XRAnchor3D] nodes related to this new tracker."
+msgstr ""
+
+#: doc/classes/XRServer.xml:155
+msgid ""
+"Emitted when a tracker is removed. You should remove any [XRController3D] or "
+"[XRAnchor3D] points if applicable. This is not mandatory, the nodes simply "
+"become inactive and will be made active again when a new tracker becomes "
+"available (i.e. a new controller is switched on that takes the place of the "
+"previous one)."
+msgstr ""
+
+#: doc/classes/XRServer.xml:161
+msgid "The tracker tracks the location of a controller."
+msgstr ""
+
+#: doc/classes/XRServer.xml:164
+msgid "The tracker tracks the location of a base station."
+msgstr ""
+
+#: doc/classes/XRServer.xml:167
+msgid "The tracker tracks the location and size of an AR anchor."
+msgstr ""
+
+#: doc/classes/XRServer.xml:170
+msgid "Used internally to filter trackers of any known type."
+msgstr ""
+
+#: doc/classes/XRServer.xml:173
+msgid "Used internally if we haven't set the tracker type yet."
+msgstr ""
+
+#: doc/classes/XRServer.xml:176
+msgid "Used internally to select all trackers."
+msgstr ""
+
+#: doc/classes/XRServer.xml:179
+msgid ""
+"Fully reset the orientation of the HMD. Regardless of what direction the "
+"user is looking to in the real world. The user will look dead ahead in the "
+"virtual world."
+msgstr ""
+
+#: doc/classes/XRServer.xml:182
+msgid ""
+"Resets the orientation but keeps the tilt of the device. So if we're looking "
+"down, we keep looking down but heading will be reset."
+msgstr ""
+
+#: doc/classes/XRServer.xml:185
+msgid ""
+"Does not reset the orientation of the HMD, only the position of the player "
+"gets centered."
+msgstr ""
+
#: doc/classes/YSort.xml:4
msgid "Sort all child nodes based on their Y positions."
msgstr ""
diff --git a/drivers/gles2/rasterizer_gles2.cpp b/drivers/gles2/rasterizer_gles2.cpp
index 37b729d568..28f06f939c 100644
--- a/drivers/gles2/rasterizer_gles2.cpp
+++ b/drivers/gles2/rasterizer_gles2.cpp
@@ -277,9 +277,8 @@ void RasterizerGLES2::begin_frame(double frame_step) {
frame_step = 0.001;
}
- // double time_roll_over = GLOBAL_GET("rendering/limits/time/time_rollover_secs");
- // if (time_total > time_roll_over)
- // time_total = 0; //roll over every day (should be customz
+ double time_roll_over = GLOBAL_GET("rendering/limits/time/time_rollover_secs");
+ time_total = Math::fmod(time_total, time_roll_over);
storage->frame.time[0] = time_total;
storage->frame.time[1] = Math::fmod(time_total, 3600);
diff --git a/editor/animation_bezier_editor.cpp b/editor/animation_bezier_editor.cpp
index e6a020bf41..57c63dd40d 100644
--- a/editor/animation_bezier_editor.cpp
+++ b/editor/animation_bezier_editor.cpp
@@ -162,7 +162,7 @@ void AnimationBezierTrackEdit::_draw_track(int p_track, const Color &p_color) {
float c = (t - low_pos.x) / (high_pos.x - low_pos.x);
- h = low_pos.linear_interpolate(high_pos, c).y;
+ h = low_pos.lerp(high_pos, c).y;
}
h = _bezier_h_to_pixel(h);
@@ -201,12 +201,12 @@ void AnimationBezierTrackEdit::_draw_line_clipped(const Vector2 &p_from, const V
if (to.x > p_clip_right) {
float c = (p_clip_right - from.x) / (to.x - from.x);
- to = from.linear_interpolate(to, c);
+ to = from.lerp(to, c);
}
if (from.x < p_clip_left) {
float c = (p_clip_left - from.x) / (to.x - from.x);
- from = from.linear_interpolate(to, c);
+ from = from.lerp(to, c);
}
draw_line(from, to, p_color);
diff --git a/editor/animation_track_editor_plugins.cpp b/editor/animation_track_editor_plugins.cpp
index 695c294ad2..0ce3ab292e 100644
--- a/editor/animation_track_editor_plugins.cpp
+++ b/editor/animation_track_editor_plugins.cpp
@@ -112,13 +112,13 @@ void AnimationTrackEditColor::draw_key_link(int p_index, float p_pixels_sec, int
if (x_from < p_clip_left) {
float c = float(p_clip_left - x_from) / (x_to - x_from);
- color = color.linear_interpolate(color_next, c);
+ color = color.lerp(color_next, c);
x_from = p_clip_left;
}
if (x_to > p_clip_right) {
float c = float(p_clip_right - x_from) / (x_to - x_from);
- color_next = color.linear_interpolate(color_next, c);
+ color_next = color.lerp(color_next, c);
x_to = p_clip_right;
}
diff --git a/editor/debugger/editor_profiler.cpp b/editor/debugger/editor_profiler.cpp
index 1577e24ac0..c7d4e9128a 100644
--- a/editor/debugger/editor_profiler.cpp
+++ b/editor/debugger/editor_profiler.cpp
@@ -136,7 +136,7 @@ Color EditorProfiler::_get_color_from_signature(const StringName &p_signature) c
double rot = ABS(double(p_signature.hash()) / double(0x7FFFFFFF));
Color c;
c.set_hsv(rot, bc.get_s(), bc.get_v());
- return c.linear_interpolate(get_theme_color("base_color", "Editor"), 0.07);
+ return c.lerp(get_theme_color("base_color", "Editor"), 0.07);
}
void EditorProfiler::_item_edited() {
diff --git a/editor/debugger/editor_visual_profiler.cpp b/editor/debugger/editor_visual_profiler.cpp
index d2edba5970..7d2822b1c9 100644
--- a/editor/debugger/editor_visual_profiler.cpp
+++ b/editor/debugger/editor_visual_profiler.cpp
@@ -132,7 +132,7 @@ Color EditorVisualProfiler::_get_color_from_signature(const StringName &p_signat
double rot = ABS(double(p_signature.hash()) / double(0x7FFFFFFF));
Color c;
c.set_hsv(rot, bc.get_s(), bc.get_v());
- return c.linear_interpolate(get_theme_color("base_color", "Editor"), 0.07);
+ return c.lerp(get_theme_color("base_color", "Editor"), 0.07);
}
void EditorVisualProfiler::_item_selected() {
diff --git a/editor/debugger/script_editor_debugger.cpp b/editor/debugger/script_editor_debugger.cpp
index 81a7d85b18..152989f90b 100644
--- a/editor/debugger/script_editor_debugger.cpp
+++ b/editor/debugger/script_editor_debugger.cpp
@@ -31,6 +31,7 @@
#include "script_editor_debugger.h"
#include "core/debugger/debugger_marshalls.h"
+#include "core/debugger/remote_debugger.h"
#include "core/io/marshalls.h"
#include "core/project_settings.h"
#include "core/ustring.h"
@@ -396,10 +397,33 @@ void ScriptEditorDebugger::_parse_message(const String &p_msg, const Array &p_da
inspector->add_stack_variable(p_data);
} else if (p_msg == "output") {
- ERR_FAIL_COND(p_data.size() < 1);
+ ERR_FAIL_COND(p_data.size() != 2);
+
ERR_FAIL_COND(p_data[0].get_type() != Variant::PACKED_STRING_ARRAY);
- Vector<String> strings = p_data[0];
- EditorNode::get_log()->add_message(String("\n").join(strings));
+ Vector<String> output_strings = p_data[0];
+
+ ERR_FAIL_COND(p_data[1].get_type() != Variant::PACKED_INT32_ARRAY);
+ Vector<int> output_types = p_data[1];
+
+ ERR_FAIL_COND(output_strings.size() != output_types.size());
+
+ for (int i = 0; i < output_strings.size(); i++) {
+ RemoteDebugger::MessageType type = (RemoteDebugger::MessageType)(int)(output_types[i]);
+ EditorLog::MessageType msg_type;
+ switch (type) {
+ case RemoteDebugger::MESSAGE_TYPE_LOG: {
+ msg_type = EditorLog::MSG_TYPE_STD;
+ } break;
+ case RemoteDebugger::MESSAGE_TYPE_ERROR: {
+ msg_type = EditorLog::MSG_TYPE_ERROR;
+ } break;
+ default: {
+ WARN_PRINT("Unhandled script debugger message type: " + itos(type));
+ msg_type = EditorLog::MSG_TYPE_STD;
+ } break;
+ }
+ EditorNode::get_log()->add_message(output_strings[i], msg_type);
+ }
} else if (p_msg == "performance:profile_frame") {
Vector<float> p;
p.resize(p_data.size());
diff --git a/editor/editor_help.cpp b/editor/editor_help.cpp
index 75d1b2595a..b566ad0fa4 100644
--- a/editor/editor_help.cpp
+++ b/editor/editor_help.cpp
@@ -47,12 +47,12 @@ void EditorHelp::_init_colors() {
title_color = get_theme_color("accent_color", "Editor");
text_color = get_theme_color("default_color", "RichTextLabel");
headline_color = get_theme_color("headline_color", "EditorHelp");
- base_type_color = title_color.linear_interpolate(text_color, 0.5);
+ base_type_color = title_color.lerp(text_color, 0.5);
comment_color = text_color * Color(1, 1, 1, 0.6);
symbol_color = comment_color;
value_color = text_color * Color(1, 1, 1, 0.6);
qualifier_color = text_color * Color(1, 1, 1, 0.8);
- type_color = get_theme_color("accent_color", "Editor").linear_interpolate(text_color, 0.5);
+ type_color = get_theme_color("accent_color", "Editor").lerp(text_color, 0.5);
class_desc->add_theme_color_override("selection_color", get_theme_color("accent_color", "Editor") * Color(1, 1, 1, 0.4));
class_desc->add_theme_constant_override("line_separation", Math::round(5 * EDSCALE));
}
@@ -196,7 +196,7 @@ void EditorHelp::_add_type(const String &p_type, const String &p_enum) {
}
}
const Color text_color = get_theme_color("default_color", "RichTextLabel");
- const Color type_color = get_theme_color("accent_color", "Editor").linear_interpolate(text_color, 0.5);
+ const Color type_color = get_theme_color("accent_color", "Editor").lerp(text_color, 0.5);
class_desc->push_color(type_color);
bool add_array = false;
if (can_ref) {
@@ -1052,6 +1052,7 @@ void EditorHelp::_update_doc() {
class_desc->pop(); // color
class_desc->pop(); // font
class_desc->pop(); // cell
+ method_line[cd.properties[i].setter] = property_line[cd.properties[i].name];
}
if (cd.properties[i].getter != "") {
@@ -1069,6 +1070,7 @@ void EditorHelp::_update_doc() {
class_desc->pop(); //color
class_desc->pop(); //font
class_desc->pop(); //cell
+ method_line[cd.properties[i].getter] = property_line[cd.properties[i].name];
}
class_desc->pop(); // table
@@ -1227,9 +1229,9 @@ static void _add_text_to_rt(const String &p_bbcode, RichTextLabel *p_rt) {
Color font_color_hl = p_rt->get_theme_color("headline_color", "EditorHelp");
Color accent_color = p_rt->get_theme_color("accent_color", "Editor");
Color property_color = p_rt->get_theme_color("property_color", "Editor");
- Color link_color = accent_color.linear_interpolate(font_color_hl, 0.8);
- Color code_color = accent_color.linear_interpolate(font_color_hl, 0.6);
- Color kbd_color = accent_color.linear_interpolate(property_color, 0.6);
+ Color link_color = accent_color.lerp(font_color_hl, 0.8);
+ Color code_color = accent_color.lerp(font_color_hl, 0.6);
+ Color kbd_color = accent_color.lerp(property_color, 0.6);
String bbcode = p_bbcode.dedent().replace("\t", "").replace("\r", "").strip_edges();
diff --git a/editor/editor_inspector.cpp b/editor/editor_inspector.cpp
index 8fcd5bacb6..6adc640651 100644
--- a/editor/editor_inspector.cpp
+++ b/editor/editor_inspector.cpp
@@ -501,18 +501,20 @@ bool EditorPropertyRevert::can_property_revert(Object *p_object, const StringNam
}
}
- if (p_object->call("property_can_revert", p_property).operator bool()) {
-
- has_revert = true;
- }
-
- if (!has_revert && !p_object->get_script().is_null()) {
- Ref<Script> scr = p_object->get_script();
- if (scr.is_valid()) {
- Variant orig_value;
- if (scr->get_property_default_value(p_property, orig_value)) {
- if (orig_value != p_object->get(p_property)) {
- has_revert = true;
+ // If the object implements property_can_revert, rely on that completely
+ // (i.e. don't then try to revert to default value - the property_get_revert implementation
+ // can do that if so desired)
+ if (p_object->has_method("property_can_revert")) {
+ has_revert = p_object->call("property_can_revert", p_property).operator bool();
+ } else {
+ if (!has_revert && !p_object->get_script().is_null()) {
+ Ref<Script> scr = p_object->get_script();
+ if (scr.is_valid()) {
+ Variant orig_value;
+ if (scr->get_property_default_value(p_property, orig_value)) {
+ if (orig_value != p_object->get(p_property)) {
+ has_revert = true;
+ }
}
}
}
diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp
index ea2009ab58..90cea06439 100644
--- a/editor/editor_node.cpp
+++ b/editor/editor_node.cpp
@@ -1747,7 +1747,7 @@ void EditorNode::push_item(Object *p_object, const String &p_property, bool p_in
void EditorNode::_save_default_environment() {
- Ref<Environment> fallback = get_tree()->get_root()->get_world()->get_fallback_environment();
+ Ref<Environment> fallback = get_tree()->get_root()->get_world_3d()->get_fallback_environment();
if (fallback.is_valid() && fallback->get_path().is_resource_file()) {
Map<RES, bool> processed;
diff --git a/editor/editor_spin_slider.cpp b/editor/editor_spin_slider.cpp
index 1506c574dd..2c70e16610 100644
--- a/editor/editor_spin_slider.cpp
+++ b/editor/editor_spin_slider.cpp
@@ -36,6 +36,9 @@
#include "editor_scale.h"
String EditorSpinSlider::get_tooltip(const Point2 &p_pos) const {
+ if (grabber->is_visible()) {
+ return rtos(get_value()) + "\n\n" + TTR("Hold Ctrl to round to integers. Hold Shift for more precise changes.");
+ }
return rtos(get_value());
}
@@ -111,7 +114,21 @@ void EditorSpinSlider::_gui_input(const Ref<InputEvent> &p_event) {
}
if (grabbing_spinner) {
+ // Don't make the user scroll all the way back to 'in range' if they went off the end.
+ if (pre_grab_value < get_min() && !is_lesser_allowed()) {
+ pre_grab_value = get_min();
+ }
+ if (pre_grab_value > get_max() && !is_greater_allowed()) {
+ pre_grab_value = get_max();
+ }
+
if (mm->get_control()) {
+ // If control was just pressed, don't make the value do a huge jump in magnitude.
+ if (grabbing_spinner_dist_cache != 0) {
+ pre_grab_value += grabbing_spinner_dist_cache * get_step();
+ grabbing_spinner_dist_cache = 0;
+ }
+
set_value(Math::round(pre_grab_value + get_step() * grabbing_spinner_dist_cache * 10));
} else {
set_value(pre_grab_value + get_step() * grabbing_spinner_dist_cache);
diff --git a/editor/editor_themes.cpp b/editor/editor_themes.cpp
index 576ee436de..0ef173f074 100644
--- a/editor/editor_themes.cpp
+++ b/editor/editor_themes.cpp
@@ -337,24 +337,24 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
//Colors
bool dark_theme = EditorSettings::get_singleton()->is_dark_theme();
- const Color dark_color_1 = base_color.linear_interpolate(Color(0, 0, 0, 1), contrast);
- const Color dark_color_2 = base_color.linear_interpolate(Color(0, 0, 0, 1), contrast * 1.5);
- const Color dark_color_3 = base_color.linear_interpolate(Color(0, 0, 0, 1), contrast * 2);
+ const Color dark_color_1 = base_color.lerp(Color(0, 0, 0, 1), contrast);
+ const Color dark_color_2 = base_color.lerp(Color(0, 0, 0, 1), contrast * 1.5);
+ const Color dark_color_3 = base_color.lerp(Color(0, 0, 0, 1), contrast * 2);
const Color background_color = dark_color_2;
// white (dark theme) or black (light theme), will be used to generate the rest of the colors
const Color mono_color = dark_theme ? Color(1, 1, 1) : Color(0, 0, 0);
- const Color contrast_color_1 = base_color.linear_interpolate(mono_color, MAX(contrast, default_contrast));
- const Color contrast_color_2 = base_color.linear_interpolate(mono_color, MAX(contrast * 1.5, default_contrast * 1.5));
+ const Color contrast_color_1 = base_color.lerp(mono_color, MAX(contrast, default_contrast));
+ const Color contrast_color_2 = base_color.lerp(mono_color, MAX(contrast * 1.5, default_contrast * 1.5));
- const Color font_color = mono_color.linear_interpolate(base_color, 0.25);
- const Color font_color_hl = mono_color.linear_interpolate(base_color, 0.15);
+ const Color font_color = mono_color.lerp(base_color, 0.25);
+ const Color font_color_hl = mono_color.lerp(base_color, 0.15);
const Color font_color_disabled = Color(mono_color.r, mono_color.g, mono_color.b, 0.3);
const Color font_color_selection = accent_color * Color(1, 1, 1, 0.4);
- const Color color_disabled = mono_color.inverted().linear_interpolate(base_color, 0.7);
- const Color color_disabled_bg = mono_color.inverted().linear_interpolate(base_color, 0.9);
+ const Color color_disabled = mono_color.inverted().lerp(base_color, 0.7);
+ const Color color_disabled_bg = mono_color.inverted().lerp(base_color, 0.9);
Color icon_color_hover = Color(1, 1, 1) * (dark_theme ? 1.15 : 1.45);
icon_color_hover.a = 1.0;
@@ -391,13 +391,13 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
Color success_color = Color(0.45, 0.95, 0.5);
Color warning_color = Color(1, 0.87, 0.4);
Color error_color = Color(1, 0.47, 0.42);
- Color property_color = font_color.linear_interpolate(Color(0.5, 0.5, 0.5), 0.5);
+ Color property_color = font_color.lerp(Color(0.5, 0.5, 0.5), 0.5);
if (!dark_theme) {
// Darken some colors to be readable on a light background
- success_color = success_color.linear_interpolate(mono_color, 0.35);
- warning_color = warning_color.linear_interpolate(mono_color, 0.35);
- error_color = error_color.linear_interpolate(mono_color, 0.25);
+ success_color = success_color.lerp(mono_color, 0.35);
+ warning_color = warning_color.lerp(mono_color, 0.35);
+ error_color = error_color.lerp(mono_color, 0.25);
}
theme->set_color("success_color", "Editor", success_color);
@@ -434,7 +434,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
editor_register_fonts(theme);
// Highlighted tabs and border width
- Color tab_color = highlight_tabs ? base_color.linear_interpolate(font_color, contrast) : base_color;
+ Color tab_color = highlight_tabs ? base_color.lerp(font_color, contrast) : base_color;
const int border_width = CLAMP(border_size, 0, 3) * EDSCALE;
const int default_margin_size = 4;
@@ -686,7 +686,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
theme->set_icon("visibility_xray", "PopupMenu", theme->get_icon("GuiVisibilityXray", "EditorIcons"));
theme->set_constant("vseparation", "PopupMenu", (extra_spacing + default_margin_size + 1) * EDSCALE);
- Ref<StyleBoxFlat> sub_inspector_bg = make_flat_stylebox(dark_color_1.linear_interpolate(accent_color, 0.08), 2, 0, 2, 2);
+ Ref<StyleBoxFlat> sub_inspector_bg = make_flat_stylebox(dark_color_1.lerp(accent_color, 0.08), 2, 0, 2, 2);
sub_inspector_bg->set_border_width(MARGIN_LEFT, 2);
sub_inspector_bg->set_border_width(MARGIN_RIGHT, 2);
sub_inspector_bg->set_border_width(MARGIN_BOTTOM, 2);
@@ -763,9 +763,9 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
theme->set_stylebox("title_button_hover", "Tree", style_tree_title);
theme->set_stylebox("title_button_pressed", "Tree", style_tree_title);
- Color prop_category_color = dark_color_1.linear_interpolate(mono_color, 0.12);
- Color prop_section_color = dark_color_1.linear_interpolate(mono_color, 0.09);
- Color prop_subsection_color = dark_color_1.linear_interpolate(mono_color, 0.06);
+ Color prop_category_color = dark_color_1.lerp(mono_color, 0.12);
+ Color prop_section_color = dark_color_1.lerp(mono_color, 0.09);
+ Color prop_subsection_color = dark_color_1.lerp(mono_color, 0.06);
theme->set_color("prop_category", "Editor", prop_category_color);
theme->set_color("prop_section", "Editor", prop_section_color);
theme->set_color("prop_subsection", "Editor", prop_subsection_color);
@@ -1124,7 +1124,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
theme->set_icon("toggle_hidden", "FileDialog", theme->get_icon("GuiVisibilityVisible", "EditorIcons"));
// Use a different color for folder icons to make them easier to distinguish from files.
// On a light theme, the icon will be dark, so we need to lighten it before blending it with the accent color.
- theme->set_color("folder_icon_modulate", "FileDialog", (dark_theme ? Color(1, 1, 1) : Color(4.25, 4.25, 4.25)).linear_interpolate(accent_color, 0.7));
+ theme->set_color("folder_icon_modulate", "FileDialog", (dark_theme ? Color(1, 1, 1) : Color(4.25, 4.25, 4.25)).lerp(accent_color, 0.7));
theme->set_color("files_disabled", "FileDialog", font_color_disabled);
// color picker
@@ -1158,13 +1158,13 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
// editor main color
const Color main_color = dark_theme ? Color(0.34, 0.7, 1.0) : Color(0.02, 0.5, 1.0);
- const Color symbol_color = Color(0.34, 0.57, 1.0).linear_interpolate(mono_color, dark_theme ? 0.5 : 0.3);
+ const Color symbol_color = Color(0.34, 0.57, 1.0).lerp(mono_color, dark_theme ? 0.5 : 0.3);
const Color keyword_color = Color(1.0, 0.44, 0.52);
const Color basetype_color = dark_theme ? Color(0.26, 1.0, 0.76) : Color(0.0, 0.76, 0.38);
- const Color type_color = basetype_color.linear_interpolate(mono_color, dark_theme ? 0.4 : 0.3);
- const Color usertype_color = basetype_color.linear_interpolate(mono_color, dark_theme ? 0.7 : 0.5);
+ const Color type_color = basetype_color.lerp(mono_color, dark_theme ? 0.4 : 0.3);
+ const Color usertype_color = basetype_color.lerp(mono_color, dark_theme ? 0.7 : 0.5);
const Color comment_color = dim_color;
- const Color string_color = (dark_theme ? Color(1.0, 0.85, 0.26) : Color(1.0, 0.82, 0.09)).linear_interpolate(mono_color, dark_theme ? 0.5 : 0.3);
+ const Color string_color = (dark_theme ? Color(1.0, 0.85, 0.26) : Color(1.0, 0.82, 0.09)).lerp(mono_color, dark_theme ? 0.5 : 0.3);
const Color te_background_color = dark_theme ? background_color : base_color;
const Color completion_background_color = dark_theme ? base_color : background_color;
@@ -1183,9 +1183,9 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
const Color current_line_color = alpha1;
const Color line_length_guideline_color = dark_theme ? base_color : background_color;
const Color word_highlighted_color = alpha1;
- const Color number_color = basetype_color.linear_interpolate(mono_color, dark_theme ? 0.5 : 0.3);
+ const Color number_color = basetype_color.lerp(mono_color, dark_theme ? 0.5 : 0.3);
const Color function_color = main_color;
- const Color member_variable_color = main_color.linear_interpolate(mono_color, 0.6);
+ const Color member_variable_color = main_color.lerp(mono_color, 0.6);
const Color mark_color = Color(error_color.r, error_color.g, error_color.b, 0.3);
const Color bookmark_color = Color(0.08, 0.49, 0.98);
const Color breakpoint_color = error_color;
diff --git a/editor/node_3d_editor_gizmos.cpp b/editor/node_3d_editor_gizmos.cpp
index 31a8320209..c321e85546 100644
--- a/editor/node_3d_editor_gizmos.cpp
+++ b/editor/node_3d_editor_gizmos.cpp
@@ -169,7 +169,7 @@ void EditorNode3DGizmo::set_spatial_node(Node3D *p_node) {
void EditorNode3DGizmo::Instance::create_instance(Node3D *p_base, bool p_hidden) {
- instance = RS::get_singleton()->instance_create2(mesh->get_rid(), p_base->get_world()->get_scenario());
+ instance = RS::get_singleton()->instance_create2(mesh->get_rid(), p_base->get_world_3d()->get_scenario());
RS::get_singleton()->instance_attach_object_instance_id(instance, p_base->get_instance_id());
if (skin_reference.is_valid()) {
RS::get_singleton()->instance_attach_skeleton(instance, skin_reference->get_skeleton());
@@ -486,11 +486,12 @@ bool EditorNode3DGizmo::intersect_frustum(const Camera3D *p_camera, const Vector
Vector<Plane> transformed_frustum;
- for (int i = 0; i < 4; i++) {
+ for (int i = 0; i < p_frustum.size(); i++) {
transformed_frustum.push_back(it.xform(p_frustum[i]));
}
- if (collision_mesh->inside_convex_shape(transformed_frustum.ptr(), transformed_frustum.size(), mesh_scale)) {
+ Vector<Vector3> convex_points = Geometry::compute_convex_mesh_points(p_frustum.ptr(), p_frustum.size());
+ if (collision_mesh->inside_convex_shape(transformed_frustum.ptr(), transformed_frustum.size(), convex_points.ptr(), convex_points.size(), mesh_scale)) {
return true;
}
}
@@ -2827,10 +2828,10 @@ void DecalGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) {
lines.push_back(a);
lines.push_back(b);
} else {
- Vector3 ah = a.linear_interpolate(b, 0.2);
+ Vector3 ah = a.lerp(b, 0.2);
lines.push_back(a);
lines.push_back(ah);
- Vector3 bh = b.linear_interpolate(a, 0.2);
+ Vector3 bh = b.lerp(a, 0.2);
lines.push_back(b);
lines.push_back(bh);
}
diff --git a/editor/plugins/animation_state_machine_editor.cpp b/editor/plugins/animation_state_machine_editor.cpp
index c28f533958..ed51a2d2cf 100644
--- a/editor/plugins/animation_state_machine_editor.cpp
+++ b/editor/plugins/animation_state_machine_editor.cpp
@@ -885,7 +885,7 @@ void AnimationNodeStateMachineEditor::_state_machine_pos_draw() {
state_machine_play_pos->draw_line(from, to, bg, 2);
- to = from.linear_interpolate(to, c);
+ to = from.lerp(to, c);
state_machine_play_pos->draw_line(from, to, fg, 2);
}
diff --git a/editor/plugins/canvas_item_editor_plugin.cpp b/editor/plugins/canvas_item_editor_plugin.cpp
index 79111762b2..e882b3a8d7 100644
--- a/editor/plugins/canvas_item_editor_plugin.cpp
+++ b/editor/plugins/canvas_item_editor_plugin.cpp
@@ -1437,13 +1437,13 @@ void CanvasItemEditor::_solve_IK(Node2D *leaf_node, Point2 target_position) {
Vector2 direction = (joints_pos[node_id + 1] - joints_pos[node_id]).normalized();
int len = E->get();
if (E == se->pre_drag_bones_length.front()) {
- joints_pos[1] = joints_pos[1].linear_interpolate(joints_pos[0] + len * direction, solver_k);
+ joints_pos[1] = joints_pos[1].lerp(joints_pos[0] + len * direction, solver_k);
} else if (E == se->pre_drag_bones_length.back()) {
- joints_pos[node_id] = joints_pos[node_id].linear_interpolate(joints_pos[node_id + 1] - len * direction, solver_k);
+ joints_pos[node_id] = joints_pos[node_id].lerp(joints_pos[node_id + 1] - len * direction, solver_k);
} else {
Vector2 center = (joints_pos[node_id + 1] + joints_pos[node_id]) / 2.0;
- joints_pos[node_id] = joints_pos[node_id].linear_interpolate(center - (direction * len) / 2.0, solver_k);
- joints_pos[node_id + 1] = joints_pos[node_id + 1].linear_interpolate(center + (direction * len) / 2.0, solver_k);
+ joints_pos[node_id] = joints_pos[node_id].lerp(center - (direction * len) / 2.0, solver_k);
+ joints_pos[node_id + 1] = joints_pos[node_id + 1].lerp(center + (direction * len) / 2.0, solver_k);
}
node_id++;
}
@@ -2698,7 +2698,7 @@ void CanvasItemEditor::_draw_smart_snapping() {
void CanvasItemEditor::_draw_rulers() {
Color bg_color = get_theme_color("dark_color_2", "Editor");
- Color graduation_color = get_theme_color("font_color", "Editor").linear_interpolate(bg_color, 0.5);
+ Color graduation_color = get_theme_color("font_color", "Editor").lerp(bg_color, 0.5);
Color font_color = get_theme_color("font_color", "Editor");
font_color.a = 0.8;
Ref<Font> font = get_theme_font("rulers", "EditorFonts");
@@ -3072,8 +3072,8 @@ void CanvasItemEditor::_draw_control_helpers(Control *control) {
Vector2 line_ends[4];
for (int i = 0; i < 4; i++) {
float anchor_val = (i >= 2) ? ANCHOR_END - anchors_values[i] : anchors_values[i];
- line_starts[i] = Vector2::linear_interpolate(corners_pos[i], corners_pos[(i + 1) % 4], anchor_val);
- line_ends[i] = Vector2::linear_interpolate(corners_pos[(i + 3) % 4], corners_pos[(i + 2) % 4], anchor_val);
+ line_starts[i] = corners_pos[i].lerp(corners_pos[(i + 1) % 4], anchor_val);
+ line_ends[i] = corners_pos[(i + 3) % 4].lerp(corners_pos[(i + 2) % 4], anchor_val);
anchor_snapped = anchors_values[i] == 0.0 || anchors_values[i] == 0.5 || anchors_values[i] == 1.0;
viewport->draw_line(line_starts[i], line_ends[i], anchor_snapped ? color_snapped : color_base, (i == dragged_anchor || (i + 3) % 4 == dragged_anchor) ? 2 : 1);
}
diff --git a/editor/plugins/material_editor_plugin.cpp b/editor/plugins/material_editor_plugin.cpp
index eb14495b9c..f63bcb69b8 100644
--- a/editor/plugins/material_editor_plugin.cpp
+++ b/editor/plugins/material_editor_plugin.cpp
@@ -117,9 +117,9 @@ MaterialEditor::MaterialEditor() {
add_child(vc);
vc->set_anchors_and_margins_preset(PRESET_WIDE);
viewport = memnew(SubViewport);
- Ref<World3D> world;
- world.instance();
- viewport->set_world(world); //use own world
+ Ref<World3D> world_3d;
+ world_3d.instance();
+ viewport->set_world_3d(world_3d); //use own world
vc->add_child(viewport);
viewport->set_disable_input(true);
viewport->set_transparent_background(true);
diff --git a/editor/plugins/mesh_editor_plugin.cpp b/editor/plugins/mesh_editor_plugin.cpp
index 5e657c3b71..3e603fa499 100644
--- a/editor/plugins/mesh_editor_plugin.cpp
+++ b/editor/plugins/mesh_editor_plugin.cpp
@@ -116,9 +116,9 @@ void MeshEditor::_bind_methods() {
MeshEditor::MeshEditor() {
viewport = memnew(SubViewport);
- Ref<World3D> world;
- world.instance();
- viewport->set_world(world); //use own world
+ Ref<World3D> world_3d;
+ world_3d.instance();
+ viewport->set_world_3d(world_3d); //use own world
add_child(viewport);
viewport->set_disable_input(true);
viewport->set_msaa(Viewport::MSAA_2X);
diff --git a/editor/plugins/node_3d_editor_plugin.cpp b/editor/plugins/node_3d_editor_plugin.cpp
index e0b0fe6b53..55b50f526c 100644
--- a/editor/plugins/node_3d_editor_plugin.cpp
+++ b/editor/plugins/node_3d_editor_plugin.cpp
@@ -268,7 +268,7 @@ void Node3DEditorViewport::_update_camera(float p_interp_delta) {
real_t factor = (1.0 / inertia) * p_interp_delta;
// We interpolate a different point here, because in freelook mode the focus point (cursor.pos) orbits around eye_pos
- camera_cursor.eye_pos = old_camera_cursor.eye_pos.linear_interpolate(cursor.eye_pos, CLAMP(factor, 0, 1));
+ camera_cursor.eye_pos = old_camera_cursor.eye_pos.lerp(cursor.eye_pos, CLAMP(factor, 0, 1));
float orbit_inertia = EDITOR_GET("editors/3d/navigation_feel/orbit_inertia");
orbit_inertia = MAX(0.0001, orbit_inertia);
@@ -318,7 +318,7 @@ void Node3DEditorViewport::_update_camera(float p_interp_delta) {
camera_cursor.y_rot = cursor.y_rot;
}
- camera_cursor.pos = old_camera_cursor.pos.linear_interpolate(cursor.pos, MIN(1.f, p_interp_delta * (1 / translation_inertia)));
+ camera_cursor.pos = old_camera_cursor.pos.lerp(cursor.pos, MIN(1.f, p_interp_delta * (1 / translation_inertia)));
camera_cursor.distance = Math::lerp(old_camera_cursor.distance, cursor.distance, MIN(1.f, p_interp_delta * (1 / zoom_inertia)));
}
}
@@ -496,7 +496,7 @@ ObjectID Node3DEditorViewport::_select_ray(const Point2 &p_pos, bool p_append, b
Vector3 pos = _get_ray_pos(p_pos);
Vector2 shrinked_pos = p_pos / subviewport_container->get_stretch_shrink();
- Vector<ObjectID> instances = RenderingServer::get_singleton()->instances_cull_ray(pos, ray, get_tree()->get_root()->get_world()->get_scenario());
+ Vector<ObjectID> instances = RenderingServer::get_singleton()->instances_cull_ray(pos, ray, get_tree()->get_root()->get_world_3d()->get_scenario());
Set<Ref<EditorNode3DGizmo>> found_gizmos;
Node *edited_scene = get_tree()->get_edited_scene_root();
@@ -563,7 +563,7 @@ void Node3DEditorViewport::_find_items_at_pos(const Point2 &p_pos, bool &r_inclu
Vector3 ray = _get_ray(p_pos);
Vector3 pos = _get_ray_pos(p_pos);
- Vector<ObjectID> instances = RenderingServer::get_singleton()->instances_cull_ray(pos, ray, get_tree()->get_root()->get_world()->get_scenario());
+ Vector<ObjectID> instances = RenderingServer::get_singleton()->instances_cull_ray(pos, ray, get_tree()->get_root()->get_world_3d()->get_scenario());
Set<Ref<EditorNode3DGizmo>> found_gizmos;
r_includes_current = false;
@@ -674,19 +674,15 @@ void Node3DEditorViewport::_select_region() {
}
}
- if (!orthogonal) {
- Plane near(cam_pos, -_get_camera_normal());
- near.d -= get_znear();
+ Plane near(cam_pos, -_get_camera_normal());
+ near.d -= get_znear();
+ frustum.push_back(near);
- frustum.push_back(near);
+ Plane far = -near;
+ far.d += get_zfar();
+ frustum.push_back(far);
- Plane far = -near;
- far.d += get_zfar();
-
- frustum.push_back(far);
- }
-
- Vector<ObjectID> instances = RenderingServer::get_singleton()->instances_cull_convex(frustum, get_tree()->get_root()->get_world()->get_scenario());
+ Vector<ObjectID> instances = RenderingServer::get_singleton()->instances_cull_convex(frustum, get_tree()->get_root()->get_world_3d()->get_scenario());
Vector<Node *> selected;
Node *edited_scene = get_tree()->get_edited_scene_root();
@@ -2882,7 +2878,6 @@ void Node3DEditorViewport::_menu_option(int p_option) {
undo_redo->add_undo_method(sp, "set_global_transform", sp->get_global_gizmo_transform());
}
undo_redo->commit_action();
- focus_selection();
} break;
case VIEW_ALIGN_ROTATION_WITH_VIEW: {
@@ -3141,35 +3136,35 @@ void Node3DEditorViewport::_init_gizmo_instance(int p_idx) {
for (int i = 0; i < 3; i++) {
move_gizmo_instance[i] = RS::get_singleton()->instance_create();
RS::get_singleton()->instance_set_base(move_gizmo_instance[i], spatial_editor->get_move_gizmo(i)->get_rid());
- RS::get_singleton()->instance_set_scenario(move_gizmo_instance[i], get_tree()->get_root()->get_world()->get_scenario());
+ RS::get_singleton()->instance_set_scenario(move_gizmo_instance[i], get_tree()->get_root()->get_world_3d()->get_scenario());
RS::get_singleton()->instance_set_visible(move_gizmo_instance[i], false);
RS::get_singleton()->instance_geometry_set_cast_shadows_setting(move_gizmo_instance[i], RS::SHADOW_CASTING_SETTING_OFF);
RS::get_singleton()->instance_set_layer_mask(move_gizmo_instance[i], layer);
move_plane_gizmo_instance[i] = RS::get_singleton()->instance_create();
RS::get_singleton()->instance_set_base(move_plane_gizmo_instance[i], spatial_editor->get_move_plane_gizmo(i)->get_rid());
- RS::get_singleton()->instance_set_scenario(move_plane_gizmo_instance[i], get_tree()->get_root()->get_world()->get_scenario());
+ RS::get_singleton()->instance_set_scenario(move_plane_gizmo_instance[i], get_tree()->get_root()->get_world_3d()->get_scenario());
RS::get_singleton()->instance_set_visible(move_plane_gizmo_instance[i], false);
RS::get_singleton()->instance_geometry_set_cast_shadows_setting(move_plane_gizmo_instance[i], RS::SHADOW_CASTING_SETTING_OFF);
RS::get_singleton()->instance_set_layer_mask(move_plane_gizmo_instance[i], layer);
rotate_gizmo_instance[i] = RS::get_singleton()->instance_create();
RS::get_singleton()->instance_set_base(rotate_gizmo_instance[i], spatial_editor->get_rotate_gizmo(i)->get_rid());
- RS::get_singleton()->instance_set_scenario(rotate_gizmo_instance[i], get_tree()->get_root()->get_world()->get_scenario());
+ RS::get_singleton()->instance_set_scenario(rotate_gizmo_instance[i], get_tree()->get_root()->get_world_3d()->get_scenario());
RS::get_singleton()->instance_set_visible(rotate_gizmo_instance[i], false);
RS::get_singleton()->instance_geometry_set_cast_shadows_setting(rotate_gizmo_instance[i], RS::SHADOW_CASTING_SETTING_OFF);
RS::get_singleton()->instance_set_layer_mask(rotate_gizmo_instance[i], layer);
scale_gizmo_instance[i] = RS::get_singleton()->instance_create();
RS::get_singleton()->instance_set_base(scale_gizmo_instance[i], spatial_editor->get_scale_gizmo(i)->get_rid());
- RS::get_singleton()->instance_set_scenario(scale_gizmo_instance[i], get_tree()->get_root()->get_world()->get_scenario());
+ RS::get_singleton()->instance_set_scenario(scale_gizmo_instance[i], get_tree()->get_root()->get_world_3d()->get_scenario());
RS::get_singleton()->instance_set_visible(scale_gizmo_instance[i], false);
RS::get_singleton()->instance_geometry_set_cast_shadows_setting(scale_gizmo_instance[i], RS::SHADOW_CASTING_SETTING_OFF);
RS::get_singleton()->instance_set_layer_mask(scale_gizmo_instance[i], layer);
scale_plane_gizmo_instance[i] = RS::get_singleton()->instance_create();
RS::get_singleton()->instance_set_base(scale_plane_gizmo_instance[i], spatial_editor->get_scale_plane_gizmo(i)->get_rid());
- RS::get_singleton()->instance_set_scenario(scale_plane_gizmo_instance[i], get_tree()->get_root()->get_world()->get_scenario());
+ RS::get_singleton()->instance_set_scenario(scale_plane_gizmo_instance[i], get_tree()->get_root()->get_world_3d()->get_scenario());
RS::get_singleton()->instance_set_visible(scale_plane_gizmo_instance[i], false);
RS::get_singleton()->instance_geometry_set_cast_shadows_setting(scale_plane_gizmo_instance[i], RS::SHADOW_CASTING_SETTING_OFF);
RS::get_singleton()->instance_set_layer_mask(scale_plane_gizmo_instance[i], layer);
@@ -3535,7 +3530,7 @@ Vector3 Node3DEditorViewport::_get_instance_position(const Point2 &p_pos) const
Vector3 world_ray = _get_ray(p_pos);
Vector3 world_pos = _get_ray_pos(p_pos);
- Vector<ObjectID> instances = RenderingServer::get_singleton()->instances_cull_ray(world_pos, world_ray, get_tree()->get_root()->get_world()->get_scenario());
+ Vector<ObjectID> instances = RenderingServer::get_singleton()->instances_cull_ray(world_pos, world_ray, get_tree()->get_root()->get_world_3d()->get_scenario());
Set<Ref<EditorNode3DGizmo>> found_gizmos;
float closest_dist = MAX_DISTANCE;
@@ -4548,7 +4543,7 @@ Object *Node3DEditor::_get_editor_data(Object *p_what) {
Node3DEditorSelectedItem *si = memnew(Node3DEditorSelectedItem);
si->sp = sp;
- si->sbox_instance = RenderingServer::get_singleton()->instance_create2(selection_box->get_rid(), sp->get_world()->get_scenario());
+ si->sbox_instance = RenderingServer::get_singleton()->instance_create2(selection_box->get_rid(), sp->get_world_3d()->get_scenario());
RS::get_singleton()->instance_geometry_set_cast_shadows_setting(si->sbox_instance, RS::SHADOW_CASTING_SETTING_OFF);
return si;
@@ -4570,10 +4565,10 @@ void Node3DEditor::_generate_selection_box() {
st->add_color(Color(1.0, 1.0, 0.8, 0.8));
st->add_vertex(a);
st->add_color(Color(1.0, 1.0, 0.8, 0.4));
- st->add_vertex(a.linear_interpolate(b, 0.2));
+ st->add_vertex(a.lerp(b, 0.2));
st->add_color(Color(1.0, 1.0, 0.8, 0.4));
- st->add_vertex(a.linear_interpolate(b, 0.8));
+ st->add_vertex(a.lerp(b, 0.8));
st->add_color(Color(1.0, 1.0, 0.8, 0.8));
st->add_vertex(b);
}
@@ -5202,7 +5197,7 @@ void Node3DEditor::_init_indicators() {
RenderingServer::get_singleton()->mesh_add_surface_from_arrays(origin, RenderingServer::PRIMITIVE_LINES, d);
RenderingServer::get_singleton()->mesh_surface_set_material(origin, 0, indicator_mat->get_rid());
- origin_instance = RenderingServer::get_singleton()->instance_create2(origin, get_tree()->get_root()->get_world()->get_scenario());
+ origin_instance = RenderingServer::get_singleton()->instance_create2(origin, get_tree()->get_root()->get_world_3d()->get_scenario());
RS::get_singleton()->instance_set_layer_mask(origin_instance, 1 << Node3DEditorViewport::GIZMO_GRID_LAYER);
RenderingServer::get_singleton()->instance_geometry_set_cast_shadows_setting(origin_instance, RS::SHADOW_CASTING_SETTING_OFF);
@@ -5577,7 +5572,7 @@ void Node3DEditor::_init_grid() {
d[RenderingServer::ARRAY_COLOR] = grid_colors[i];
RenderingServer::get_singleton()->mesh_add_surface_from_arrays(grid[i], RenderingServer::PRIMITIVE_LINES, d);
RenderingServer::get_singleton()->mesh_surface_set_material(grid[i], 0, indicator_mat->get_rid());
- grid_instance[i] = RenderingServer::get_singleton()->instance_create2(grid[i], get_tree()->get_root()->get_world()->get_scenario());
+ grid_instance[i] = RenderingServer::get_singleton()->instance_create2(grid[i], get_tree()->get_root()->get_world_3d()->get_scenario());
RenderingServer::get_singleton()->instance_set_visible(grid_instance[i], grid_visible[i]);
RenderingServer::get_singleton()->instance_geometry_set_cast_shadows_setting(grid_instance[i], RS::SHADOW_CASTING_SETTING_OFF);
@@ -5722,7 +5717,7 @@ void Node3DEditor::snap_selected_nodes_to_floor() {
}
}
- PhysicsDirectSpaceState3D *ss = get_tree()->get_root()->get_world()->get_direct_space_state();
+ PhysicsDirectSpaceState3D *ss = get_tree()->get_root()->get_world_3d()->get_direct_space_state();
PhysicsDirectSpaceState3D::RayResult result;
Array keys = snap_data.keys();
diff --git a/editor/plugins/script_editor_plugin.cpp b/editor/plugins/script_editor_plugin.cpp
index 80d97e7fa9..e6d3f17f12 100644
--- a/editor/plugins/script_editor_plugin.cpp
+++ b/editor/plugins/script_editor_plugin.cpp
@@ -1742,7 +1742,7 @@ void ScriptEditor::_update_script_colors() {
int non_zero_hist_size = (hist_size == 0) ? 1 : hist_size;
float v = Math::ease((edit_pass - pass) / float(non_zero_hist_size), 0.4);
- script_list->set_item_custom_fg_color(i, hot_color.linear_interpolate(cold_color, v));
+ script_list->set_item_custom_fg_color(i, hot_color.lerp(cold_color, v));
}
}
}
@@ -3190,7 +3190,7 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) {
file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/save_as", TTR("Save As...")), FILE_SAVE_AS);
file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/save_all", TTR("Save All"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_MASK_ALT | KEY_S), FILE_SAVE_ALL);
file_menu->get_popup()->add_separator();
- file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/reload_script_soft", TTR("Soft Reload Script"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_R), FILE_TOOL_RELOAD_SOFT);
+ file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/reload_script_soft", TTR("Soft Reload Script"), KEY_MASK_CMD | KEY_MASK_ALT | KEY_R), FILE_TOOL_RELOAD_SOFT);
file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/copy_path", TTR("Copy Script Path")), FILE_COPY_PATH);
file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/show_in_file_system", TTR("Show in FileSystem")), SHOW_IN_FILE_SYSTEM);
file_menu->get_popup()->add_separator();
diff --git a/editor/plugins/script_text_editor.cpp b/editor/plugins/script_text_editor.cpp
index 1a77eeb9de..c79c97737a 100644
--- a/editor/plugins/script_text_editor.cpp
+++ b/editor/plugins/script_text_editor.cpp
@@ -978,6 +978,26 @@ void ScriptTextEditor::_lookup_symbol(const String &p_symbol, int p_row, int p_c
emit_signal("go_to_help", "class_global:" + result.class_name + ":" + result.class_member);
} break;
}
+ } else if (ProjectSettings::get_singleton()->has_setting("autoload/" + p_symbol)) {
+ //check for Autoload scenes
+ String path = ProjectSettings::get_singleton()->get("autoload/" + p_symbol);
+ if (path.begins_with("*")) {
+ path = path.substr(1, path.length());
+ EditorNode::get_singleton()->load_scene(path);
+ }
+ } else if (p_symbol.is_rel_path()) {
+ // Every symbol other than absolute path is relative path so keep this condition at last.
+ String path = _get_absolute_path(p_symbol);
+ if (FileAccess::exists(path)) {
+ List<String> scene_extensions;
+ ResourceLoader::get_recognized_extensions_for_type("PackedScene", &scene_extensions);
+
+ if (scene_extensions.find(path.get_extension())) {
+ EditorNode::get_singleton()->load_scene(path);
+ } else {
+ EditorNode::get_singleton()->load_resource(path);
+ }
+ }
}
}
@@ -991,13 +1011,28 @@ void ScriptTextEditor::_validate_symbol(const String &p_symbol) {
}
ScriptLanguage::LookupResult result;
- if (ScriptServer::is_global_class(p_symbol) || p_symbol.is_resource_file() || script->get_language()->lookup_code(code_editor->get_text_edit()->get_text_for_lookup_completion(), p_symbol, script->get_path(), base, result) == OK) {
+ if (ScriptServer::is_global_class(p_symbol) || p_symbol.is_resource_file() || script->get_language()->lookup_code(code_editor->get_text_edit()->get_text_for_lookup_completion(), p_symbol, script->get_path(), base, result) == OK || ProjectSettings::get_singleton()->has_setting("autoload/" + p_symbol)) {
text_edit->set_highlighted_word(p_symbol);
+ } else if (p_symbol.is_rel_path()) {
+
+ String path = _get_absolute_path(p_symbol);
+ if (FileAccess::exists(path)) {
+ text_edit->set_highlighted_word(p_symbol);
+ } else {
+ text_edit->set_highlighted_word(String());
+ }
+
} else {
text_edit->set_highlighted_word(String());
}
}
+String ScriptTextEditor::_get_absolute_path(const String &rel_path) {
+ String base_path = script->get_path().get_base_dir();
+ String path = base_path.plus_file(rel_path);
+ return path.replace("///", "//").simplify_path();
+}
+
void ScriptTextEditor::update_toggle_scripts_button() {
if (code_editor != nullptr) {
code_editor->update_toggle_scripts_button();
diff --git a/editor/plugins/script_text_editor.h b/editor/plugins/script_text_editor.h
index 51ce30c831..a0dfba6cc8 100644
--- a/editor/plugins/script_text_editor.h
+++ b/editor/plugins/script_text_editor.h
@@ -188,6 +188,8 @@ protected:
bool can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const;
void drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from);
+ String _get_absolute_path(const String &rel_path);
+
public:
void _update_connected_methods();
diff --git a/editor/plugins/sprite_frames_editor_plugin.cpp b/editor/plugins/sprite_frames_editor_plugin.cpp
index 76e60bb014..34ff34d45b 100644
--- a/editor/plugins/sprite_frames_editor_plugin.cpp
+++ b/editor/plugins/sprite_frames_editor_plugin.cpp
@@ -154,14 +154,21 @@ void SpriteFramesEditor::_sheet_add_frames() {
int fc = frames->get_frame_count(edited_anim);
+ AtlasTexture *atlas_source = Object::cast_to<AtlasTexture>(*split_sheet_preview->get_texture());
+
+ Rect2 region_rect = Rect2();
+
+ if (atlas_source && atlas_source->get_atlas().is_valid())
+ region_rect = atlas_source->get_region();
+
for (Set<int>::Element *E = frames_selected.front(); E; E = E->next()) {
int idx = E->get();
int width = size.width / h;
int height = size.height / v;
int xp = idx % h;
int yp = (idx - xp) / h;
- int x = xp * width;
- int y = yp * height;
+ int x = (xp * width) + region_rect.position.x;
+ int y = (yp * height) + region_rect.position.y;
Ref<AtlasTexture> at;
at.instance();
diff --git a/editor/plugins/visual_shader_editor_plugin.cpp b/editor/plugins/visual_shader_editor_plugin.cpp
index a7e737fdd2..35ed29f562 100644
--- a/editor/plugins/visual_shader_editor_plugin.cpp
+++ b/editor/plugins/visual_shader_editor_plugin.cpp
@@ -546,6 +546,10 @@ void VisualShaderEditor::_update_graph() {
Ref<VisualShaderNodeUniform> uniform = vsnode;
Ref<VisualShaderNodeFloatUniform> float_uniform = vsnode;
Ref<VisualShaderNodeIntUniform> int_uniform = vsnode;
+ Ref<VisualShaderNodeVec3Uniform> vec3_uniform = vsnode;
+ Ref<VisualShaderNodeColorUniform> color_uniform = vsnode;
+ Ref<VisualShaderNodeBooleanUniform> bool_uniform = vsnode;
+ Ref<VisualShaderNodeTransformUniform> transform_uniform = vsnode;
if (uniform.is_valid()) {
graph->add_child(node);
_update_created_node(node);
@@ -571,7 +575,7 @@ void VisualShaderEditor::_update_graph() {
//shortcut
VisualShaderNode::PortType port_right = vsnode->get_output_port_type(0);
node->set_slot(0, false, VisualShaderNode::PORT_TYPE_SCALAR, Color(), true, port_right, type_color[port_right]);
- if (!float_uniform.is_valid() && !int_uniform.is_valid()) {
+ if (!float_uniform.is_valid() && !int_uniform.is_valid() && !vec3_uniform.is_valid() && !color_uniform.is_valid() && !bool_uniform.is_valid() && !transform_uniform.is_valid()) {
continue;
}
}
@@ -585,13 +589,16 @@ void VisualShaderEditor::_update_graph() {
}
}
- if (custom_editor && !float_uniform.is_valid() && !int_uniform.is_valid() && vsnode->get_output_port_count() > 0 && vsnode->get_output_port_name(0) == "" && (vsnode->get_input_port_count() == 0 || vsnode->get_input_port_name(0) == "")) {
+ if (custom_editor && !float_uniform.is_valid() && !int_uniform.is_valid() && !vec3_uniform.is_valid() && !bool_uniform.is_valid() && !transform_uniform.is_valid() && vsnode->get_output_port_count() > 0 && vsnode->get_output_port_name(0) == "" && (vsnode->get_input_port_count() == 0 || vsnode->get_input_port_name(0) == "")) {
//will be embedded in first port
} else if (custom_editor) {
port_offset++;
node->add_child(custom_editor);
- if (float_uniform.is_valid() || int_uniform.is_valid()) {
+ if (color_uniform.is_valid()) {
+ custom_editor->call_deferred("_show_prop_names", true);
+ }
+ if (float_uniform.is_valid() || int_uniform.is_valid() || vec3_uniform.is_valid() || bool_uniform.is_valid() || transform_uniform.is_valid()) {
custom_editor->call_deferred("_show_prop_names", true);
continue;
}
@@ -2650,7 +2657,7 @@ VisualShaderEditor::VisualShaderEditor() {
add_options.push_back(AddOption("Texture", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "texture"), "texture", VisualShaderNode::PORT_TYPE_SAMPLER, VisualShader::TYPE_FRAGMENT, Shader::MODE_CANVAS_ITEM));
add_options.push_back(AddOption("FragCoord", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "fragcoord"), "fragcoord", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_LIGHT, Shader::MODE_CANVAS_ITEM));
- add_options.push_back(AddOption("LightAlpha", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "light_alpha"), "light_alpha", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_LIGHT, Shader::MODE_CANVAS_ITEM));
+ add_options.push_back(AddOption("LightAlpha", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "light_alpha"), "light_alpha", VisualShaderNode::PORT_TYPE_SCALAR, VisualShader::TYPE_LIGHT, Shader::MODE_CANVAS_ITEM));
add_options.push_back(AddOption("LightColor", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "light_color"), "light_color", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_LIGHT, Shader::MODE_CANVAS_ITEM));
add_options.push_back(AddOption("LightHeight", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "light_height"), "light_height", VisualShaderNode::PORT_TYPE_SCALAR, VisualShader::TYPE_LIGHT, Shader::MODE_CANVAS_ITEM));
add_options.push_back(AddOption("LightUV", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "light_uv"), "light_uv", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_LIGHT, Shader::MODE_CANVAS_ITEM));
@@ -2658,7 +2665,9 @@ VisualShaderEditor::VisualShaderEditor() {
add_options.push_back(AddOption("Normal", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "normal"), "normal", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_LIGHT, Shader::MODE_CANVAS_ITEM));
add_options.push_back(AddOption("PointCoord", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "point_coord"), "point_coord", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_LIGHT, Shader::MODE_CANVAS_ITEM));
add_options.push_back(AddOption("ScreenUV", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "screen_uv"), "screen_uv", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_LIGHT, Shader::MODE_CANVAS_ITEM));
+ add_options.push_back(AddOption("ShadowAlpha", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "shadow_alpha"), "shadow_alpha", VisualShaderNode::PORT_TYPE_SCALAR, VisualShader::TYPE_LIGHT, Shader::MODE_CANVAS_ITEM));
add_options.push_back(AddOption("ShadowColor", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "shadow_color"), "shadow_color", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_LIGHT, Shader::MODE_CANVAS_ITEM));
+ add_options.push_back(AddOption("ShadowVec", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "shadow_vec"), "shadow_vec", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_LIGHT, Shader::MODE_CANVAS_ITEM));
add_options.push_back(AddOption("Texture", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "texture"), "texture", VisualShaderNode::PORT_TYPE_SAMPLER, VisualShader::TYPE_LIGHT, Shader::MODE_CANVAS_ITEM));
add_options.push_back(AddOption("Extra", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "extra"), "extra", VisualShaderNode::PORT_TYPE_TRANSFORM, VisualShader::TYPE_VERTEX, Shader::MODE_CANVAS_ITEM));
diff --git a/editor/rename_dialog.cpp b/editor/rename_dialog.cpp
index 0266ef6a2b..8ae8d0991d 100644
--- a/editor/rename_dialog.cpp
+++ b/editor/rename_dialog.cpp
@@ -403,7 +403,7 @@ void RenameDialog::_update_preview(String new_text) {
// New name is identical to the old one. Don't color it as much to avoid distracting the user.
const Color accent_color = EditorNode::get_singleton()->get_gui_base()->get_theme_color("accent_color", "Editor");
const Color text_color = EditorNode::get_singleton()->get_gui_base()->get_theme_color("default_color", "RichTextLabel");
- lbl_preview->add_theme_color_override("font_color", accent_color.linear_interpolate(text_color, 0.5));
+ lbl_preview->add_theme_color_override("font_color", accent_color.lerp(text_color, 0.5));
} else {
lbl_preview->add_theme_color_override("font_color", EditorNode::get_singleton()->get_gui_base()->get_theme_color("success_color", "Editor"));
}
diff --git a/editor/scene_tree_dock.cpp b/editor/scene_tree_dock.cpp
index 92f899a35d..a8aeb05150 100644
--- a/editor/scene_tree_dock.cpp
+++ b/editor/scene_tree_dock.cpp
@@ -553,11 +553,12 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
selection.sort_custom<Node::Comparator>();
- for (List<Node *>::Element *E = selection.back(); E; E = E->prev()) {
+ Node *add_below_node = selection.back()->get();
+
+ for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
Node *node = E->get();
Node *parent = node->get_parent();
- Node *selection_tail = _get_selection_group_tail(node, selection);
List<Node *> owned;
node->get_owned_by(node->get_owner(), &owned);
@@ -575,7 +576,7 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
dup->set_name(parent->validate_child_name(dup));
- editor_data->get_undo_redo().add_do_method(parent, "add_child_below_node", selection_tail, dup);
+ editor_data->get_undo_redo().add_do_method(parent, "add_child_below_node", add_below_node, dup);
for (List<Node *>::Element *F = owned.front(); F; F = F->next()) {
if (!duplimap.has(F->get())) {
@@ -583,7 +584,7 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
continue;
}
Node *d = duplimap[F->get()];
- editor_data->get_undo_redo().add_do_method(d, "set_owner", selection_tail->get_owner());
+ editor_data->get_undo_redo().add_do_method(d, "set_owner", node->get_owner());
}
editor_data->get_undo_redo().add_do_method(editor_selection, "add_node", dup);
editor_data->get_undo_redo().add_undo_method(parent, "remove_child", dup);
@@ -593,6 +594,8 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
editor_data->get_undo_redo().add_do_method(ed, "live_debug_duplicate_node", edited_scene->get_path_to(node), dup->get_name());
editor_data->get_undo_redo().add_undo_method(ed, "live_debug_remove_node", NodePath(String(edited_scene->get_path_to(parent)).plus_file(dup->get_name())));
+
+ add_below_node = dup;
}
editor_data->get_undo_redo().commit_action();
@@ -600,7 +603,7 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
if (dupsingle)
editor->push_item(dupsingle);
- for (List<Node *>::Element *E = editable_children.front(); E; E = E->next())
+ for (List<Node *>::Element *E = editable_children.back(); E; E = E->prev())
_toggle_editable_children(E->get());
} break;
diff --git a/editor/translations/ar.po b/editor/translations/ar.po
index 6181580a68..22358973a0 100644
--- a/editor/translations/ar.po
+++ b/editor/translations/ar.po
@@ -7,7 +7,7 @@
# Basil Al-Khateeb <basil.y.alkhateeb@gmail.com>, 2017.
# Jamal Alyafei <jamal.qassim@gmail.com>, 2017.
# john lennon <khoanantonio@outlook.com>, 2017.
-# Mohammmad Khashashneh <mohammad.rasmi@gmail.com>, 2016.
+# Mohammmad Khashashneh <mohammad.rasmi@gmail.com>, 2016, 2020.
# Mr ChaosXD <mrchaosxd3@gmail.com>, 2018.
# Mrwan Ashraf <mrwan.ashraf94@gmail.com>, 2017.
# noureldin sharaf <sharaf.noureldin@yahoo.com>, 2017.
@@ -35,12 +35,14 @@
# hshw <shw@tutanota.com>, 2020.
# Youssef Harmal <the.coder.crab@gmail.com>, 2020.
# Nabeel20 <nabeelandnizam@gmail.com>, 2020.
+# merouche djallal <kbordora@gmail.com>, 2020.
+# Airbus5717 <Abdussamadf350@gmail.com>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2020-04-27 08:24+0000\n"
-"Last-Translator: Nabeel20 <nabeelandnizam@gmail.com>\n"
+"PO-Revision-Date: 2020-05-05 14:01+0000\n"
+"Last-Translator: Anonymous <noreply@weblate.org>\n"
"Language-Team: Arabic <https://hosted.weblate.org/projects/godot-engine/"
"godot/ar/>\n"
"Language: ar\n"
@@ -49,12 +51,12 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
-"X-Generator: Weblate 4.0.2-dev\n"
+"X-Generator: Weblate 4.1-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Invalid type argument to convert(), use TYPE_* constants."
-msgstr "نوع معامل خاطئ للدالة convert()، إستخدم ثوابت TYPE_*."
+msgstr "معامل type خاطئ لدالة Convert, استخدم احدى الثوابت من مجموعة TYPE_*."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
msgid "Expected a string of length 1 (a character)."
@@ -344,7 +346,7 @@ msgstr "التÙا٠الحلقة المثبتة"
#: editor/animation_track_editor.cpp
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key"
-msgstr "أدخل Ù…Ùتاح"
+msgstr "أدخل المÙتاح"
#: editor/animation_track_editor.cpp
msgid "Duplicate Key(s)"
@@ -594,11 +596,11 @@ msgstr "إحد٠المحدد (المجموعة المختارة)"
#: editor/animation_track_editor.cpp
msgid "Go to Next Step"
-msgstr "إذهب إلي الخطوة التالية"
+msgstr "إذهب إلى الخطوة التالية"
#: editor/animation_track_editor.cpp
msgid "Go to Previous Step"
-msgstr "إذهب إلي الخطوة السابقة"
+msgstr "إذهب إلى الخطوة السابقة"
#: editor/animation_track_editor.cpp
msgid "Optimize Animation"
@@ -671,7 +673,7 @@ msgstr "إختر المقاطع المراد نسخها"
#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Copy"
-msgstr "أنسخ"
+msgstr "نسخ"
#: editor/animation_track_editor.cpp
msgid "Select All/None"
@@ -754,13 +756,13 @@ msgstr "تحديد التبويب البرمجي"
#: editor/plugins/texture_region_editor_plugin.cpp
#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
-msgstr "تقريب"
+msgstr "تكبير"
#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/texture_region_editor_plugin.cpp
#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
-msgstr "إبعاد"
+msgstr "تصغير"
#: editor/code_editor.cpp
msgid "Reset Zoom"
@@ -869,7 +871,7 @@ msgstr "إشارة غير قادر على الاتصال"
#: editor/run_settings_dialog.cpp editor/settings_config_dialog.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Close"
-msgstr "اغلاق"
+msgstr "إغلاق"
#: editor/connections_dialog.cpp
msgid "Connect"
@@ -1100,7 +1102,7 @@ msgstr "متصÙØ­ الموارد أورÙان"
#: editor/plugins/sprite_frames_editor_plugin.cpp editor/project_export.cpp
#: editor/project_settings_editor.cpp editor/scene_tree_dock.cpp
msgid "Delete"
-msgstr "مسح"
+msgstr "حذÙ"
#: editor/dependency_editor.cpp
msgid "Owns"
@@ -1716,9 +1718,8 @@ msgid "Current Profile:"
msgstr "المل٠(النسخة) الحالية:"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Make Current"
-msgstr "الحالي:"
+msgstr "إجعل الحالي"
#: editor/editor_feature_profile.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
@@ -1838,15 +1839,15 @@ msgstr "Ø­Ùظ ملÙ"
#: editor/editor_file_dialog.cpp
msgid "Go Back"
-msgstr "إرجع للخلÙ"
+msgstr "الرجوع للخلÙ"
#: editor/editor_file_dialog.cpp
msgid "Go Forward"
-msgstr "إذهب للأمام"
+msgstr "الذهاب للأمام"
#: editor/editor_file_dialog.cpp
msgid "Go Up"
-msgstr "إذهب للأعلي"
+msgstr "إذهب للأعلى"
#: editor/editor_file_dialog.cpp
msgid "Toggle Hidden Files"
@@ -1866,51 +1867,43 @@ msgstr "مسار التركيز"
#: editor/editor_file_dialog.cpp
msgid "Move Favorite Up"
-msgstr "حرك المÙÙضلة للأعلي"
+msgstr "حرك المÙÙضلة للأعلى"
#: editor/editor_file_dialog.cpp
msgid "Move Favorite Down"
msgstr "حرك المÙÙضلة للأسÙÙ„"
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to previous folder."
-msgstr "إذهب إلي المجلد السابق"
+msgstr "إرجع إلي المجلد السابق."
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to next folder."
-msgstr "إذهب إلي المجلد السابق"
+msgstr "إذهب إلي المجلد التالي."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Go to parent folder."
-msgstr "إذهب إلي المجلد السابق"
+msgstr "إذهب إلي مجلد الأصل."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Refresh files."
-msgstr "إبحث ÙÙŠ الأصناÙ"
+msgstr "حَدّÙØ« الملÙات."
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "(Un)favorite current folder."
-msgstr "لا يمكن إنشاء المجلد."
+msgstr "إضاÙØ© المجلد إلى المÙضلة / إخراجه من المÙضلة."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Toggle the visibility of hidden files."
-msgstr "أظهر الملÙات المخÙية"
+msgstr "إظهار/إخÙاء الملÙات المخÙية."
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-#, fuzzy
msgid "View items as a grid of thumbnails."
-msgstr "أظهر العناصر كشبكة من الصور المصغرة"
+msgstr "أظهر العناصر كشبكة من الصور المصغرة."
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-#, fuzzy
msgid "View items as a list."
-msgstr "أظهر العناصر كقائمة"
+msgstr "أظهر العناصر كقائمة."
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Directories & Files:"
@@ -1963,12 +1956,11 @@ msgstr "مورث بواسطة:"
#: editor/editor_help.cpp
msgid "Description"
-msgstr "الوصÙ:"
+msgstr "الوصÙ"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Online Tutorials"
-msgstr "الدورس علي الإنترنت:"
+msgstr "التعليمات على الإنترنت"
#: editor/editor_help.cpp
msgid "Properties"
@@ -1979,9 +1971,8 @@ msgid "override:"
msgstr "يتجاوز:"
#: editor/editor_help.cpp
-#, fuzzy
msgid "default:"
-msgstr "الإÙتراضي"
+msgstr "الاÙتراضي:"
#: editor/editor_help.cpp
msgid "Methods"
@@ -2000,14 +1991,12 @@ msgid "Constants"
msgstr "الثوابت"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Property Descriptions"
-msgstr "وص٠الملكية:"
+msgstr "أوصا٠المÙلكية"
#: editor/editor_help.cpp
-#, fuzzy
msgid "(value)"
-msgstr "القيمة:"
+msgstr "(القيمة)"
#: editor/editor_help.cpp
msgid ""
@@ -2018,9 +2007,8 @@ msgstr ""
"المساهمة واحد [color=$color][url=$url]!"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Method Descriptions"
-msgstr "وص٠الطريقة:"
+msgstr "أوصا٠الدوال Method"
#: editor/editor_help.cpp
msgid ""
@@ -2033,16 +2021,15 @@ msgstr ""
#: editor/editor_help_search.cpp editor/editor_node.cpp
#: editor/plugins/script_editor_plugin.cpp
msgid "Search Help"
-msgstr "إبحث ÙÙŠ المساعدة"
+msgstr "ابحث ÙÙŠ المساعدة"
#: editor/editor_help_search.cpp
msgid "Case Sensitive"
msgstr "حساسة لحالة الأحرÙ"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Show Hierarchy"
-msgstr "أظهر المساعدات"
+msgstr "اظهر التراتبية"
#: editor/editor_help_search.cpp
msgid "Display All"
@@ -2069,9 +2056,8 @@ msgid "Properties Only"
msgstr "خصائص Ùقط"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Theme Properties Only"
-msgstr "خصائص"
+msgstr "خصائص الموضوع Theme Ùقط"
#: editor/editor_help_search.cpp
msgid "Member Type"
@@ -2079,35 +2065,31 @@ msgstr "نوع العضو"
#: editor/editor_help_search.cpp
msgid "Class"
-msgstr "الصنÙ"
+msgstr "الصÙ"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Method"
-msgstr "قائمة الطرق"
+msgstr "دالة"
#: editor/editor_help_search.cpp editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Signal"
-msgstr "إشارات"
+msgstr "الإشاراة"
#: editor/editor_help_search.cpp editor/plugins/theme_editor_plugin.cpp
msgid "Constant"
msgstr "ثابت"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Property"
-msgstr "خصيصة:"
+msgstr "خاصية"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Theme Property"
-msgstr "خصائص الثمة"
+msgstr "خاصية الموضوع Theme"
#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
msgid "Property:"
-msgstr "خصيصة:"
+msgstr "خاصية:"
#: editor/editor_inspector.cpp
msgid "Set"
@@ -2119,12 +2101,11 @@ msgstr "تحديد التكرار:"
#: editor/editor_log.cpp
msgid "Output:"
-msgstr "الخرج:"
+msgstr "المÙخرجات:"
#: editor/editor_log.cpp editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Copy Selection"
-msgstr "حذ٠المÙحدد"
+msgstr "نسخ المÙحدد"
#: editor/editor_log.cpp editor/editor_network_profiler.cpp
#: editor/editor_profiler.cpp editor/editor_properties.cpp
@@ -2134,11 +2115,11 @@ msgstr "حذ٠المÙحدد"
#: modules/gdnative/gdnative_library_editor_plugin.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
msgid "Clear"
-msgstr "خالي"
+msgstr "مسح"
#: editor/editor_log.cpp
msgid "Clear Output"
-msgstr "أخلاء الخرج"
+msgstr "مسح المÙخرجات"
#: editor/editor_network_profiler.cpp editor/editor_node.cpp
#: editor/editor_profiler.cpp
@@ -2147,23 +2128,20 @@ msgstr "إيقاÙ"
#: editor/editor_network_profiler.cpp editor/editor_profiler.cpp
#: editor/plugins/animation_state_machine_editor.cpp editor/rename_dialog.cpp
-#, fuzzy
msgid "Start"
-msgstr "بدء!"
+msgstr "بدء"
#: editor/editor_network_profiler.cpp
-#, fuzzy
msgid "%s/s"
msgstr "%s/s"
#: editor/editor_network_profiler.cpp
-#, fuzzy
msgid "Down"
-msgstr "تنزيل"
+msgstr "أسÙÙ„"
#: editor/editor_network_profiler.cpp
msgid "Up"
-msgstr "Ùوق"
+msgstr "أعلى"
#: editor/editor_network_profiler.cpp editor/editor_node.cpp
msgid "Node"
@@ -2260,7 +2238,7 @@ msgstr "ينشئ الصورة المصغرة"
#: editor/editor_node.cpp
msgid "This operation can't be done without a tree root."
-msgstr "هذه العملية لا يمكنها الإكتمال من غير شجرة رئيسة."
+msgstr "هذه العملية لا يمكنها الإكتمال من غير جذر شجرة ."
#: editor/editor_node.cpp
msgid ""
@@ -2323,7 +2301,6 @@ msgstr ""
"هذا النظام."
#: editor/editor_node.cpp
-#, fuzzy
msgid ""
"This resource belongs to a scene that was instanced or inherited.\n"
"Changes to it won't be kept when saving the current scene."
@@ -2340,7 +2317,6 @@ msgstr ""
"الإستيراد ومن ثم أعد إستيراده."
#: editor/editor_node.cpp
-#, fuzzy
msgid ""
"This scene was imported, so changes to it won't be kept.\n"
"Instancing it or inheriting will allow making changes to it.\n"
@@ -2353,13 +2329,12 @@ msgstr ""
"هذا النظام."
#: editor/editor_node.cpp
-#, fuzzy
msgid ""
"This is a remote object, so changes to it won't be kept.\n"
"Please read the documentation relevant to debugging to better understand "
"this workflow."
msgstr ""
-"هذا المصدر ينتمي إلي مشهد قد تم إستيراده، إذا لا يمكن تعديله.\n"
+"هذا المصدر ينتمي إلي مشهد قد تم إستيراده، التعديلات لن تحÙظ.\n"
"من Ùضلك إقرأ التوثيق المرتبط بإستيراد المشاهد لكي تÙهم بشكل Ø£Ùضل كيÙية عمل "
"هذا النظام."
@@ -2384,9 +2359,8 @@ msgid "Open Base Scene"
msgstr "Ùتح مشهد أساسي"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Quick Open..."
-msgstr "Ùتح سريع للمشهد..."
+msgstr "Ùتح سريع ..."
#: editor/editor_node.cpp
msgid "Quick Open Scene..."
@@ -2405,9 +2379,8 @@ msgid "Save changes to '%s' before closing?"
msgstr "هل تريد Ø­Ùظ التغييرات إلي'%s' قبل الإغلاق؟"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Saved %s modified resource(s)."
-msgstr "Ùشل تحميل المورد."
+msgstr "Ø­Ùظت %s الموارد المعدلة."
#: editor/editor_node.cpp
msgid "A root node is required to save the scene."
@@ -2471,7 +2444,7 @@ msgstr "تشغيل مشهد بسرعة..."
#: editor/editor_node.cpp
msgid "Quit"
-msgstr "خروج"
+msgstr "إنهاء"
#: editor/editor_node.cpp
msgid "Exit the editor?"
@@ -2512,9 +2485,8 @@ msgid "Close Scene"
msgstr "اغلاق المشهد"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Reopen Closed Scene"
-msgstr "اغلاق المشهد"
+msgstr "إعادة Ùتح المشهد"
#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
@@ -2530,19 +2502,19 @@ 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 ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
"غير قادر علي تحميل كود الإضاÙØ© من المسار: '%s' النوع الأساسي ليس إضاÙØ© "
-"للمÙعدل."
+"المÙعدل."
#: editor/editor_node.cpp
msgid "Unable to load addon script from path: '%s' Script is not in tool mode."
@@ -2615,24 +2587,20 @@ 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 "أظهر ÙÙŠ مدير الملÙات"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Play This Scene"
msgstr "تشغيل المشهد"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Close Tab"
-msgstr "اغلاق"
+msgstr "اغلاق التبويب"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Undo Close Tab"
-msgstr "اغلاق"
+msgstr "تراجع عن ‭‬إغلاق التبويب"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
@@ -2643,9 +2611,8 @@ msgid "Close Tabs to the Right"
msgstr "أغلق التبويبات على اليمين"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Close All Tabs"
-msgstr "اغلاق"
+msgstr "اغلاق جميع نواÙØ° التبويب"
#: editor/editor_node.cpp
msgid "Switch Scene Tab"
@@ -2688,9 +2655,8 @@ msgid "Go to previously opened scene."
msgstr "اذهب الي المشهد المÙتوح مسبقا."
#: editor/editor_node.cpp
-#, fuzzy
msgid "Copy Text"
-msgstr "نسخ المسار"
+msgstr "نسخ النص"
#: editor/editor_node.cpp
msgid "Next tab"
@@ -2729,7 +2695,6 @@ msgid "Save Scene"
msgstr "Ø­Ùظ المشهد"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Save All Scenes"
msgstr "Ø­Ùظ جميع المشاهد"
@@ -2753,7 +2718,7 @@ msgstr "تراجع"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
-msgstr "إعادة"
+msgstr "إعادة تراجع"
#: editor/editor_node.cpp
msgid "Revert Scene"
@@ -2769,14 +2734,12 @@ msgid "Project"
msgstr "مشروع"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Project Settings..."
-msgstr "إعدادات المشروع"
+msgstr "إعدادات المشروع..."
#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp
-#, fuzzy
msgid "Version Control"
-msgstr "النسخة:"
+msgstr "التحكم ÙÙŠ الإصدار"
#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp
msgid "Set Up Version Control"
@@ -2787,31 +2750,28 @@ msgid "Shut Down Version Control"
msgstr "إطÙاء التحكم بالنسخة Version Control"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Export..."
-msgstr "تصدير"
+msgstr "تصدير..."
#: editor/editor_node.cpp
msgid "Install Android Build Template..."
msgstr "تحميل قالب البناء للأندرويد..."
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Project Data Folder"
-msgstr "Ùتح مدير المشروع؟"
+msgstr "Ùتح مجلد بيانات المشروع"
#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr "ادوات"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Orphan Resource Explorer..."
-msgstr "متصÙØ­ الموارد أورÙان"
+msgstr "متصÙØ­ الموارد أورÙان..."
#: editor/editor_node.cpp
msgid "Quit to Project List"
-msgstr "غادر الي قائمه المشاريع"
+msgstr "غادر إلى قائمه المشاريع"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
#: editor/project_export.cpp
@@ -2908,56 +2868,48 @@ msgid "Editor"
msgstr "المÙعدل"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Editor Settings..."
-msgstr "إعدادات المÙعدل"
+msgstr "إعدادات المحرّر"
#: editor/editor_node.cpp
msgid "Editor Layout"
msgstr "نسق المÙعدل"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Take Screenshot"
-msgstr "Ø­Ùظ المشهد"
+msgstr "أخذ صورة للشاشة"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Screenshots are stored in the Editor Data/Settings Folder."
-msgstr "إعدادات المÙعدل"
+msgstr "لقطات الشاشة تكون محÙوظة ÙÙŠ مجلّد البيانات/الإعدادت داخل المحرّر"
#: editor/editor_node.cpp
msgid "Toggle Fullscreen"
msgstr "إلغاء/تÙعيل وضع الشاشة الكاملة"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Toggle System Console"
-msgstr "أظهر المود"
+msgstr "إظهار/إخÙاء وحدة التحكم بالنظام"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Editor Data/Settings Folder"
-msgstr "إعدادات المÙعدل"
+msgstr "Ùتح مجلّد البيانات/الإعدادت المحرّر"
#: editor/editor_node.cpp
msgid "Open Editor Data Folder"
msgstr "اÙتح مل٠بيانات المحرر"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Editor Settings Folder"
-msgstr "إعدادات المÙعدل"
+msgstr "Ùتح مجلّد إعدادات المحرّر"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Manage Editor Features..."
-msgstr "إدارة قوالب التصدير"
+msgstr "إدارة ميّزات المحرّر"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Manage Export Templates..."
-msgstr "إدارة قوالب التصدير"
+msgstr "إدارة قوالب التصدير..."
#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp
msgid "Help"
@@ -2982,9 +2934,8 @@ msgid "Q&A"
msgstr "الأسئلة و الأجوبة"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Report a Bug"
-msgstr "إعادة إستيراد"
+msgstr "إرسال تقرير عن bug أو خلل ÙÙŠ شيء ما"
#: editor/editor_node.cpp
msgid "Send Docs Feedback"
@@ -3040,24 +2991,20 @@ msgstr "تعديل معرّ٠الÙيديو video driver يتطلب إعادة
#: editor/editor_node.cpp editor/project_settings_editor.cpp
#: editor/settings_config_dialog.cpp
-#, fuzzy
msgid "Save & Restart"
-msgstr "Ø­Ùظ Ùˆ خروج"
+msgstr "Ø­Ùظ Ùˆ إعادة تشغيل"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Spins when the editor window redraws."
-msgstr "يدور حينما ناÙذة المÙعدل يتم إعادة دهانة!"
+msgstr "يدور حينما يتم إعادة رسم ناÙذة المحرّر"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Update Continuously"
-msgstr "متواصل"
+msgstr "تحديث متواصل"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Update When Changed"
-msgstr "تحديث التغييرات"
+msgstr "تحديث عند التغيير"
#: editor/editor_node.cpp
#, fuzzy
@@ -3073,9 +3020,8 @@ msgid "Inspector"
msgstr "Ù…Ùراقب"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Expand Bottom Panel"
-msgstr "توسيع الكل"
+msgstr "توسيع التبويب السÙلي"
#: editor/editor_node.cpp
msgid "Output"
@@ -3090,9 +3036,8 @@ msgid "Android build template is missing, please install relevant templates."
msgstr "قالب البناء الخاص بالأندرويد Ù…Ùقود، من Ùضلك نزل قوالب ذات صلة."
#: editor/editor_node.cpp
-#, fuzzy
msgid "Manage Templates"
-msgstr "إدارة قوالب التصدير"
+msgstr "إدارة القوالب"
#: editor/editor_node.cpp
msgid ""
@@ -3128,9 +3073,8 @@ msgid "Import Templates From ZIP File"
msgstr "إستيراد القوالب من مل٠مضغوط بصيغة Zip"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Template Package"
-msgstr "‌تصدير مدير القوالب"
+msgstr "رزمة القوالب"
#: editor/editor_node.cpp
msgid "Export Library"
@@ -3181,12 +3125,10 @@ msgid "Open the previous Editor"
msgstr "Ø¥Ùتح المÙعدل السابق"
#: editor/editor_node.h
-#, fuzzy
msgid "Warning!"
-msgstr "تحذيرات"
+msgstr "تحذيرات!"
#: editor/editor_path.cpp
-#, fuzzy
msgid "No sub-resources found."
msgstr "لا مصدر للسطح تم تحديده."
@@ -3199,14 +3141,12 @@ msgid "Thumbnail..."
msgstr "الصورة المصغرة..."
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Main Script:"
-msgstr "Ùتح الكود"
+msgstr "النص البرمجي الأصلي :"
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Edit Plugin"
-msgstr "تعديل البولي"
+msgstr "تعديل الإضاÙØ©"
#: editor/editor_plugin_settings.cpp
msgid "Installed Plugins:"
@@ -3230,9 +3170,8 @@ msgid "Status:"
msgstr "الحالة:"
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Edit:"
-msgstr "المÙعدل"
+msgstr "تحرير:"
#: editor/editor_profiler.cpp
msgid "Measure:"
@@ -5709,7 +5648,7 @@ msgstr "نص٠المÙحدد"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Frame Selection"
-msgstr "إملئ الشاشة بالمحدد"
+msgstr "تحديد الإطار"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Preview Canvas Scale"
@@ -6144,6 +6083,10 @@ msgid ""
"This can be used instead of the SpatialMaterial Grow property when using "
"that property isn't possible."
msgstr ""
+"ÙŠÙنشى سطحاً مخططاً outline mesh سكونياً. هذا السطح تكون قيمه الطبيعية مقلوبة "
+"بصورة تلقائية.\n"
+"يمكن أن يستخدم بدلاً من خاصية التمدد (Grow ) لمادة الحيز المكاني "
+"SpatialMaterial عندما يكون استخدام هذه الخاصية غير مقدور عليه."
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
@@ -6865,7 +6808,7 @@ msgstr "%s مرجعية الص٠Class"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
msgid "Find Next"
-msgstr "ابحث عن التالي"
+msgstr "إيجاد التالي"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -6898,7 +6841,7 @@ msgstr "تحريك لأعلى"
#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Move Down"
-msgstr "تحرك لأسÙÙ„"
+msgstr "تحريك لأسÙÙ„"
#: editor/plugins/script_editor_plugin.cpp
msgid "Next script"
@@ -6922,7 +6865,7 @@ msgstr "إعادة Ùتح النص البرمجي المÙغلق"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
-msgstr "احÙظ الكل"
+msgstr "إحÙظ الكل"
#: editor/plugins/script_editor_plugin.cpp
msgid "Soft Reload Script"
@@ -6934,11 +6877,11 @@ msgstr "نسخ مسار النص البرمجي"
#: editor/plugins/script_editor_plugin.cpp
msgid "History Previous"
-msgstr "التأريخ السابق"
+msgstr "التاريخ السابق"
#: editor/plugins/script_editor_plugin.cpp
msgid "History Next"
-msgstr "التأريخ التالي"
+msgstr "التاريخ التالي"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp
@@ -6971,11 +6914,11 @@ msgstr "تشغيل"
#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
msgid "Step Into"
-msgstr "خطوة ضمن"
+msgstr "اخط خطوة ضمن"
#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
msgid "Step Over"
-msgstr "خطوة متجاوزة"
+msgstr "اخط خطوة متجاوزة"
#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
msgid "Break"
@@ -7473,7 +7416,7 @@ msgstr "عرض المÙخطط Wireframe"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Display Overdraw"
-msgstr ""
+msgstr "عرض تراكبات الرسم Overdraw"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Display Unshaded"
@@ -7651,27 +7594,27 @@ msgstr "ناÙذة التحويلات ..."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "1 Viewport"
-msgstr "إطار عرض واحد 1"
+msgstr "ساحة رؤية واحدة"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "2 Viewports"
-msgstr "إطاري عرض"
+msgstr "ساحتان للرؤية"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "2 Viewports (Alt)"
-msgstr "إطاري عرض (Alt)"
+msgstr "ساحتان للرؤية (Alt)"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "3 Viewports"
-msgstr "3 إطارات عرض"
+msgstr "3 ساحات للرؤية"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "3 Viewports (Alt)"
-msgstr "3 إطارات عرض (Alt)"
+msgstr "3 ساحات للرؤية (Alt)"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "4 Viewports"
-msgstr "4 إطارات عرض"
+msgstr "4 ساحات للرؤية"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Gizmos"
@@ -8283,7 +8226,7 @@ msgstr "القلب Ø£Ùقياً"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Flip Vertically"
-msgstr "القلب شاقولياً"
+msgstr "القلب عموديًا"
#: editor/plugins/tile_map_editor_plugin.cpp
#, fuzzy
@@ -8322,7 +8265,7 @@ msgstr "أطلس جديد"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Next Coordinate"
-msgstr "الإحداثات التالية"
+msgstr "الإحداثيات التالية"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Select the next shape, subtile, or Tile."
@@ -8704,11 +8647,11 @@ msgstr "إظهار آخر تعديلات المل٠قبل قبولهم ÙÙŠ Ø¢Ø
#: editor/plugins/version_control_editor_plugin.cpp
msgid "No file diff is active"
-msgstr ""
+msgstr "لا مل٠Ùروق نشط"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Detect changes in file diff"
-msgstr ""
+msgstr "الكش٠عن التغييرات ÙÙŠ مل٠الÙروق"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "(GLES3 only)"
@@ -8861,7 +8804,7 @@ msgstr "Ù…Ùشغل الÙارق."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Dodge operator."
-msgstr ""
+msgstr "Ù…Ùشغل التملص Dodge."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "HardLight operator."
@@ -9438,7 +9381,7 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Divides vector by vector."
-msgstr ""
+msgstr "ÙŠÙقسّم المÙتجه (الشعاع) على المÙتجه."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Multiplies vector by vector."
@@ -9863,10 +9806,10 @@ msgid ""
"Incompatible with older hardware\n"
"Not recommended for web games"
msgstr ""
-"قيمة بصرية أعلى\n"
-"جميع المزايا متواÙرة\n"
-"غير متواÙÙ‚ مع العتاد القديم\n"
-"ليس نصحية بالنسبة لألعاب الويب"
+"جودة بصرية أعلى\n"
+"جميع الميزات المتاحة\n"
+"غير متواÙÙ‚ مع الأجهزة القديمة\n"
+"لا ينصح به لألعاب الويب"
#: editor/project_manager.cpp
msgid "OpenGL ES 2.0"
@@ -9879,15 +9822,14 @@ msgid ""
"Works on most hardware\n"
"Recommended for web games"
msgstr ""
-"قيمة بصرية أقل\n"
-"بعض المزايا غير متواÙرة \n"
-"يعمل على أغلب العتاد\n"
-"نصيحة لألعاب الويب"
+"جودة بصرية أقل\n"
+"بعض الميزات غير متوÙرة \n"
+"يعمل على معظم الأجهزة\n"
+"يوصى به لألعاب الويب"
#: editor/project_manager.cpp
msgid "Renderer can be changed later, but scenes may need to be adjusted."
-msgstr ""
-"Ù…Ùحرك الإخراج البصري يمكن تغييره لاحقاً، ولكن قد تحتاج إلى تعديل المشاهد."
+msgstr "يمكن تعديل جهاز العرض لاحقاً، ولكن قد تحتاج المشاهد إلى تعديل."
#: editor/project_manager.cpp
msgid "Unnamed Project"
@@ -9899,7 +9841,7 @@ msgstr "مشروع Ù…Ùقود"
#: editor/project_manager.cpp
msgid "Error: Project is missing on the filesystem."
-msgstr "خطأ: المشروع Ù…Ùقود ÙÙŠ ملÙات النظام."
+msgstr "خطأ: المشروع Ù…Ùقود ÙÙŠ نظام الملÙات."
#: editor/project_manager.cpp
msgid "Can't open project at '%s'."
@@ -10168,11 +10110,11 @@ msgstr ""
#: editor/project_settings_editor.cpp
msgid "Erase Input Action Event"
-msgstr ""
+msgstr "مسح حدث إجراء الإضاÙØ©"
#: editor/project_settings_editor.cpp
msgid "Add Event"
-msgstr ""
+msgstr "إضاÙØ© حَدث"
#: editor/project_settings_editor.cpp
msgid "Button"
@@ -10180,61 +10122,63 @@ msgstr "زر"
#: editor/project_settings_editor.cpp
msgid "Left Button."
-msgstr ""
+msgstr "الزر الأيسر."
#: editor/project_settings_editor.cpp
msgid "Right Button."
-msgstr ""
+msgstr "الزر الأيمن."
#: editor/project_settings_editor.cpp
msgid "Middle Button."
-msgstr ""
+msgstr "الزر الأوسط."
#: editor/project_settings_editor.cpp
msgid "Wheel Up."
-msgstr ""
+msgstr "العجلة نحو الأقصى."
#: editor/project_settings_editor.cpp
msgid "Wheel Down."
-msgstr ""
+msgstr "العجلة نحو الأدنى."
#: editor/project_settings_editor.cpp
msgid "Add Global Property"
-msgstr ""
+msgstr "إضاÙØ© خاصية شمولية"
#: editor/project_settings_editor.cpp
msgid "Select a setting item first!"
-msgstr ""
+msgstr "اختر عنصر إعدادات بدايةً!"
#: editor/project_settings_editor.cpp
msgid "No property '%s' exists."
-msgstr ""
+msgstr "لا خاصية '%s' موجودة."
#: editor/project_settings_editor.cpp
msgid "Setting '%s' is internal, and it can't be deleted."
-msgstr ""
+msgstr "الإعداد '%s' ضمني، ولا يمكن حذÙÙ‡."
#: editor/project_settings_editor.cpp
msgid "Delete Item"
-msgstr ""
+msgstr "حذ٠العÙنصر"
#: editor/project_settings_editor.cpp
msgid ""
"Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or "
"'\"'."
msgstr ""
+"اسم إجراء غير صالح. لا يجوز أن يكون الاسم Ùارغاً أو متضمناً '/'ØŒ ':'ØŒ'='ØŒ '\\' "
+"أو'\"'."
#: editor/project_settings_editor.cpp
msgid "Add Input Action"
-msgstr ""
+msgstr "إضاÙØ© إجراء إدخال"
#: editor/project_settings_editor.cpp
msgid "Error saving settings."
-msgstr ""
+msgstr "خطأ ÙÙŠ Ø­Ùظ الإعدادات."
#: editor/project_settings_editor.cpp
msgid "Settings saved OK."
-msgstr ""
+msgstr "تيسّر Ø­Ùظ الإعدادات."
#: editor/project_settings_editor.cpp
#, fuzzy
@@ -10243,19 +10187,19 @@ msgstr "حرك النقطة داخل المنحنى"
#: editor/project_settings_editor.cpp
msgid "Override for Feature"
-msgstr ""
+msgstr "التجاوز للميزة"
#: editor/project_settings_editor.cpp
msgid "Add Translation"
-msgstr ""
+msgstr "إضاÙØ© ترجمة"
#: editor/project_settings_editor.cpp
msgid "Remove Translation"
-msgstr ""
+msgstr "إزالة الترجمة"
#: editor/project_settings_editor.cpp
msgid "Add Remapped Path"
-msgstr ""
+msgstr "إضاÙØ© مسار Ù…Ùعاد تعيينه Remapped"
#: editor/project_settings_editor.cpp
msgid "Resource Remap Add Remap"
@@ -10275,7 +10219,7 @@ msgstr ""
#: editor/project_settings_editor.cpp
msgid "Changed Locale Filter"
-msgstr ""
+msgstr "Ù…Ùرشح محلي Ù…Ùعدّل"
#: editor/project_settings_editor.cpp
msgid "Changed Locale Filter Mode"
@@ -10283,7 +10227,7 @@ msgstr ""
#: editor/project_settings_editor.cpp
msgid "Project Settings (project.godot)"
-msgstr ""
+msgstr "إعدادات المشروع (project.godot)"
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "General"
@@ -10291,47 +10235,47 @@ msgstr "بشكل عام"
#: editor/project_settings_editor.cpp
msgid "Override For..."
-msgstr ""
+msgstr "تجاوز لأجل..."
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "The editor must be restarted for changes to take effect."
-msgstr ""
+msgstr "لكي يظهر تأثير التغييرات ينبغي إعادة تشغيل المÙحرر."
#: editor/project_settings_editor.cpp
msgid "Input Map"
-msgstr ""
+msgstr "خريطة الإدخال"
#: editor/project_settings_editor.cpp
msgid "Action:"
-msgstr ""
+msgstr "إجراء:"
#: editor/project_settings_editor.cpp
msgid "Action"
-msgstr "الÙعل"
+msgstr "إجراء"
#: editor/project_settings_editor.cpp
msgid "Deadzone"
-msgstr ""
+msgstr "الحيز الميّت"
#: editor/project_settings_editor.cpp
msgid "Device:"
-msgstr ""
+msgstr "الجهاز:"
#: editor/project_settings_editor.cpp
msgid "Index:"
-msgstr ""
+msgstr "الÙهرس:"
#: editor/project_settings_editor.cpp
msgid "Localization"
-msgstr ""
+msgstr "توطين"
#: editor/project_settings_editor.cpp
msgid "Translations"
-msgstr ""
+msgstr "الترجمات"
#: editor/project_settings_editor.cpp
msgid "Translations:"
-msgstr ""
+msgstr "الترجمات:"
#: editor/project_settings_editor.cpp
msgid "Remaps"
@@ -10339,41 +10283,39 @@ msgstr ""
#: editor/project_settings_editor.cpp
msgid "Resources:"
-msgstr ""
+msgstr "الموارد:"
#: editor/project_settings_editor.cpp
msgid "Remaps by Locale:"
-msgstr ""
+msgstr "إعادة تعيين الخرائط محلياً:"
#: editor/project_settings_editor.cpp
msgid "Locale"
-msgstr ""
+msgstr "محلي"
#: editor/project_settings_editor.cpp
msgid "Locales Filter"
-msgstr ""
+msgstr "Ù…Ùرشح المحليّات Locales"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Show All Locales"
-msgstr "إظهار العظام"
+msgstr "إظهار جميع المَحليّات Locales"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Show Selected Locales Only"
-msgstr "المحدد Ùقط"
+msgstr "إظهار المَحليّات المÙختارة Ùحسب"
#: editor/project_settings_editor.cpp
msgid "Filter mode:"
-msgstr "وضع المÙصÙÙŠ:"
+msgstr "وضع المÙرشح:"
#: editor/project_settings_editor.cpp
msgid "Locales:"
-msgstr ""
+msgstr "مَحليّات:"
#: editor/project_settings_editor.cpp
msgid "AutoLoad"
-msgstr ""
+msgstr "تحميل تلقائي"
#: editor/project_settings_editor.cpp
msgid "Plugins"
@@ -10385,19 +10327,19 @@ msgstr "إعداد Ù…Ùسبق..."
#: editor/property_editor.cpp
msgid "Zero"
-msgstr ""
+msgstr "صÙر"
#: editor/property_editor.cpp
msgid "Easing In-Out"
-msgstr ""
+msgstr "تسارع بعد بداية بطيئة"
#: editor/property_editor.cpp
msgid "Easing Out-In"
-msgstr ""
+msgstr "تباطؤ بعد بداية سريعة"
#: editor/property_editor.cpp
msgid "File..."
-msgstr ""
+msgstr "ملÙ..."
#: editor/property_editor.cpp
msgid "Dir..."
@@ -10405,31 +10347,31 @@ msgstr ""
#: editor/property_editor.cpp
msgid "Assign"
-msgstr ""
+msgstr "ألحق"
#: editor/property_editor.cpp
msgid "Select Node"
-msgstr ""
+msgstr "اختر عÙقدة"
#: editor/property_editor.cpp
msgid "Error loading file: Not a resource!"
-msgstr ""
+msgstr "خطأ ÙÙŠ تحميل الملÙ: ليس مورداً!"
#: editor/property_editor.cpp
msgid "Pick a Node"
-msgstr ""
+msgstr "اختر عÙقدة"
#: editor/property_editor.cpp
msgid "Bit %d, val %d."
-msgstr ""
+msgstr "Bit %d، قيمة%d."
#: editor/property_selector.cpp
msgid "Select Property"
-msgstr ""
+msgstr "انتقاء الخاصية"
#: editor/property_selector.cpp
msgid "Select Virtual Method"
-msgstr "إختر طريقة Ø¥Ùتراضية"
+msgstr "اختر الطريقة الإÙتراضية"
#: editor/property_selector.cpp
msgid "Select Method"
@@ -10442,24 +10384,23 @@ msgstr "إعادة التسمية"
#: editor/rename_dialog.cpp
msgid "Prefix"
-msgstr ""
+msgstr "بادئة"
#: editor/rename_dialog.cpp
msgid "Suffix"
-msgstr ""
+msgstr "لاحقة"
#: editor/rename_dialog.cpp
msgid "Use Regular Expressions"
msgstr "استخدام التعبيرات الاعتيادية Regular Expressions"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Advanced Options"
-msgstr "إعدادات الكبس"
+msgstr "إعدادات Ù…Ùتقدمة"
#: editor/rename_dialog.cpp
msgid "Substitute"
-msgstr ""
+msgstr "استبدال"
#: editor/rename_dialog.cpp
#, fuzzy
@@ -10468,40 +10409,39 @@ msgstr "إسم العقدة:"
#: editor/rename_dialog.cpp
msgid "Node's parent name, if available"
-msgstr ""
+msgstr "اسم العÙقدة الأب، إن تواÙر"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Node type"
-msgstr "إسم العقدة:"
+msgstr "نوع العÙقدة"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Current scene name"
-msgstr "لم يتم Ø­Ùظ المشهد الحالي. Ø¥Ùتحه علي أية حال؟"
+msgstr "اسم المشهد الحالي"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Root node name"
-msgstr "إعادة التسمية"
+msgstr "اسم العÙقدة الرئيسة (الجذر)"
#: editor/rename_dialog.cpp
msgid ""
"Sequential integer counter.\n"
"Compare counter options."
msgstr ""
+"عداد الأعداد الصحيحة التسلسلية.\n"
+"يقارن إعدادات العداد."
#: editor/rename_dialog.cpp
msgid "Per-level Counter"
-msgstr ""
+msgstr "العداد ÙˆÙÙ‚-المستوى"
#: editor/rename_dialog.cpp
msgid "If set the counter restarts for each group of child nodes"
-msgstr ""
+msgstr "إذا تم تحديده Ùإن العداد سيعيد البدء لكل مجموعة من العÙقد الأبناء"
#: editor/rename_dialog.cpp
msgid "Initial value for the counter"
-msgstr ""
+msgstr "القيمة المبدئية للعداد"
#: editor/rename_dialog.cpp
#, fuzzy
@@ -10510,7 +10450,7 @@ msgstr "خطوة (ثانية):"
#: editor/rename_dialog.cpp
msgid "Amount by which counter is incremented for each node"
-msgstr ""
+msgstr "مقدار الزيادة للعداد لكل عÙقدة"
#: editor/rename_dialog.cpp
msgid "Padding"
@@ -10524,31 +10464,31 @@ msgstr ""
#: editor/rename_dialog.cpp
msgid "Post-Process"
-msgstr ""
+msgstr "المعالجة-اللاحقة Post-Process"
#: editor/rename_dialog.cpp
msgid "Keep"
-msgstr ""
+msgstr "احتÙظ"
#: editor/rename_dialog.cpp
msgid "PascalCase to snake_case"
-msgstr ""
+msgstr "حالة أحر٠PascalCase إلى snake_case"
#: editor/rename_dialog.cpp
msgid "snake_case to PascalCase"
-msgstr ""
+msgstr "حالة أحر٠snake_case إلى PascalCase"
#: editor/rename_dialog.cpp
msgid "Case"
-msgstr ""
+msgstr "حالة"
#: editor/rename_dialog.cpp
msgid "To Lowercase"
-msgstr ""
+msgstr "لأحر٠صغيرة Lowercase"
#: editor/rename_dialog.cpp
msgid "To Uppercase"
-msgstr ""
+msgstr "لأحر٠كبيرة Uppercase"
#: editor/rename_dialog.cpp
#, fuzzy
@@ -10557,7 +10497,7 @@ msgstr "إرجاع التكبير"
#: editor/rename_dialog.cpp
msgid "Regular Expression Error"
-msgstr ""
+msgstr "خطأ ذو علاقة بالتعبير الاعتيادي Regular Expression"
#: editor/rename_dialog.cpp
msgid "At character %s"
@@ -10565,65 +10505,65 @@ msgstr "عند الحر٠%s"
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
-msgstr ""
+msgstr "إعادة اختيار أبوة العÙقدة"
#: editor/reparent_dialog.cpp
msgid "Reparent Location (Select new Parent):"
-msgstr ""
+msgstr "إعادة اختيار أبوة المكان (اختر أب جديد):"
#: editor/reparent_dialog.cpp
msgid "Keep Global Transform"
-msgstr ""
+msgstr "الاحتÙاظ بالتحوّل الشمولي Global"
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent"
-msgstr ""
+msgstr "إعادة اختيار الأبوة"
#: editor/run_settings_dialog.cpp
msgid "Run Mode:"
-msgstr ""
+msgstr "وضع التشغيل:"
#: editor/run_settings_dialog.cpp
msgid "Current Scene"
-msgstr ""
+msgstr "المشهد الحالي"
#: editor/run_settings_dialog.cpp
msgid "Main Scene"
-msgstr ""
+msgstr "المشهد الرئيس"
#: editor/run_settings_dialog.cpp
msgid "Main Scene Arguments:"
-msgstr ""
+msgstr "معاملات المشهد الرئيس:"
#: editor/run_settings_dialog.cpp
msgid "Scene Run Settings"
-msgstr ""
+msgstr "إعدادت تشغيل المشهد"
#: editor/scene_tree_dock.cpp
msgid "No parent to instance the scenes at."
-msgstr ""
+msgstr "لا أب لنمذجة المشاهد عنده."
#: editor/scene_tree_dock.cpp
msgid "Error loading scene from %s"
-msgstr ""
+msgstr "خطأ ÙÙŠ تحميل المشهد من %s"
#: editor/scene_tree_dock.cpp
msgid ""
"Cannot instance the scene '%s' because the current scene exists within one "
"of its nodes."
-msgstr ""
+msgstr "لا يمكن نمذجة المشهد '%s' لأن المشهد الحالي Ù…Ùتضَمن ÙÙŠ واحد من عÙقده."
#: editor/scene_tree_dock.cpp
msgid "Instance Scene(s)"
-msgstr ""
+msgstr "نمذجة المشهد(المشاهد)"
#: editor/scene_tree_dock.cpp
msgid "Replace with Branch Scene"
-msgstr ""
+msgstr "استبدال بمشهد Ùرعي"
#: editor/scene_tree_dock.cpp
msgid "Instance Child Scene"
-msgstr ""
+msgstr "نمذجة المشهد الابن"
#: editor/scene_tree_dock.cpp
msgid "Clear Script"
@@ -10631,31 +10571,33 @@ msgstr "إخلاء الكود"
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on the tree root."
-msgstr ""
+msgstr "لا يمكن إجراء هذه العملية على جذر الشجرة."
#: editor/scene_tree_dock.cpp
msgid "Move Node In Parent"
-msgstr ""
+msgstr "نقل العÙقدة عند الأب"
#: editor/scene_tree_dock.cpp
msgid "Move Nodes In Parent"
-msgstr ""
+msgstr "تحريك العÙقد عند الأب"
#: editor/scene_tree_dock.cpp
msgid "Duplicate Node(s)"
-msgstr ""
+msgstr "مضاعÙØ© العÙقدة(العÙقد)"
#: editor/scene_tree_dock.cpp
msgid "Can't reparent nodes in inherited scenes, order of nodes can't change."
msgstr ""
+"لا يمكن إعادة اختيار أبوة العÙقدة ÙÙŠ المشاهد الموروثة، لا يمكن تغيير ترتيب "
+"العÙقد."
#: editor/scene_tree_dock.cpp
msgid "Node must belong to the edited scene to become root."
-msgstr ""
+msgstr "لكي تصبح هذه العÙقدة رئيسة (جذر) عليها أن تنتمي إلى المشهد المÙحرر."
#: editor/scene_tree_dock.cpp
msgid "Instantiated scenes can't become root"
-msgstr ""
+msgstr "لا يمكن أن تصبح المشاهد المنمذجة مشاهد رئيسة (جذر)"
#: editor/scene_tree_dock.cpp
#, fuzzy
@@ -10669,11 +10611,11 @@ msgstr "إنشاء عقدة"
#: editor/scene_tree_dock.cpp
msgid "Delete the root node \"%s\"?"
-msgstr ""
+msgstr "حذ٠العÙقدة الرئيسة (الجذر) \"%s\"ØŸ"
#: editor/scene_tree_dock.cpp
msgid "Delete node \"%s\" and its children?"
-msgstr ""
+msgstr "حذ٠العÙقدة \"%s\" مع جميع أبنائها؟"
#: editor/scene_tree_dock.cpp
#, fuzzy
@@ -10682,56 +10624,56 @@ msgstr "إنشاء عقدة"
#: editor/scene_tree_dock.cpp
msgid "Can not perform with the root node."
-msgstr ""
+msgstr "لا يمكن التنÙيذ مع العÙقدة الرئيسة (الجذر)."
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on instanced scenes."
-msgstr ""
+msgstr "لا يمكن تنÙيذ هذا الإجراء على المشاهد المÙنمذجة."
#: editor/scene_tree_dock.cpp
msgid "Save New Scene As..."
-msgstr ""
+msgstr "احÙظ المشهد الجديد كـ..."
#: editor/scene_tree_dock.cpp
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 ""
"Enabling \"Load As Placeholder\" will disable \"Editable Children\" and "
"cause all properties of the node to be reverted to their default."
msgstr ""
+"سيسبب تمكين \"التحميل كعنصر نائب\" \"Load As Placeholder\" تعطيل \"ابن قابل "
+"للتحرير\" \"Editable Children\" والذي ينجم عنه عودة قيم جميع العÙقد إلى قيمها "
+"الاÙتراضية."
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Make Local"
-msgstr "أنشئ عظام"
+msgstr "اجعله محلياً"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "New Scene Root"
-msgstr "Ø­Ùظ المشهد"
+msgstr "مشهد رئيس (جذر) جديد"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Create Root Node:"
-msgstr "إنشاء عقدة"
+msgstr "إنشاء العÙقدة الرئيسة (الجذر):"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "2D Scene"
-msgstr "مشهد"
+msgstr "مشهد ثنائي البÙعد"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "3D Scene"
-msgstr "مشهد"
+msgstr "مشهد ثلاثي الأبعاد"
#: editor/scene_tree_dock.cpp
msgid "User Interface"
-msgstr ""
+msgstr "واجهة المستخدم"
#: editor/scene_tree_dock.cpp
#, fuzzy
@@ -10740,37 +10682,37 @@ msgstr "إنشاء عقدة"
#: editor/scene_tree_dock.cpp
msgid "Can't operate on nodes from a foreign scene!"
-msgstr ""
+msgstr "لا يمكن تنÙيذ الإجراء على عÙقدة من مشهد أجنبي!"
#: editor/scene_tree_dock.cpp
msgid "Can't operate on nodes the current scene inherits from!"
-msgstr ""
+msgstr "لا يمكن تنÙيذ الإجراء على عÙقد يرثها المشهد الحالي!"
#: editor/scene_tree_dock.cpp
msgid "Attach Script"
-msgstr ""
+msgstr "إلحاق نص برمجي"
#: editor/scene_tree_dock.cpp
msgid "Remove Node(s)"
-msgstr ""
+msgstr "إزالة عÙقدة (عÙقد)"
#: editor/scene_tree_dock.cpp
msgid "Change type of node(s)"
-msgstr ""
+msgstr "تغيير نوع العÙقدة(العÙقد)"
#: editor/scene_tree_dock.cpp
msgid ""
"Couldn't save new scene. Likely dependencies (instances) couldn't be "
"satisfied."
-msgstr ""
+msgstr "لم ينجح Ø­Ùظ المشهد الجديد. غالباً لا يمكن إشباع التبعات (النماذج)."
#: editor/scene_tree_dock.cpp
msgid "Error saving scene."
-msgstr ""
+msgstr "خطأ ÙÙŠ Ø­Ùظ المشهد."
#: editor/scene_tree_dock.cpp
msgid "Error duplicating scene to save it."
-msgstr ""
+msgstr "خطأ ÙÙŠ مضاعÙØ© المشهد لحÙظه."
#: editor/scene_tree_dock.cpp
msgid "Sub-Resources"
@@ -10778,15 +10720,15 @@ msgstr "مورد Ùرعي"
#: editor/scene_tree_dock.cpp
msgid "Clear Inheritance"
-msgstr ""
+msgstr "مسح الميراث"
#: editor/scene_tree_dock.cpp
msgid "Editable Children"
-msgstr ""
+msgstr "أبناء قابلين للتعديل"
#: editor/scene_tree_dock.cpp
msgid "Load As Placeholder"
-msgstr ""
+msgstr "تحميله كعنصر نائب"
#: editor/scene_tree_dock.cpp
#, fuzzy
@@ -10795,7 +10737,7 @@ msgstr "ÙÙتح مؤخراً"
#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
-msgstr ""
+msgstr "إضاÙØ© عÙقدة ابن"
#: editor/scene_tree_dock.cpp
#, fuzzy
@@ -10804,7 +10746,7 @@ msgstr "طوي الكل"
#: editor/scene_tree_dock.cpp
msgid "Change Type"
-msgstr ""
+msgstr "تغيير النوع"
#: editor/scene_tree_dock.cpp
#, fuzzy
@@ -10818,19 +10760,19 @@ msgstr "Ø­Ùظ المشهد"
#: editor/scene_tree_dock.cpp
msgid "Merge From Scene"
-msgstr ""
+msgstr "دمج من المشهد"
#: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp
msgid "Save Branch as Scene"
-msgstr ""
+msgstr "Ø­Ùظ الÙرع كمشهد"
#: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp
msgid "Copy Node Path"
-msgstr ""
+msgstr "نسخ مسار العÙقدة"
#: editor/scene_tree_dock.cpp
msgid "Delete (No Confirm)"
-msgstr ""
+msgstr "حذ٠(دون تأكيد)"
#: editor/scene_tree_dock.cpp
#, fuzzy
@@ -10842,14 +10784,16 @@ msgid ""
"Instance a scene file as a Node. Creates an inherited scene if no root node "
"exists."
msgstr ""
+"نمذجة مل٠المشهد كعÙقدة. إن لم يكن هناك عÙقدة رئيسة (جذر) سيتم إنشاء مشهد "
+"موروث."
#: editor/scene_tree_dock.cpp
msgid "Attach a new or existing script for the selected node."
-msgstr ""
+msgstr "إلحاق نص برمجي موجود أو جديد للعÙقدة المختارة."
#: editor/scene_tree_dock.cpp
msgid "Clear a script for the selected node."
-msgstr ""
+msgstr "مسح النص البرمجي للعÙقدة المختارة."
#: editor/scene_tree_dock.cpp
msgid "Remote"
@@ -10857,11 +10801,11 @@ msgstr "عن بعد"
#: editor/scene_tree_dock.cpp
msgid "Local"
-msgstr ""
+msgstr "محلي"
#: editor/scene_tree_dock.cpp
msgid "Clear Inheritance? (No Undo!)"
-msgstr ""
+msgstr "مسح الموروث؟ (لا تراجع!)"
#: editor/scene_tree_editor.cpp
#, fuzzy
@@ -11235,11 +11179,11 @@ msgstr ""
#: editor/script_editor_debugger.cpp
msgid "Set From Tree"
-msgstr ""
+msgstr "التحديد من الشجرة"
#: editor/script_editor_debugger.cpp
msgid "Export measures as CSV"
-msgstr ""
+msgstr "تصدير القياسات ك CSV"
#: editor/settings_config_dialog.cpp
#, fuzzy
@@ -11248,7 +11192,7 @@ msgstr "تخÙي٠للخارج"
#: editor/settings_config_dialog.cpp
msgid "Restore Shortcut"
-msgstr ""
+msgstr "إعادة تعيين الاختصارات"
#: editor/settings_config_dialog.cpp
#, fuzzy
@@ -11261,15 +11205,15 @@ msgstr "إعدادات المÙعدل"
#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
-msgstr ""
+msgstr "الاختصارات"
#: editor/settings_config_dialog.cpp
msgid "Binding"
-msgstr ""
+msgstr "الربط"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Light Radius"
-msgstr ""
+msgstr "تغيير نص٠قطر الإنارة"
#: editor/spatial_editor_gizmos.cpp
msgid "Change AudioStreamPlayer3D Emission Angle"
@@ -11555,9 +11499,8 @@ msgid "Clear Selection"
msgstr "إخلاء المحدد"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Fill Selection"
-msgstr "ÙƒÙÙ„ المÙحدد"
+msgstr "تعبئة المÙحدد"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "GridMap Settings"
diff --git a/editor/translations/bn.po b/editor/translations/bn.po
index 3f5c140428..aaa46da54d 100644
--- a/editor/translations/bn.po
+++ b/editor/translations/bn.po
@@ -7,12 +7,13 @@
# Tahmid Karim <tahmidk15@gmail.com>, 2016.
# Tawhid H. <Tawhidk757@yahoo.com>, 2019.
# Hasibul Hasan <hasibeng78@gmail.com>, 2019.
+# Oymate <dhruboadittya96@gmail.com>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2019-12-13 09:38+0000\n"
-"Last-Translator: Hasibul Hasan <hasibeng78@gmail.com>\n"
+"PO-Revision-Date: 2020-05-04 15:11+0000\n"
+"Last-Translator: Anonymous <noreply@weblate.org>\n"
"Language-Team: Bengali <https://hosted.weblate.org/projects/godot-engine/"
"godot/bn/>\n"
"Language: bn\n"
@@ -20,7 +21,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.10-dev\n"
+"X-Generator: Weblate 4.1-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -29,7 +30,7 @@ msgstr "অবৈধ পà§à¦°à¦•à¦¾à¦° রূপানà§à¦¤à¦° করার à¦
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
msgid "Expected a string of length 1 (a character)."
-msgstr ""
+msgstr "১ (à¦à¦•à¦Ÿà¦¿ অকà§à¦·à¦°) দৈরà§à¦˜à§à¦¯ à¦à¦° সà§à¦Ÿà§à¦°à¦¿à¦‚ পà§à¦°à¦¤à§à¦¯à¦¾à¦¶à¦¿à¦¤à¥¤"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/mono/glue/gd_glue.cpp
diff --git a/editor/translations/de.po b/editor/translations/de.po
index 86e7d09671..c3b2d6ee58 100644
--- a/editor/translations/de.po
+++ b/editor/translations/de.po
@@ -53,8 +53,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2020-04-20 05:51+0000\n"
-"Last-Translator: anonymous <noreply@weblate.org>\n"
+"PO-Revision-Date: 2020-05-04 15:11+0000\n"
+"Last-Translator: Anonymous <noreply@weblate.org>\n"
"Language-Team: German <https://hosted.weblate.org/projects/godot-engine/"
"godot/de/>\n"
"Language: de\n"
@@ -62,7 +62,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.0.2-dev\n"
+"X-Generator: Weblate 4.1-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -3001,7 +3001,7 @@ msgstr "Dokumentationsvorschläge senden"
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
msgid "Community"
-msgstr "Community"
+msgstr "Gemeinschaft"
#: editor/editor_node.cpp
msgid "About"
@@ -10002,6 +10002,10 @@ msgid ""
"To filter projects by name and full path, the query must contain at least "
"one `/` character."
msgstr ""
+"Die Suchmaske filtert Projekte nach ihrem Namen oder der letzten Komponente "
+"ihres Pfadnamens.\n"
+"Um den Filter auf den gesamten Pfadnamen anzuwenden muss mindestens ein ‚/‘-"
+"Zeichen in der Suchanfrage vorhanden sein."
#: editor/project_settings_editor.cpp
msgid "Key "
@@ -11123,9 +11127,8 @@ msgid "Total:"
msgstr "Insgesamt:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Export list to a CSV file"
-msgstr "Profil exportieren"
+msgstr "Liste als CSV-Datei exportieren"
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
diff --git a/editor/translations/eo.po b/editor/translations/eo.po
index dc10209d18..d75cb88920 100644
--- a/editor/translations/eo.po
+++ b/editor/translations/eo.po
@@ -7,18 +7,19 @@
# Teashrock <kajitsu22@gmail.com>, 2019.
# Brandon Dyer <brandondyer64@gmail.com>, 2019.
# Alejandro Sánchez Medina <alejandrosanchzmedina@gmail.com>, 2019.
+# Sr Half <flavio05@outlook.com>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2019-11-11 14:19+0000\n"
-"Last-Translator: Alejandro Sánchez Medina <alejandrosanchzmedina@gmail.com>\n"
+"PO-Revision-Date: 2020-05-01 11:43+0000\n"
+"Last-Translator: Sr Half <flavio05@outlook.com>\n"
"Language-Team: Esperanto <https://hosted.weblate.org/projects/godot-engine/"
"godot/eo/>\n"
"Language: eo\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.10-dev\n"
+"X-Generator: Weblate 4.0.2\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -27,7 +28,7 @@ msgstr "Nevalida tip-argumento por funkcio convert(). Uzu konstantojn TYPE_*."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
msgid "Expected a string of length 1 (a character)."
-msgstr ""
+msgstr "Atendas ĉenon de longo 1 (unu karaktero)."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/mono/glue/gd_glue.cpp
@@ -65,31 +66,31 @@ msgstr "En voko al '%s':"
#: core/ustring.cpp
msgid "B"
-msgstr ""
+msgstr "B"
#: core/ustring.cpp
msgid "KiB"
-msgstr ""
+msgstr "Kib"
#: core/ustring.cpp
msgid "MiB"
-msgstr ""
+msgstr "MiB"
#: core/ustring.cpp
msgid "GiB"
-msgstr ""
+msgstr "Gib"
#: core/ustring.cpp
msgid "TiB"
-msgstr ""
+msgstr "TiB"
#: core/ustring.cpp
msgid "PiB"
-msgstr ""
+msgstr "PiB"
#: core/ustring.cpp
msgid "EiB"
-msgstr ""
+msgstr "EiB"
#: editor/animation_bezier_editor.cpp
msgid "Free"
@@ -422,7 +423,7 @@ msgstr "Äœi ne estas ebla adici novan vojeton sen radiko"
#: editor/animation_track_editor.cpp
msgid "Invalid track for Bezier (no suitable sub-properties)"
-msgstr ""
+msgstr "Nevalida trako por Bezier (neniu taŭga subproprietaĵoj)"
#: editor/animation_track_editor.cpp
msgid "Add Bezier Track"
@@ -12285,7 +12286,7 @@ msgstr ""
#: servers/visual/shader_language.cpp
msgid "Constants cannot be modified."
-msgstr ""
+msgstr "Konstantoj ne povas esti modifitaj."
#, fuzzy
#~ msgid "Help improve the Godot documentation by giving feedback."
diff --git a/editor/translations/es.po b/editor/translations/es.po
index 933cff80a4..8446ed2415 100644
--- a/editor/translations/es.po
+++ b/editor/translations/es.po
@@ -45,11 +45,12 @@
# Julián Luini <jluini@gmail.com>, 2020.
# Victor S. <victorstancioiu@gmail.com>, 2020.
# henry rujano herrera <rujhen@gmail.com>, 2020.
+# Megamega53 <Christopher.Morales21@myhunter.cuny.edu>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2020-04-23 20:21+0000\n"
+"PO-Revision-Date: 2020-05-04 15:11+0000\n"
"Last-Translator: Javier Ocampos <xavier.ocampos@gmail.com>\n"
"Language-Team: Spanish <https://hosted.weblate.org/projects/godot-engine/"
"godot/es/>\n"
@@ -58,7 +59,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.0.2-dev\n"
+"X-Generator: Weblate 4.1-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -617,11 +618,11 @@ msgstr "Eliminar Selección"
#: editor/animation_track_editor.cpp
msgid "Go to Next Step"
-msgstr "Ir al Paso Siguiente"
+msgstr "Ir al Siguiente Paso"
#: editor/animation_track_editor.cpp
msgid "Go to Previous Step"
-msgstr "Ir al Paso Anterior"
+msgstr "Ir al Anterior Paso"
#: editor/animation_track_editor.cpp
msgid "Optimize Animation"
@@ -2043,7 +2044,7 @@ msgstr ""
#: editor/editor_help.cpp
msgid "Method Descriptions"
-msgstr "Descripción de Métodos"
+msgstr "Descripciones de Métodos"
#: editor/editor_help.cpp
msgid ""
@@ -2691,7 +2692,7 @@ msgstr "Posición del Dock"
#: editor/editor_node.cpp
msgid "Distraction Free Mode"
-msgstr "Modo sin distracciones"
+msgstr "Modo Sin Distracciones"
#: editor/editor_node.cpp
msgid "Toggle distraction-free mode."
@@ -2715,11 +2716,11 @@ msgstr "Copiar Texto"
#: editor/editor_node.cpp
msgid "Next tab"
-msgstr "Pestaña siguiente"
+msgstr "Siguiente pestaña"
#: editor/editor_node.cpp
msgid "Previous tab"
-msgstr "Pestaña anterior"
+msgstr "Anterior pestaña"
#: editor/editor_node.cpp
msgid "Filter Files..."
@@ -5428,7 +5429,7 @@ msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Reset"
-msgstr "Resetear el Zoom"
+msgstr "Resetear Zoom"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5456,17 +5457,17 @@ msgstr "Alt + Clic Derecho: Selección en listado de solapamientos"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode"
-msgstr "Modo Movimiento"
+msgstr "Modo de Movimiento"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
-msgstr "Modo Rotación"
+msgstr "Modo de Rotación"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale Mode"
-msgstr "Modo Escalado"
+msgstr "Modo de Escalado"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5488,7 +5489,7 @@ msgstr "Modo desplazamiento lateral"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Ruler Mode"
-msgstr "Modo Regla"
+msgstr "Modo de Regla"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Toggle smart snapping."
@@ -5679,7 +5680,7 @@ msgstr "Clave de animación y Opciones de Pose"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key (Existing Tracks)"
-msgstr "Insertar clave (pistas existentes)"
+msgstr "Insertar Clave (Pistas Existentes)"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Copy Pose"
@@ -6035,7 +6036,7 @@ msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Single Convex Collision Sibling"
-msgstr "Crear Colisión Convexa Única Hermana"
+msgstr "Crear Collider Convexo Único Hermano"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid ""
@@ -6047,7 +6048,7 @@ msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Multiple Convex Collision Siblings"
-msgstr "Crear Múltiples Colisiones Convexas Hermanas"
+msgstr "Crear Múltiples Collider Convexos Hermanos"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid ""
@@ -6855,7 +6856,7 @@ msgstr "Guardar Todo"
#: editor/plugins/script_editor_plugin.cpp
msgid "Soft Reload Script"
-msgstr "Recargar parcialmente el script"
+msgstr "Recargar Parcialmente el Script"
#: editor/plugins/script_editor_plugin.cpp
msgid "Copy Script Path"
@@ -6863,7 +6864,7 @@ msgstr "Copiar Ruta del Script"
#: editor/plugins/script_editor_plugin.cpp
msgid "History Previous"
-msgstr "Previo en Historial"
+msgstr "Previo en el Historial"
#: editor/plugins/script_editor_plugin.cpp
msgid "History Next"
@@ -6900,11 +6901,11 @@ msgstr "Ejecutar"
#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
msgid "Step Into"
-msgstr "Step Into"
+msgstr "Entrar En"
#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
msgid "Step Over"
-msgstr "Step Over"
+msgstr "Salir de Aquí"
#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
msgid "Break"
@@ -7112,15 +7113,15 @@ msgstr "Eliminar Espacios Sobrantes al Final"
#: editor/plugins/script_text_editor.cpp
msgid "Convert Indent to Spaces"
-msgstr "Convertir Indentación en Espacios"
+msgstr "Convertir Sangría en Espacios"
#: editor/plugins/script_text_editor.cpp
msgid "Convert Indent to Tabs"
-msgstr "Convertir Indentación en Tabulaciones"
+msgstr "Convertir Sangría en Tabulaciones"
#: editor/plugins/script_text_editor.cpp
msgid "Auto Indent"
-msgstr "Autoindentar"
+msgstr "Auto Sangría"
#: editor/plugins/script_text_editor.cpp
msgid "Find in Files..."
@@ -7140,7 +7141,7 @@ msgstr "Ir al Siguiente Marcador"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Previous Bookmark"
-msgstr "Ir al Marcador Anterior"
+msgstr "Ir al Anterior Marcador"
#: editor/plugins/script_text_editor.cpp
msgid "Remove All Bookmarks"
@@ -7157,19 +7158,19 @@ msgstr "Ir a Línea..."
#: editor/plugins/script_text_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Toggle Breakpoint"
-msgstr "Act./Desact. Breakpoint"
+msgstr "Cambiar Punto de Ruptura"
#: editor/plugins/script_text_editor.cpp
msgid "Remove All Breakpoints"
-msgstr "Eliminar Todos los Breakpoints"
+msgstr "Eliminar Todos los Puntos de Ruptura"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Next Breakpoint"
-msgstr "Ir al Siguiente Breakpoint"
+msgstr "Ir al Siguiente Punto de Ruptura"
#: editor/plugins/script_text_editor.cpp
msgid "Go to Previous Breakpoint"
-msgstr "Ir al Breakpoint Anterior"
+msgstr "Ir al Anterior Punto de Ruptura"
#: editor/plugins/shader_editor_plugin.cpp
msgid ""
@@ -7349,11 +7350,11 @@ msgstr "Detrás"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Align Transform with View"
-msgstr "Alinear Transform con Vista"
+msgstr "Alinear la Transformación con la Vista"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Align Rotation with View"
-msgstr "Alinear Rotación con Vista"
+msgstr "Alinear la Rotación con la Vista"
#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "No parent to instance a child at."
@@ -7437,7 +7438,7 @@ msgstr "Vista Libre Frontal"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Backwards"
-msgstr "Vista Libre Posterior"
+msgstr "Vista Libre Trasera"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Up"
@@ -7507,7 +7508,7 @@ msgstr "Vista Superior"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rear View"
-msgstr "Vista Posterior"
+msgstr "Vista Trasera"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Front View"
@@ -8125,7 +8126,7 @@ msgstr "Asignar un recurso TileSet a este TileMap para usas sus tiles."
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint Tile"
-msgstr "Dibujar tile"
+msgstr "Dibujar Tile"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
@@ -8233,35 +8234,35 @@ msgstr "Ãndice Z"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Region Mode"
-msgstr "Modo Región"
+msgstr "Modo de Región"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Collision Mode"
-msgstr "Modo Colisión"
+msgstr "Modo de Colisión"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Occlusion Mode"
-msgstr "Modo Oclusión"
+msgstr "Modo de Oclusión"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Navigation Mode"
-msgstr "Modo Navegación"
+msgstr "Modo de Navegación"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Bitmask Mode"
-msgstr "Modo Bitmask"
+msgstr "Modo de Bitmask"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Priority Mode"
-msgstr "Modo Prioridad"
+msgstr "Modo de Prioridad"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Icon Mode"
-msgstr "Modo Icono"
+msgstr "Modo de Icono"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Z Index Mode"
-msgstr "Modo Ãndice Z"
+msgstr "Modo de Ãndice Z"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Copy bitmask."
@@ -9997,6 +9998,10 @@ msgid ""
"To filter projects by name and full path, the query must contain at least "
"one `/` character."
msgstr ""
+"La casilla de búsqueda filtra los proyectos por nombre y el último "
+"componente de la ruta.\n"
+"Para filtrar los proyectos por nombre y ruta completa, la consulta debe "
+"contener al menos un carácter `/`."
#: editor/project_settings_editor.cpp
msgid "Key "
@@ -11115,9 +11120,8 @@ msgid "Total:"
msgstr "Total:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Export list to a CSV file"
-msgstr "Exportar Perfil"
+msgstr "Exportar lista a un archivo CSV"
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
@@ -11890,7 +11894,7 @@ msgstr "Crear Función"
#: modules/visual_script/visual_script_editor.cpp
msgid "Refresh Graph"
-msgstr "Actualizar Gráfico"
+msgstr "Refrescar Gráfico"
#: modules/visual_script/visual_script_editor.cpp
msgid "Edit Member"
diff --git a/editor/translations/es_AR.po b/editor/translations/es_AR.po
index bd6d934a59..9136ac11c3 100644
--- a/editor/translations/es_AR.po
+++ b/editor/translations/es_AR.po
@@ -18,8 +18,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2020-04-23 20:21+0000\n"
-"Last-Translator: Javier Ocampos <xavier.ocampos@gmail.com>\n"
+"PO-Revision-Date: 2020-05-02 01:48+0000\n"
+"Last-Translator: Anonymous <noreply@weblate.org>\n"
"Language-Team: Spanish (Argentina) <https://hosted.weblate.org/projects/"
"godot-engine/godot/es_AR/>\n"
"Language: es_AR\n"
@@ -27,7 +27,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.0.2-dev\n"
+"X-Generator: Weblate 4.1-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -2954,13 +2954,12 @@ msgid "Q&A"
msgstr "Q&A"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Report a Bug"
-msgstr "Reimportar"
+msgstr "Reportar un Bug"
#: editor/editor_node.cpp
msgid "Send Docs Feedback"
-msgstr ""
+msgstr "Enviar comentarios sobre la documentación"
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
msgid "Community"
@@ -4020,9 +4019,8 @@ msgid "Reimport"
msgstr "Reimportar"
#: editor/import_dock.cpp
-#, fuzzy
msgid "Save Scenes, Re-Import, and Restart"
-msgstr "Guardar escenas, reimportar y reiniciar"
+msgstr "Guardar Escenas, Reimportar y Reiniciar"
#: editor/import_dock.cpp
msgid "Changing the type of an imported file requires editor restart."
@@ -7323,9 +7321,8 @@ msgid "This operation requires a single selected node."
msgstr "Esta operación requiere un solo nodo seleccionado."
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Auto Orthogonal Enabled"
-msgstr "Ortogonal"
+msgstr "Auto Ortogonal Activado"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
@@ -9956,6 +9953,10 @@ msgid ""
"To filter projects by name and full path, the query must contain at least "
"one `/` character."
msgstr ""
+"La casilla de búsqueda filtra los proyectos por nombre y el último "
+"componente de la ruta.\n"
+"Para filtrar los proyectos por nombre y ruta completa, la consulta debe "
+"contener al menos un carácter `/`."
#: editor/project_settings_editor.cpp
msgid "Key "
@@ -10951,6 +10952,8 @@ msgid ""
"Note: Built-in scripts have some limitations and can't be edited using an "
"external editor."
msgstr ""
+"Nota: Los scripts integrados tienen algunas limitaciones y no pueden ser "
+"editados con un editor externo."
#: editor/script_create_dialog.cpp
msgid "Class Name:"
@@ -11073,9 +11076,8 @@ msgid "Total:"
msgstr "Total:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Export list to a CSV file"
-msgstr "Exportar Perfil"
+msgstr "Exportar lista a un archivo CSV"
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
@@ -12759,7 +12761,7 @@ msgstr ""
#: scene/main/viewport.cpp
msgid "Viewport size must be greater than 0 to render anything."
-msgstr ""
+msgstr "El tamaño del viewport debe ser mayor a 0 para poder renderizar."
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for preview."
diff --git a/editor/translations/fi.po b/editor/translations/fi.po
index af9486a2ad..6695783866 100644
--- a/editor/translations/fi.po
+++ b/editor/translations/fi.po
@@ -10,11 +10,12 @@
# Sami Lehtilä <sami.lehtila@gmail.com>, 2018.
# Tapani Niemi <tapani.niemi@kapsi.fi>, 2018, 2019, 2020.
# Tuomas Lähteenmäki <lahtis@gmail.com>, 2019.
+# Matti Niskanen <matti.t.niskanen@gmail.com>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2020-04-20 05:51+0000\n"
+"PO-Revision-Date: 2020-05-01 11:42+0000\n"
"Last-Translator: Tapani Niemi <tapani.niemi@kapsi.fi>\n"
"Language-Team: Finnish <https://hosted.weblate.org/projects/godot-engine/"
"godot/fi/>\n"
@@ -23,7 +24,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.0.2-dev\n"
+"X-Generator: Weblate 4.0.2\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -2757,7 +2758,7 @@ msgstr "Irrallisten resurssien hallinta..."
#: editor/editor_node.cpp
msgid "Quit to Project List"
-msgstr "Lopeta ja palaa projektiluetteloon"
+msgstr "Poistu projektiluetteloon"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
#: editor/project_export.cpp
@@ -5353,7 +5354,7 @@ msgstr "Palauta oletuslähennystaso"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
-msgstr "Valitse tila"
+msgstr "Valintatila"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Drag: Rotate"
@@ -5381,7 +5382,7 @@ msgstr "Siirtotila"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
-msgstr "Kääntötila"
+msgstr "Kiertotila"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -9898,6 +9899,9 @@ msgid ""
"To filter projects by name and full path, the query must contain at least "
"one `/` character."
msgstr ""
+"Hakulaatikko suodattaa projektit nimen ja polun loppuosan mukaan.\n"
+"Suodattaaksesi projektit nimen ja koko polun mukaan, haussa tulee olla "
+"mukana vähintään yksi `/` merkki."
#: editor/project_settings_editor.cpp
msgid "Key "
@@ -11017,9 +11021,8 @@ msgid "Total:"
msgstr "Yhteensä:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Export list to a CSV file"
-msgstr "Vie profiili"
+msgstr "Vie lista CSV tiedostoon"
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
@@ -11790,7 +11793,7 @@ msgstr "Tee funktio"
#: modules/visual_script/visual_script_editor.cpp
msgid "Refresh Graph"
-msgstr "Päivitä graafi"
+msgstr "Päivitä kaaviokuva"
#: modules/visual_script/visual_script_editor.cpp
msgid "Edit Member"
diff --git a/editor/translations/fr.po b/editor/translations/fr.po
index 552da2cedf..bb371b7674 100644
--- a/editor/translations/fr.po
+++ b/editor/translations/fr.po
@@ -76,8 +76,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2020-04-23 20:21+0000\n"
-"Last-Translator: LaurentOngaro <laurent@gameamea.com>\n"
+"PO-Revision-Date: 2020-05-05 14:01+0000\n"
+"Last-Translator: Anonymous <noreply@weblate.org>\n"
"Language-Team: French <https://hosted.weblate.org/projects/godot-engine/"
"godot/fr/>\n"
"Language: fr\n"
@@ -85,7 +85,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Generator: Weblate 4.0.2-dev\n"
+"X-Generator: Weblate 4.1-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -5467,12 +5467,12 @@ msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Reset"
-msgstr "Réinitialiser le facteur d'agrandissement"
+msgstr "Réinitialiser le zoom"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode"
-msgstr "Sélectionner le mode"
+msgstr "Mode sélection"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Drag: Rotate"
@@ -5505,7 +5505,7 @@ msgstr "Mode rotation"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale Mode"
-msgstr "Mode de mise à l'échelle"
+msgstr "Mode mise à l'échelle"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5542,7 +5542,7 @@ msgstr "Activer/Désactiver l'aimantation à la grille."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Use Grid Snap"
-msgstr "Aimanter à la grille"
+msgstr "Utiliser l'aimantation à la grille"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snapping Options"
@@ -5672,7 +5672,7 @@ msgstr "Centrer sur la sélection"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Frame Selection"
-msgstr "Cadrer la sélection"
+msgstr "Encadrer la sélection"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Preview Canvas Scale"
@@ -7394,7 +7394,7 @@ msgstr "Arrière"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Align Transform with View"
-msgstr "Aligner le Transform avec la vue"
+msgstr "Aligner Transform avec la vue"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Align Rotation with View"
@@ -7480,19 +7480,19 @@ msgstr "Vue libre droite"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Forward"
-msgstr "Vue libre de devant"
+msgstr "Vue libre avant"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Backwards"
-msgstr "Vue libre de derrière"
+msgstr "Vue libre arrière"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Up"
-msgstr "Vue libre de dessus"
+msgstr "Vue libre haut"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Down"
-msgstr "Vue libre de dessous"
+msgstr "Vue libre bas"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Speed Modifier"
@@ -7500,20 +7500,20 @@ msgstr "Modificateur de vitesse de la vue libre"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Slow Modifier"
-msgstr "Modificateur de vitesse de la vue libre"
+msgstr "Ralentissement de la vue libre"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Rotation Locked"
-msgstr "Verrouiller la rotation de la vue"
+msgstr "Rotation de la vue verrouillée"
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Note: The FPS value displayed is the editor's framerate.\n"
"It cannot be used as a reliable indication of in-game performance."
msgstr ""
-"Note : La valeur FPS affichée est la fréquence d'images de l'éditeur.\n"
-"Il ne doit pas être utilisé comme un indicateur fiable de la performance en "
-"jeu."
+"Note : Les FPS (images par secondes) affichées sont celles de éditeur.\n"
+"Elles ne doivent pas être utilisées comme un indicateur fiable de la "
+"performance en jeu."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
@@ -7521,11 +7521,11 @@ msgstr "Dialogue XForm"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Nodes To Floor"
-msgstr "Aligner les nœuds au sol"
+msgstr "Aligner les nœuds avec le sol"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Couldn't find a solid floor to snap the selection to."
-msgstr "N'a pas pu trouvé de sol solide pour y attacher la sélection."
+msgstr "Pas de sol solide trouvé pour y attacher la sélection."
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
@@ -7539,11 +7539,11 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Local Space"
-msgstr "Utiliser l'espace local"
+msgstr "Utiliser les coordonées locales"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
-msgstr "Aligner sur la grille"
+msgstr "Aligner avec la grille"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View"
@@ -7555,11 +7555,11 @@ msgstr "Vue de dessus"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rear View"
-msgstr "Vue arrière"
+msgstr "Vue de derrière"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Front View"
-msgstr "Vue avant"
+msgstr "Vue de devant"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Left View"
@@ -7579,7 +7579,7 @@ msgstr "Insérer une clef d'animation"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Focus Origin"
-msgstr "Focaliser l'origine"
+msgstr "Focaliser sur l'origine"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Focus Selection"
@@ -8174,7 +8174,7 @@ msgstr "Donnez une ressource TileSet à cette TileMap pour utiliser ses tuiles."
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint Tile"
-msgstr "Peindre la case"
+msgstr "Peindre la tuile"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
@@ -8186,7 +8186,7 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Pick Tile"
-msgstr "Sélectionner une case"
+msgstr "Sélectionner une tuile"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Rotate Left"
diff --git a/editor/translations/he.po b/editor/translations/he.po
index 35421252b2..69d8bcc3b5 100644
--- a/editor/translations/he.po
+++ b/editor/translations/he.po
@@ -5,18 +5,19 @@
# Daniel <lorddaniel09@gmail.com>, 2018.
# Ben Golan <golanben4@gmail.com>, 2017.
# Luc Stepniewski <lior@gradstein.info>, 2017.
-# Yaron Shahrabani <sh.yaron@gmail.com>, 2018, 2019.
+# Yaron Shahrabani <sh.yaron@gmail.com>, 2018, 2019, 2020.
# RaikaRakka <shaiyatta@gmail.com>, 2018.
# Ido Dana <idodana01@gmail.com>, 2019.
# Daniel Dovgun <daniel.dovgun@gmail.com>, 2019.
# MordechaiHadad <Mordechai.hadad01@gmail.com>, 2019.
# Daniel <danielharush5252@gmail.com>, 2020.
+# test test <ugbdvwpeikvyzwaadt@awdrt.org>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2020-02-25 09:41+0000\n"
-"Last-Translator: Daniel <danielharush5252@gmail.com>\n"
+"PO-Revision-Date: 2020-05-05 14:01+0000\n"
+"Last-Translator: Yaron Shahrabani <sh.yaron@gmail.com>\n"
"Language-Team: Hebrew <https://hosted.weblate.org/projects/godot-engine/"
"godot/he/>\n"
"Language: he\n"
@@ -25,7 +26,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=(n == 1) ? 0 : ((n == 2) ? 1 : ((n > 10 && "
"n % 10 == 0) ? 2 : 3));\n"
-"X-Generator: Weblate 4.0-dev\n"
+"X-Generator: Weblate 4.1-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -34,7 +35,7 @@ msgstr "משתנה סוג ×œ× ×—×•×§×™ לפונקציית convert()‎, יש ל
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
msgid "Expected a string of length 1 (a character)."
-msgstr "צופה מחרוזת ב×ורך 1 (תו)"
+msgstr "צפויה מחרוזת ב×ורך 1 (תו)."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/mono/glue/gd_glue.cpp
@@ -722,13 +723,12 @@ msgid "Line Number:"
msgstr "מספר השורה:"
#: editor/code_editor.cpp
-#, fuzzy
msgid "%d replaced."
-msgstr "החלפה…"
+msgstr "%d הוחלף."
#: editor/code_editor.cpp editor/editor_help.cpp
msgid "%d match."
-msgstr ""
+msgstr "d% הת×מות."
#: editor/code_editor.cpp editor/editor_help.cpp
#, fuzzy
@@ -4044,9 +4044,8 @@ msgid "Saving..."
msgstr "שמירה…"
#: editor/import_dock.cpp
-#, fuzzy
msgid "%d Files"
-msgstr " קבצי×"
+msgstr "%d קבצי×"
#: editor/import_dock.cpp
msgid "Set as Default for '%s'"
@@ -6788,66 +6787,58 @@ msgid "Error writing TextFile:"
msgstr "שגי××” ×‘×™×™×‘×•× ×¢×¨×›×ª הנוש×"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Could not load file at:"
-msgstr "×œ× × ×™×ª×Ÿ ליצור תיקייה."
+msgstr "×œ× × ×™×ª×Ÿ לטעון קובץ מהמיקו×:"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error saving file!"
-msgstr "שגי××” בשמירה"
+msgstr "שגי××” בשמירת קובץ!"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error while saving theme."
-msgstr "שגי××” בשמירת ערכת העיצוב"
+msgstr "שגי××” בשמירת ערכת העיצוב."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error Saving"
msgstr "שגי××” בשמירה"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error importing theme."
-msgstr "שגי××” ×‘×™×™×‘×•× ×¢×¨×›×ª הנוש×"
+msgstr "שגי××” ×‘×™×™×‘×•× ×¢×¨×›×ª העיצוב."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error Importing"
msgstr "שגי××” בייבו×"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "New Text File..."
-msgstr "תיקייה חדשה…"
+msgstr "קובץ טקסט חדש…"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Open File"
msgstr "פתיחת קובץ"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Save File As..."
-msgstr "שמירה בש×…"
+msgstr "שמירת קובץ בש×…"
#: editor/plugins/script_editor_plugin.cpp
msgid "Can't obtain the script for running."
-msgstr ""
+msgstr "×œ× × ×™×ª×Ÿ לקבל ×ת הסקריפט להרצה."
#: editor/plugins/script_editor_plugin.cpp
msgid "Script failed reloading, check console for errors."
-msgstr ""
+msgstr "רענון הסקריפט נכשל, × × ×œ×—×¤×© ×ת השגי×ות במסוף."
#: editor/plugins/script_editor_plugin.cpp
msgid "Script is not in tool mode, will not be able to run."
-msgstr ""
+msgstr "הסקריפט ×ינו במצב כלי×, ×œ× ×ª×”×™×” לו ×פשרות לרוץ."
#: editor/plugins/script_editor_plugin.cpp
msgid ""
"To run this script, it must inherit EditorScript and be set to tool mode."
msgstr ""
+"כדי להריץ ×ת הסקריפט ×”×–×”, עליו לרשת EditorScript ולהגדיר ×ותו למצב כלי×."
#: editor/plugins/script_editor_plugin.cpp
msgid "Import Theme"
@@ -6880,9 +6871,8 @@ msgid "Find Previous"
msgstr "×יתור הקוד×"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Filter scripts"
-msgstr "מ×פייני פריט."
+msgstr "סינון סקריפטי×"
#: editor/plugins/script_editor_plugin.cpp
msgid "Toggle alphabetical sorting of the method list."
diff --git a/editor/translations/hu.po b/editor/translations/hu.po
index d066d5e317..620a2d4d5b 100644
--- a/editor/translations/hu.po
+++ b/editor/translations/hu.po
@@ -10,7 +10,6 @@
# Tusa Gamer <tusagamer@mailinator.com>, 2018.
# Máté Lugosi <mate.lugosi@gmail.com>, 2019.
# sztrovacsek <magadeve@gmail.com>, 2019.
-# Deleted User <noreply+18797@weblate.org>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
diff --git a/editor/translations/it.po b/editor/translations/it.po
index 1c7c72ce12..8e9432baac 100644
--- a/editor/translations/it.po
+++ b/editor/translations/it.po
@@ -46,12 +46,14 @@
# Douglas Fiedler <dognew@gmail.com>, 2020.
# E440QF <ettore.beltra@gmail.com>, 2020.
# Giuseppe Lucido <giuseppe.lucido@gmail.com>, 2020.
+# Mirko Proto <mirko7@protonmail.com>, 2020.
+# J. Lavoie <j.lavoie@net-c.ca>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2020-04-27 08:25+0000\n"
-"Last-Translator: Micila Micillotto <micillotto@gmail.com>\n"
+"PO-Revision-Date: 2020-05-04 15:12+0000\n"
+"Last-Translator: J. Lavoie <j.lavoie@net-c.ca>\n"
"Language-Team: Italian <https://hosted.weblate.org/projects/godot-engine/"
"godot/it/>\n"
"Language: it\n"
@@ -59,7 +61,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.0.2-dev\n"
+"X-Generator: Weblate 4.1-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -3026,7 +3028,7 @@ msgstr "Esegui la scena in modifica."
#: editor/editor_node.cpp
msgid "Play Scene"
-msgstr "Esegui scena"
+msgstr "Avvia Scena"
#: editor/editor_node.cpp
msgid "Play custom scene"
@@ -3034,7 +3036,7 @@ msgstr "Esegui scena personalizzata"
#: editor/editor_node.cpp
msgid "Play Custom Scene"
-msgstr "Esegui scena personalizzata"
+msgstr "Avvia Scena Personalizzata"
#: editor/editor_node.cpp
msgid "Changing the video driver requires restarting the editor."
@@ -3071,7 +3073,7 @@ msgstr "Ispettore"
#: editor/editor_node.cpp
msgid "Expand Bottom Panel"
-msgstr "Espandi pannello inferiore"
+msgstr "Espandi Pannello Inferiore"
#: editor/editor_node.cpp
msgid "Output"
@@ -11111,9 +11113,8 @@ msgid "Total:"
msgstr "Totale:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Export list to a CSV file"
-msgstr "Esporta profilo"
+msgstr "Esporta l'elenco in un file CSV"
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
diff --git a/editor/translations/ja.po b/editor/translations/ja.po
index aac20e9666..8aef04db94 100644
--- a/editor/translations/ja.po
+++ b/editor/translations/ja.po
@@ -35,8 +35,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2020-04-27 08:25+0000\n"
-"Last-Translator: Anonymous <noreply@weblate.org>\n"
+"PO-Revision-Date: 2020-05-04 15:12+0000\n"
+"Last-Translator: Wataru Onuki <bettawat@yahoo.co.jp>\n"
"Language-Team: Japanese <https://hosted.weblate.org/projects/godot-engine/"
"godot/ja/>\n"
"Language: ja\n"
@@ -44,7 +44,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 4.0.2-dev\n"
+"X-Generator: Weblate 4.1-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -592,7 +592,7 @@ msgstr "é¸æŠžç¯„囲を複製"
#: editor/animation_track_editor.cpp
msgid "Duplicate Transposed"
-msgstr "複製を転置"
+msgstr "転置ã—ã¦è¤‡è£½"
#: editor/animation_track_editor.cpp
msgid "Delete Selection"
@@ -1862,7 +1862,7 @@ msgstr "éš ã—ファイルをオン / オフ"
#: editor/editor_file_dialog.cpp
msgid "Toggle Favorite"
-msgstr "ãŠæ°—ã«å…¥ã‚Šã®ã‚ªãƒ³ / オフ"
+msgstr "ãŠæ°—ã«å…¥ã‚Šã«ã™ã‚‹ / ã—ãªã„"
#: editor/editor_file_dialog.cpp
msgid "Toggle Mode"
@@ -1870,7 +1870,7 @@ msgstr "モード切替ãˆ"
#: editor/editor_file_dialog.cpp
msgid "Focus Path"
-msgstr "フォーカスパス"
+msgstr "パスã«ãƒ•ã‚©ãƒ¼ã‚«ã‚¹"
#: editor/editor_file_dialog.cpp
msgid "Move Favorite Up"
@@ -1898,7 +1898,7 @@ msgstr "ファイル更新。"
#: editor/editor_file_dialog.cpp
msgid "(Un)favorite current folder."
-msgstr "ç¾åœ¨ã®ãƒ•ã‚©ãƒ«ãƒ€ã‚’ãŠæ°—ã«å…¥ã‚Šã«ã™ã‚‹/ãŠæ°—ã«å…¥ã‚Šã‹ã‚‰å¤–ã™ã€‚"
+msgstr "ç¾åœ¨ã®ãƒ•ã‚©ãƒ«ãƒ€ã‚’ãŠæ°—ã«å…¥ã‚Šã«ã™ã‚‹ / ã—ãªã„。"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Toggle the visibility of hidden files."
@@ -1989,7 +1989,7 @@ msgstr "メソッド"
#: editor/editor_help.cpp
msgid "Theme Properties"
-msgstr "テーマプロパティ"
+msgstr "テーマ プロパティ"
#: editor/editor_help.cpp
msgid "Enumerations"
@@ -4051,6 +4051,7 @@ msgid "Copy Resource"
msgstr "リソースをコピー"
#: editor/inspector_dock.cpp
+#, fuzzy
msgid "Make Built-In"
msgstr "ビルトインを作æˆ"
@@ -5316,22 +5317,22 @@ msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock Selected"
-msgstr "é¸æŠžã‚’ロック"
+msgstr "é¸æŠžå¯¾è±¡ã‚’ロック"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Unlock Selected"
-msgstr "é¸æŠžã‚’解除"
+msgstr "é¸æŠžå¯¾è±¡ã‚’ロック解除"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Group Selected"
-msgstr "é¸æŠžã—ãŸã‚°ãƒ«ãƒ¼ãƒ—"
+msgstr "é¸æŠžå¯¾è±¡ã‚’グループ化"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Ungroup Selected"
-msgstr "グループ解除"
+msgstr "é¸æŠžå¯¾è±¡ã‚’グループ解除"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Paste Pose"
@@ -5390,7 +5391,7 @@ msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Alt+RMB: Depth list selection"
-msgstr "Alt+å³ã‚¯ãƒªãƒƒã‚¯: 奥行ã(被写界深度)リストã®é¸æŠž"
+msgstr "Alt+å³ã‚¯ãƒªãƒƒã‚¯: 奥行ãé¸æŠžãƒªã‚¹ãƒˆ"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5500,12 +5501,12 @@ msgstr "ガイドã«ã‚¹ãƒŠãƒƒãƒ—"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock the selected object in place (can't be moved)."
-msgstr "é¸æŠžã—ãŸã‚ªãƒ–ジェクトをãã®å ´ã§ãƒ­ãƒƒã‚¯ (移動ä¸å¯èƒ½ã«ã™ã‚‹)。"
+msgstr "é¸æŠžã—ãŸã‚ªãƒ–ジェクトをç¾åœ¨ä½ç½®ã§ãƒ­ãƒƒã‚¯ (移動ä¸å¯èƒ½ã«ã™ã‚‹)。"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Unlock the selected object (can be moved)."
-msgstr "é¸æŠžã—ãŸã‚ªãƒ–ジェクトをアンロック (移動å¯èƒ½ã«ã™ã‚‹)。"
+msgstr "é¸æŠžã—ãŸã‚ªãƒ–ジェクトをロック解除 (移動å¯èƒ½ã«ã™ã‚‹)。"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5568,11 +5569,11 @@ msgstr "グループアイコンã¨ãƒ­ãƒƒã‚¯ã‚¢ã‚¤ã‚³ãƒ³ã‚’表示"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
-msgstr "センターé¸æŠž"
+msgstr "é¸æŠžå¯¾è±¡ã‚’中央ã«"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Frame Selection"
-msgstr "フレームé¸æŠž"
+msgstr "é¸æŠžå¯¾è±¡ã‚’å…¨é¢ã«"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Preview Canvas Scale"
@@ -6842,7 +6843,7 @@ msgstr "ブレーク"
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
#: editor/script_editor_debugger.cpp
msgid "Continue"
-msgstr "実行を継続"
+msgstr "続行"
#: editor/plugins/script_editor_plugin.cpp
msgid "Keep Debugger Open"
@@ -7034,7 +7035,7 @@ msgstr "シンボルを補完"
#: editor/plugins/script_text_editor.cpp
msgid "Evaluate Selection"
-msgstr "é¸æŠžã—ãŸã‚‚ã®ã‚’評価ã™ã‚‹"
+msgstr "é¸æŠžç¯„囲を評価ã™ã‚‹"
#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
@@ -7058,7 +7059,7 @@ msgstr "複数ファイル内を検索..."
#: editor/plugins/script_text_editor.cpp
msgid "Contextual Help"
-msgstr "コンテキストヘルプ"
+msgstr "コンテキスト ヘルプ"
#: editor/plugins/script_text_editor.cpp
msgid "Toggle Bookmark"
@@ -7363,11 +7364,11 @@ msgstr "フリールックå³"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Forward"
-msgstr "å‰æ–¹ã‚’フリールックã§è¦‹ã‚‹"
+msgstr "フリールックå‰é€²"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Backwards"
-msgstr "フリールック後方"
+msgstr "フリールック後進"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Up"
@@ -7379,11 +7380,11 @@ msgstr "フリールック下"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Speed Modifier"
-msgstr "フリールックã®é€Ÿåº¦ã‚’調整"
+msgstr "フリールックã®é€Ÿåº¦èª¿æ•´"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Slow Modifier"
-msgstr "フリールックã®æ¸›é€Ÿã‚’調整"
+msgstr "フリールックã®æ¸›é€Ÿèª¿æ•´"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Rotation Locked"
@@ -7399,7 +7400,7 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
-msgstr "Xformダイアログ"
+msgstr "XFormダイアログ"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Nodes To Floor"
@@ -7407,7 +7408,7 @@ msgstr "ノードをフロアã«ã‚¹ãƒŠãƒƒãƒ—"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Couldn't find a solid floor to snap the selection to."
-msgstr "é¸æŠžã‚’スナップã™ã‚‹å‰›ä½“ã®åºŠã‚’見ã¤ã‘ã‚Œã¾ã›ã‚“。"
+msgstr "é¸æŠžå¯¾è±¡ã‚’スナップã•ã›ã‚‹å‰›ä½“ã®åºŠã‚’見ã¤ã‘られã¾ã›ã‚“ã§ã—ãŸã€‚"
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
@@ -7415,9 +7416,9 @@ msgid ""
"Alt+Drag: Move\n"
"Alt+RMB: Depth list selection"
msgstr ""
-"ドラッグ:回転\n"
-"Alt+ドラッグ:移動\n"
-"Alt+å³ã‚¯ãƒªãƒƒã‚¯: 奥行ãリストã®é¸æŠž"
+"ドラッグ: 回転\n"
+"Alt+ドラッグ: 移動\n"
+"Alt+å³ã‚¯ãƒªãƒƒã‚¯: 奥行ãé¸æŠžãƒªã‚¹ãƒˆ"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Local Space"
@@ -7453,7 +7454,7 @@ msgstr "å³å´é¢å›³"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Switch Perspective/Orthogonal View"
-msgstr "é€è¦–図/正投影図ã®åˆ‡ã‚Šæ›¿ãˆ"
+msgstr "é€è¦–投影 / 平行投影ã®åˆ‡ã‚Šæ›¿ãˆ"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Insert Animation Key"
@@ -7465,7 +7466,7 @@ msgstr "原点ã«ãƒ•ã‚©ãƒ¼ã‚«ã‚¹"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Focus Selection"
-msgstr "é¸æŠžã«ãƒ•ã‚©ãƒ¼ã‚«ã‚¹"
+msgstr "é¸æŠžå¯¾è±¡ã«ãƒ•ã‚©ãƒ¼ã‚«ã‚¹"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
@@ -7494,7 +7495,7 @@ msgstr "2 ビューãƒãƒ¼ãƒˆ"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "2 Viewports (Alt)"
-msgstr "2 ビューãƒãƒ¼ãƒˆ(Alt)"
+msgstr "2 ビューãƒãƒ¼ãƒˆ (Alt)"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "3 Viewports"
@@ -7502,7 +7503,7 @@ msgstr "3 ビューãƒãƒ¼ãƒˆ"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "3 Viewports (Alt)"
-msgstr "3 ビューãƒãƒ¼ãƒˆ(Alt)"
+msgstr "3 ビューãƒãƒ¼ãƒˆ (Alt)"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "4 Viewports"
@@ -7799,7 +7800,7 @@ msgstr "スプライトフレーム"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Set Region Rect"
-msgstr "矩形ã®é ˜åŸŸã‚’設定"
+msgstr "領域 Rect を設定"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Set Margin"
@@ -7989,7 +7990,7 @@ msgstr "フォント"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Color"
-msgstr "\\ Color"
+msgstr "Color"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Theme File"
@@ -7997,7 +7998,7 @@ msgstr "テーマ ファイル"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Erase Selection"
-msgstr "é¸æŠžå¯¾è±¡ã‚’消去"
+msgstr "é¸æŠžç¯„囲を消去"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Fix Invalid Tiles"
@@ -8006,7 +8007,7 @@ msgstr "無効ãªã‚¿ã‚¤ãƒ«ã‚’修正"
#: editor/plugins/tile_map_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Cut Selection"
-msgstr "é¸æŠžå¯¾è±¡ã‚’切りå–ã‚Š"
+msgstr "é¸æŠžç¯„囲を切りå–ã‚Š"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
@@ -8018,7 +8019,7 @@ msgstr "ç›´ç·šã‚’æç”»"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Rectangle Paint"
-msgstr "矩形ペイント"
+msgstr "長方形ペイント"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Bucket Fill"
@@ -8030,7 +8031,7 @@ msgstr "タイルマップを消去"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Find Tile"
-msgstr "タイルを検索ã™ã‚‹"
+msgstr "タイルを検索"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Transpose"
@@ -8056,19 +8057,19 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint Tile"
-msgstr "タイルを塗る"
+msgstr "タイルをペイント"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid ""
"Shift+LMB: Line Draw\n"
"Shift+Ctrl+LMB: Rectangle Paint"
msgstr ""
-"Shift+左マウスボタン:ç·šã®æç”»\n"
-"Shift+Ctrl+左マウスボタン:矩形ペイント"
+"Shift+左マウスボタン: ç›´ç·šã«æã\n"
+"Shift+Ctrl+左マウスボタン: 長方形ペイント"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Pick Tile"
-msgstr "タイルをé¸æŠž"
+msgstr "タイルをピック"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Rotate Left"
@@ -8208,7 +8209,7 @@ msgstr "ビットマスクを消去。"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create a new rectangle."
-msgstr "æ–°è¦çŸ©å½¢ã‚’作æˆã€‚"
+msgstr "æ–°ã—ã長方形を作æˆã€‚"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create a new polygon."
@@ -8265,12 +8266,12 @@ msgid ""
"Drag handles to edit Rect.\n"
"Click on another Tile to edit it."
msgstr ""
-"ãƒãƒ³ãƒ‰ãƒ«ã‚’ドラッグã—ã¦çŸ©å½¢ã‚’編集ã—ã¾ã™ã€‚\n"
-"別ã®ã‚¿ã‚¤ãƒ«ã‚’クリックã—ã¦ãれを編集ã—ã¾ã™ã€‚"
+"ãƒãƒ³ãƒ‰ãƒ«ã‚’ドラッグã—ã¦é•·æ–¹å½¢ã‚’編集ã—ã¾ã™ã€‚\n"
+"別ã®ã‚¿ã‚¤ãƒ«ã‚’クリックã™ã‚‹ã¨ãれを編集ã—ã¾ã™ã€‚"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Delete selected Rect."
-msgstr "é¸æŠžã—ãŸçŸ©å½¢ã‚’削除ã™ã‚‹ã€‚"
+msgstr "é¸æŠžã—ãŸé•·æ–¹å½¢ã‚’削除ã™ã‚‹ã€‚"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
@@ -8476,7 +8477,7 @@ msgstr "タイプã®å¤‰æ›´"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Stage Selected"
-msgstr "é¸æŠžç‰©ã‚’ステージã™ã‚‹"
+msgstr "é¸æŠžå¯¾è±¡ã‚’ステージã™ã‚‹"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Stage All"
@@ -9285,6 +9286,7 @@ msgstr ""
"ãŸã‚ã«ãれを使用ã—ãªã„ã§ãã ã•ã„。"
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Returns falloff based on the dot product of surface normal and view "
"direction of camera (pass associated inputs to it)."
@@ -9911,6 +9913,10 @@ msgid ""
"To filter projects by name and full path, the query must contain at least "
"one `/` character."
msgstr ""
+"検索ボックスã§ã¯ã€ãƒ—ロジェクトã¯åå‰ãŠã‚ˆã³ãƒ‘スã®æœ€å¾Œã®éƒ¨åˆ†ã§ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼ã•ã‚Œã¾"
+"ã™ã€‚\n"
+"プロジェクトåãŠã‚ˆã³å®Œå…¨ãƒ‘スã§ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼ã™ã‚‹ã«ã¯ã€ã‚¯ã‚¨ãƒªã«ã¯ `/` 文字ãŒå°‘ãªã"
+"ã¨ã‚‚1ã¤å¿…è¦ã§ã™ã€‚"
#: editor/project_settings_editor.cpp
msgid "Key "
@@ -11026,9 +11032,8 @@ msgid "Total:"
msgstr "åˆè¨ˆ:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Export list to a CSV file"
-msgstr "プロファイルã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ"
+msgstr "CSVファイルã«ãƒªã‚¹ãƒˆã‚’エクスãƒãƒ¼ãƒˆ"
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
@@ -11779,7 +11784,7 @@ msgstr "グラフを編集ã™ã‚‹é–¢æ•°ã‚’é¸æŠžã¾ãŸã¯ä½œæˆã—ã¾ã™ã€‚"
#: modules/visual_script/visual_script_editor.cpp
msgid "Delete Selected"
-msgstr "é¸æŠžæ¸ˆã¿ã‚’削除"
+msgstr "é¸æŠžå¯¾è±¡ã‚’削除"
#: modules/visual_script/visual_script_editor.cpp
msgid "Find Node Type"
@@ -11795,11 +11800,11 @@ msgstr "ノードを切りå–ã‚‹"
#: modules/visual_script/visual_script_editor.cpp
msgid "Make Function"
-msgstr "関数ã®ä½œæˆ"
+msgstr "関数を作æˆ"
#: modules/visual_script/visual_script_editor.cpp
msgid "Refresh Graph"
-msgstr "グラフã®æ›´æ–°"
+msgstr "グラフを更新"
#: modules/visual_script/visual_script_editor.cpp
msgid "Edit Member"
diff --git a/editor/translations/ko.po b/editor/translations/ko.po
index b2dbd4e353..f25550709a 100644
--- a/editor/translations/ko.po
+++ b/editor/translations/ko.po
@@ -21,8 +21,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2020-04-20 05:51+0000\n"
-"Last-Translator: Myeongjin Lee <aranet100@gmail.com>\n"
+"PO-Revision-Date: 2020-05-01 11:42+0000\n"
+"Last-Translator: Ch. <ccwpc@hanmail.net>\n"
"Language-Team: Korean <https://hosted.weblate.org/projects/godot-engine/"
"godot/ko/>\n"
"Language: ko\n"
@@ -30,7 +30,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 4.0.2-dev\n"
+"X-Generator: Weblate 4.0.2\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -5929,7 +5929,7 @@ msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Single Convex Collision Sibling"
-msgstr "개별 Convex ì¶©ëŒ í˜•ì œ 만들기"
+msgstr "ë‹¨ì¼ Convex ì¶©ëŒ í˜•ì œ 만들기"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid ""
@@ -9838,6 +9838,9 @@ msgid ""
"To filter projects by name and full path, the query must contain at least "
"one `/` character."
msgstr ""
+"ì´ ê²€ìƒ‰ì°½ì€ í”„ë¡œì íŠ¸ë¥¼ ì´ë¦„ê³¼ ê²½ë¡œì˜ ë§ˆì§€ë§‰ 부분으로 거릅니다.\n"
+"프로ì íŠ¸ë¥¼ ì „ì²´ 경로를 기준으로 걸러내려면 ê²€ìƒ‰ì–´ì— `/` ê°€ í•œ ê¸€ìž ì´ìƒ í¬í•¨"
+"시키세요."
#: editor/project_settings_editor.cpp
msgid "Key "
@@ -10949,9 +10952,8 @@ msgid "Total:"
msgstr "ì „ì²´:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Export list to a CSV file"
-msgstr "프로필 내보내기"
+msgstr "목ë¡ì„ CSV 파ì¼ë¡œ 내보내기"
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
@@ -12584,7 +12586,7 @@ msgstr ""
#: scene/main/viewport.cpp
msgid "Viewport size must be greater than 0 to render anything."
-msgstr "ë·°í¬íŠ¸ í¬ê¸°ëŠ” 무엇ì´ë“  ë Œë”ë§í•˜ê¸° 위해 0보다 커야 합니다."
+msgstr "무엇ì´ë“  ë Œë”ë§í•˜ë ¤ë©´ ë·°í¬íŠ¸ í¬ê¸°ê°€ 0보다 커야 합니다."
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for preview."
diff --git a/editor/translations/mr.po b/editor/translations/mr.po
index 5b2a55ffbe..902c243d16 100644
--- a/editor/translations/mr.po
+++ b/editor/translations/mr.po
@@ -3,41 +3,42 @@
# Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md).
# This file is distributed under the same license as the Godot source code.
# Prachi Joshi <josprachi@yahoo.com>, 2019, 2020.
+# Shirious <sad3119823@gmail.com>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2020-01-30 03:56+0000\n"
-"Last-Translator: Prachi Joshi <josprachi@yahoo.com>\n"
+"PO-Revision-Date: 2020-05-05 14:01+0000\n"
+"Last-Translator: Shirious <sad3119823@gmail.com>\n"
"Language-Team: Marathi <https://hosted.weblate.org/projects/godot-engine/"
"godot/mr/>\n"
"Language: mr\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.11-dev\n"
+"X-Generator: Weblate 4.1-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Invalid type argument to convert(), use TYPE_* constants."
-msgstr ""
+msgstr "convert() साठी अवैध आरगà¥à¤¯à¥à¤®à¥‡à¤¨à¥à¤Ÿ, TYPE_* कोनà¥à¤¸à¤Ÿà¤¨à¥à¤Ÿ वापरा."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
msgid "Expected a string of length 1 (a character)."
-msgstr ""
+msgstr "1 लांबीची सà¥à¤Ÿà¥à¤°à¤¿à¤‚ग अपेकà¥à¤·à¤¿à¤¤ (à¤à¤• कैरेकà¥à¤Ÿà¤°)."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
-msgstr ""
+msgstr "डिकोड करणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ पà¥à¤°à¤¸à¥‡ बाईटसॠनाहित, किंवा अवैध फ़ोरमैट."
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
-msgstr ""
+msgstr "à¤à¤•à¥à¤¸à¤ªà¥à¤°à¥‡à¤¶à¤¨ मधे अवैध इनपà¥à¤Ÿ %i (पास नाही à¤à¤¾à¤²à¥‡)"
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
-msgstr ""
+msgstr "self वापरले जाऊ शकत नाही कारण इनà¥à¤¸à¤Ÿà¤¨à¥à¤¸ null आहे (पास नाही à¤à¤¾à¤²à¥‡)"
#: core/math/expression.cpp
msgid "Invalid operands to operator %s, %s and %s."
@@ -1928,9 +1929,8 @@ msgid "Property Descriptions"
msgstr ""
#: editor/editor_help.cpp
-#, fuzzy
msgid "(value)"
-msgstr "मूलà¥à¤¯:"
+msgstr "(किंमत)"
#: editor/editor_help.cpp
msgid ""
diff --git a/editor/translations/nl.po b/editor/translations/nl.po
index ba11dc0dad..93219f8bfc 100644
--- a/editor/translations/nl.po
+++ b/editor/translations/nl.po
@@ -44,7 +44,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2020-04-23 20:21+0000\n"
+"PO-Revision-Date: 2020-05-04 15:12+0000\n"
"Last-Translator: Stijn Hinlopen <f.a.hinlopen@gmail.com>\n"
"Language-Team: Dutch <https://hosted.weblate.org/projects/godot-engine/godot/"
"nl/>\n"
@@ -53,7 +53,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.0.2-dev\n"
+"X-Generator: Weblate 4.1-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -2023,8 +2023,8 @@ msgid ""
"There is currently no description for this property. Please help us by "
"[color=$color][url=$url]contributing one[/url][/color]!"
msgstr ""
-"Er is momenteel geen beschrijving voor deze eigenschap. Help ons alsjeblieft "
-"door [color=$color][url=$url]een toe te voegen[/url][/color]!"
+"Er is momenteel geen beschrijving voor deze eigenschap. Help ons alstublieft "
+"door [color=$color][url=$url]een bijdrage te leveren[/url][/color]!"
#: editor/editor_help.cpp
msgid "Method Descriptions"
@@ -2035,8 +2035,8 @@ msgid ""
"There is currently no description for this method. Please help us by [color="
"$color][url=$url]contributing one[/url][/color]!"
msgstr ""
-"Er is momenteel geen beschrijving voor deze methode. Help ons alsjeblieft "
-"door [color=$color][url=$url]een toe te voegen[/url][/color]!"
+"Er is momenteel geen beschrijving voor deze methode. Help ons alstublieft "
+"door [color=$color][url=$url]een bijdrage te leveren[/url][/color]!"
#: editor/editor_help_search.cpp editor/editor_node.cpp
#: editor/plugins/script_editor_plugin.cpp
@@ -2500,8 +2500,8 @@ msgid ""
"This option is deprecated. Situations where refresh must be forced are now "
"considered a bug. Please report."
msgstr ""
-"Deze optie is verouderd. Situaties waar een hernieuwing geforceerd moet "
-"worden zijn softwarefouten. Rapporteer dit alsjeblieft."
+"Deze optie is verouderd. Situaties waarbij gedwongen herladen moet worden, "
+"worden gezien als softwarefouten. Rapporteer dit alstublieft."
#: editor/editor_node.cpp
msgid "Pick a Main Scene"
@@ -2730,7 +2730,7 @@ msgstr "Alle scènes opslaan"
#: editor/editor_node.cpp
msgid "Convert To..."
-msgstr "Converteer Naar..."
+msgstr "Omzetten naar..."
#: editor/editor_node.cpp
msgid "MeshLibrary..."
@@ -5898,7 +5898,7 @@ msgstr "Creëer een statisch tri-mesh lichaam"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "This doesn't work on scene root!"
-msgstr "Dit werkt niet op scènewortel!"
+msgstr "Dit werkt niet op de scènewortel!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Static Shape"
@@ -6986,7 +6986,7 @@ msgstr "Kies Kleur"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
msgid "Convert Case"
-msgstr "Converteer Hoofdlettergebruik"
+msgstr "Letters omzetten"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
msgid "Uppercase"
@@ -6998,7 +6998,7 @@ msgstr "Kleine letters"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
msgid "Capitalize"
-msgstr "Maak Hoofdletters"
+msgstr "Elk Woord Met Hoofdletter"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
msgid "Syntax Highlighter"
@@ -7074,15 +7074,15 @@ msgstr "Trim Navolgende Spaties"
#: editor/plugins/script_text_editor.cpp
msgid "Convert Indent to Spaces"
-msgstr "Converteer Indentatie Naar Spaties"
+msgstr "Insprong in spaties omzetten"
#: editor/plugins/script_text_editor.cpp
msgid "Convert Indent to Tabs"
-msgstr "Converteer Indentatie Naar Tabs"
+msgstr "Insprong in Tabs omzetten"
#: editor/plugins/script_text_editor.cpp
msgid "Auto Indent"
-msgstr "Auto Indentatie"
+msgstr "Automatisch inspringen"
#: editor/plugins/script_text_editor.cpp
msgid "Find in Files..."
@@ -7678,7 +7678,7 @@ msgstr "Ongeldige geometrie, kan geen polygon creëren."
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Convert to Polygon2D"
-msgstr "Converteer naar Polygon2D"
+msgstr "Naar Polygon2D omzetten"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Invalid geometry, can't create collision polygon."
@@ -9816,8 +9816,8 @@ msgstr ""
"\n"
"%s\n"
"\n"
-"Als je doorgaat met het openen van dit bestand, zal het worden geconverteerd "
-"naar Godot's huidige format voor project-configuratiebestanden.\n"
+"Als je doorgaat met het openen van dit bestand, zal het worden omgezet naar "
+"Godot's huidige formaat voor project-configuratiebestanden.\n"
"Waarschuwing: Hierna kan het project niet meer worden geopend door oudere "
"versies van Godot Engine."
@@ -9966,6 +9966,10 @@ msgid ""
"To filter projects by name and full path, the query must contain at least "
"one `/` character."
msgstr ""
+"De zoekbalk filtert projecten op naam en naam van de map waarin het project "
+"staat.\n"
+"Om ook op het volledige pad te filteren, moet de zoekopdracht tenminste één "
+"`/` karakter bevatten."
#: editor/project_settings_editor.cpp
msgid "Key "
@@ -10706,7 +10710,7 @@ msgstr "Knoop hieronder toevoegen"
#: editor/scene_tree_dock.cpp
msgid "Expand/Collapse All"
-msgstr "Alles uit-/inklappen"
+msgstr "Alles in-/uitklappen"
#: editor/scene_tree_dock.cpp
msgid "Change Type"
@@ -10718,7 +10722,7 @@ msgstr "Onder nieuwe knoop hangen"
#: editor/scene_tree_dock.cpp
msgid "Make Scene Root"
-msgstr "Scènewortel instellen"
+msgstr "Als scènewortel instellen"
#: editor/scene_tree_dock.cpp
msgid "Merge From Scene"
@@ -11085,9 +11089,8 @@ msgid "Total:"
msgstr "Totaal:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Export list to a CSV file"
-msgstr "Profiel exporteren"
+msgstr "Exporteer lijst naar een csv-bestand"
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
@@ -12208,9 +12211,7 @@ msgstr ""
msgid ""
"A shape must be provided for CollisionShape2D to function. Please create a "
"shape resource for it!"
-msgstr ""
-"Een vorm moet voorzien worden om CollisionShape2D te laten functioneren. "
-"Creëer hiervoor alsjeblieft een vorm resource!"
+msgstr "Een CollisionShape2D heeft een vorm nodig in de Shape-eigenschap!"
#: scene/2d/cpu_particles_2d.cpp
msgid ""
@@ -12238,7 +12239,7 @@ msgstr ""
#: scene/2d/light_occluder_2d.cpp
msgid "The occluder polygon for this occluder is empty. Please draw a polygon."
msgstr ""
-"De occluder polygoon van deze occluder is leeg. Teken alsjeblieft een "
+"De occluder-polygoon van deze occluder is leeg. Teken alstublieft een "
"polygoon."
#: scene/2d/navigation_polygon.cpp
@@ -12703,7 +12704,7 @@ msgstr "Alarm!"
#: scene/gui/dialogs.cpp
msgid "Please Confirm..."
-msgstr "Bevestig alsjeblieft..."
+msgstr "Bevestig alstublieft..."
#: scene/gui/popup.cpp
msgid ""
diff --git a/editor/translations/pl.po b/editor/translations/pl.po
index eb84ea26ca..a7b57f31ba 100644
--- a/editor/translations/pl.po
+++ b/editor/translations/pl.po
@@ -42,7 +42,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2020-04-27 08:25+0000\n"
+"PO-Revision-Date: 2020-05-01 11:42+0000\n"
"Last-Translator: Tomek <kobewi4e@gmail.com>\n"
"Language-Team: Polish <https://hosted.weblate.org/projects/godot-engine/"
"godot/pl/>\n"
@@ -52,7 +52,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
"|| n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 4.0.2-dev\n"
+"X-Generator: Weblate 4.0.2\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -9933,6 +9933,10 @@ msgid ""
"To filter projects by name and full path, the query must contain at least "
"one `/` character."
msgstr ""
+"Pasek wyszukiwania filtruje projekty po nazwie i ostatnim komponencie "
+"ścieżki.\n"
+"By filtrować po nazwie i pełnej ścieżce, zapytanie musi zawierać "
+"przynajmniej jeden znak \"/\"."
#: editor/project_settings_editor.cpp
msgid "Key "
@@ -11049,9 +11053,8 @@ msgid "Total:"
msgstr "Całkowity:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Export list to a CSV file"
-msgstr "Eksportuj profil"
+msgstr "Eksportuj listÄ™ do pliku CSV"
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
diff --git a/editor/translations/pt_BR.po b/editor/translations/pt_BR.po
index b7102a7cdf..d38c4186c7 100644
--- a/editor/translations/pt_BR.po
+++ b/editor/translations/pt_BR.po
@@ -86,12 +86,14 @@
# Richard Urban <redasuio1@gmail.com>, 2020.
# Wellyngton R Weller <well.weller@hotmail.com>, 2020.
# Lucas Araujo <lucassants2808@gmail.com>, 2020.
+# Sr Half <flavio05@outlook.com>, 2020.
+# Matheus Pesegoginski <pese.ek.tk@outlook.com>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: 2016-05-30\n"
-"PO-Revision-Date: 2020-04-27 08:25+0000\n"
-"Last-Translator: johnnybigoode <jamarson@gmail.com>\n"
+"PO-Revision-Date: 2020-05-04 15:12+0000\n"
+"Last-Translator: Anonymous <noreply@weblate.org>\n"
"Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/"
"godot-engine/godot/pt_BR/>\n"
"Language: pt_BR\n"
@@ -99,7 +101,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Generator: Weblate 4.0.2-dev\n"
+"X-Generator: Weblate 4.1-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -736,7 +738,7 @@ msgstr "Selecionar Todos/Nenhum"
#: editor/animation_track_editor_plugins.cpp
msgid "Add Audio Track Clip"
-msgstr "Adicionar Trilha de Clipes de Ãudio"
+msgstr "Adicionar Clipe de Trilha de Ãudio"
#: editor/animation_track_editor_plugins.cpp
msgid "Change Audio Track Clip Start Offset"
@@ -3128,7 +3130,7 @@ msgstr ""
"Você pode então aplicar modificações e construir seu próprio APK na guia "
"Exportação (Adicionando módulos, trocando o AndroidManifest.xml, etc.).\n"
"Note que para fazer uma construção customizada, em vez de usar APKs pre-"
-"construídos, a opção \"Usar construção customizada\" deve estar ativa nas "
+"construídos, a opção \"Usar Construção Customizada\" deve estar ativa nas "
"predefinições de exportação Android."
#: editor/editor_node.cpp
@@ -5655,7 +5657,7 @@ msgstr "Visualizar Canvas Scale"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Translation mask for inserting keys."
-msgstr "Mascara de tradução para inserção de chaves"
+msgstr "Máscara de tradução para inserção de chaves"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Rotation mask for inserting keys."
@@ -6044,7 +6046,7 @@ msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Single Convex Collision Sibling"
-msgstr "Criar Simples Colisão Convexa Irmã(s)"
+msgstr "Criar um irmão de Colisão Convexa"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid ""
@@ -7369,7 +7371,7 @@ msgstr "Essa operação requer um único nó selecionado."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Auto Orthogonal Enabled"
-msgstr "Ortogonal automático habilitado"
+msgstr "Auto-Ortogonal Habilitado"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
@@ -7689,7 +7691,7 @@ msgstr "Visualizar Polígono De Colisão 2D"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Create LightOccluder2D"
-msgstr "Criar LightOccluder2D"
+msgstr "Criar Polígono de Oclusão (LightOccluder2D)"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "LightOccluder2D Preview"
@@ -7730,7 +7732,7 @@ msgstr "Criar PolígonoDeColisão2D Irmão"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Invalid geometry, can't create light occluder."
-msgstr "Geometria inválida, não é possível criar oclusor de luz."
+msgstr "Geometria inválida, não é possível criar o oclusor de luz."
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Create LightOccluder2D Sibling"
@@ -8145,11 +8147,11 @@ msgstr "Pegar Tile"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Rotate Left"
-msgstr "Girar à esquerda"
+msgstr "Girar à Esquerda"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Rotate Right"
-msgstr "Girar à direita"
+msgstr "Girar à Direita"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Flip Horizontally"
@@ -9991,6 +9993,10 @@ msgid ""
"To filter projects by name and full path, the query must contain at least "
"one `/` character."
msgstr ""
+"A caixa de busca filtra projetos por nome e pelo último componente do "
+"caminho.\n"
+"Para filtrar projetos por nome e pelo caminho completo, a consulta deve "
+"conter pelo menos um caractere `/`."
#: editor/project_settings_editor.cpp
msgid "Key "
@@ -11107,9 +11113,8 @@ msgid "Total:"
msgstr "Total:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Export list to a CSV file"
-msgstr "Exportar Perfil"
+msgstr "Exportar lista para arquivo CSV"
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
diff --git a/editor/translations/pt_PT.po b/editor/translations/pt_PT.po
index f7c6f042d2..6314d31908 100644
--- a/editor/translations/pt_PT.po
+++ b/editor/translations/pt_PT.po
@@ -20,7 +20,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2020-04-20 05:51+0000\n"
+"PO-Revision-Date: 2020-05-01 11:42+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"
@@ -29,7 +29,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.0.2-dev\n"
+"X-Generator: Weblate 4.0.2\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -1473,7 +1473,7 @@ msgstr "O Ficheiro não existe."
#: editor/editor_autoload_settings.cpp
msgid "Not in resource path."
-msgstr "Não está no Caminho do recurso."
+msgstr "Não está no caminho do recurso."
#: editor/editor_autoload_settings.cpp
msgid "Add AutoLoad"
@@ -2498,27 +2498,27 @@ msgstr "Incapaz de localizar campo Script para plugin em: 'res://addons/%s'."
#: editor/editor_node.cpp
msgid "Unable to load addon script from path: '%s'."
-msgstr "Incapaz de carregar Script addon do Caminho: '%s'."
+msgstr "Incapaz de carregar script addon do caminho: '%s'."
#: editor/editor_node.cpp
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' Parece haver um erro no "
+"Incapaz de carregar script addon do caminho: '%s' Parece haver um erro no "
"código, reveja a sintaxe."
#: editor/editor_node.cpp
msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
-"Incapaz de carregar Script addon do Caminho: '%s' Tipo base não é "
+"Incapaz de carregar script addon do Caminho: '%s' Tipo base não é "
"EditorPlugin."
#: editor/editor_node.cpp
msgid "Unable to load addon script from path: '%s' Script is not in tool mode."
msgstr ""
-"Incapaz de carregar Script addon do Caminho: '%s' Script não está no modo "
+"Incapaz de carregar script addon do Caminho: '%s' Script não está no modo "
"ferramenta."
#: editor/editor_node.cpp
@@ -3443,7 +3443,7 @@ msgstr "Não foi encontrado version.txt dentro dos Modelos."
#: editor/export_template_manager.cpp
msgid "Error creating path for templates:"
-msgstr "Erro ao criar o Caminho para os Modelos:"
+msgstr "Erro ao criar o caminho para os modelos:"
#: editor/export_template_manager.cpp
msgid "Extracting Export Templates"
@@ -6069,7 +6069,7 @@ msgstr "Fonte da Malha não especificada (e MultiMesh não contêm Malha)."
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Mesh source is invalid (invalid path)."
-msgstr "A fonte da Malha é inválida (Caminho inválido)."
+msgstr "A fonte da malha é inválida (caminho inválido)."
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Mesh source is invalid (not a MeshInstance)."
@@ -6085,7 +6085,7 @@ msgstr "Fonte de superfície não especificada."
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Surface source is invalid (invalid path)."
-msgstr "A fonte de superfície é inválida (Caminho inválido)."
+msgstr "A fonte de superfície é inválida (caminho inválido)."
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Surface source is invalid (no geometry)."
@@ -9615,7 +9615,7 @@ msgstr "Seria uma boa ideia dar um nome ao Projeto."
#: editor/project_manager.cpp
msgid "Invalid project path (changed anything?)."
-msgstr "Caminho de Projeto inválido (alguma alteração?)."
+msgstr "Caminho de projeto inválido (alguma alteração?)."
#: editor/project_manager.cpp
msgid ""
@@ -9902,6 +9902,10 @@ msgid ""
"To filter projects by name and full path, the query must contain at least "
"one `/` character."
msgstr ""
+"A caixa de pesquisa filtra projetos por nome e último componente do "
+"caminho.\n"
+"Para filtrar projetos por nome e caminho completo, a pesquisa tem de conter "
+"pelo menos um caráter `/`."
#: editor/project_settings_editor.cpp
msgid "Key "
@@ -10101,7 +10105,7 @@ msgstr "Remover tradução"
#: editor/project_settings_editor.cpp
msgid "Add Remapped Path"
-msgstr "Adicionar correção remapeada"
+msgstr "Adicionar Caminho Remapeado"
#: editor/project_settings_editor.cpp
msgid "Resource Remap Add Remap"
@@ -10862,11 +10866,11 @@ msgstr "Nome de classe inválido."
#: editor/script_create_dialog.cpp
msgid "Invalid inherited parent name or path."
-msgstr "Nome ou Caminho de parente herdado inválido."
+msgstr "Nome ou caminho de parente herdado inválido."
#: editor/script_create_dialog.cpp
msgid "Script path/name is valid."
-msgstr "Caminho/nome de Script é válido."
+msgstr "Caminho/nome de script é válido."
#: editor/script_create_dialog.cpp
msgid "Allowed: a-z, A-Z, 0-9, _ and ."
@@ -11017,13 +11021,12 @@ msgid "Total:"
msgstr "Total:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Export list to a CSV file"
-msgstr "Exportar Perfil"
+msgstr "Exportar lista para ficheiro CSV"
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
-msgstr "Caminho do recurso"
+msgstr "Caminho do Recurso"
#: editor/script_editor_debugger.cpp
msgid "Type"
@@ -11241,7 +11244,7 @@ msgstr ""
#: modules/gdscript/gdscript_functions.cpp
msgid "Invalid instance dictionary format (invalid script at @path)"
-msgstr "Formato de dicionário de instância inválido (Script inválido em @path)"
+msgstr "Formato de dicionário de instância inválido (script inválido em @path)"
#: modules/gdscript/gdscript_functions.cpp
msgid "Invalid instance dictionary (invalid subclasses)"
@@ -12240,7 +12243,7 @@ msgstr ""
#: scene/2d/remote_transform_2d.cpp
msgid "Path property must point to a valid Node2D node to work."
msgstr ""
-"Para funcionar, a Propriedade Caminho tem de apontar para um nó Node2D "
+"Para funcionar, a propriedade caminho tem de apontar para um nó Node2D "
"válido."
#: scene/2d/skeleton_2d.cpp
diff --git a/editor/translations/ru.po b/editor/translations/ru.po
index 2344b31e59..d8c55d825e 100644
--- a/editor/translations/ru.po
+++ b/editor/translations/ru.po
@@ -70,12 +70,13 @@
# Ivan Kuzmenko <kuzmenko.ivan2002@yandex.com>, 2020.
# Super Pracion <superpracion2@gmail.com>, 2020.
# PizzArt <7o7goo7o7@gmail.com>, 2020.
+# TheGracekale <mrsmailbot.lg@gmail.com>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2020-04-23 20:21+0000\n"
-"Last-Translator: PizzArt <7o7goo7o7@gmail.com>\n"
+"PO-Revision-Date: 2020-05-05 14:01+0000\n"
+"Last-Translator: Super Pracion <superpracion2@gmail.com>\n"
"Language-Team: Russian <https://hosted.weblate.org/projects/godot-engine/"
"godot/ru/>\n"
"Language: ru\n"
@@ -84,7 +85,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 4.0.2-dev\n"
+"X-Generator: Weblate 4.1-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -9966,6 +9967,9 @@ msgid ""
"To filter projects by name and full path, the query must contain at least "
"one `/` character."
msgstr ""
+"Поле поиÑка фильтрует проекты по имени и поÑледнему компоненту пути\n"
+"Чтобы отфильтровать проекты по имени и полному пути, Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ Ñодержать "
+"Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ один Ñимвол `/`."
#: editor/project_settings_editor.cpp
msgid "Key "
@@ -10935,9 +10939,8 @@ msgid "Invalid inherited parent name or path."
msgstr "Ðеверное Ð¸Ð¼Ñ Ð¸Ð»Ð¸ путь наÑледуемого предка."
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Script path/name is valid."
-msgstr "Путь/Ð¸Ð¼Ñ Ñкрипта дейÑтвителен."
+msgstr "Путь/Ð¸Ð¼Ñ Ñкрипта допуÑтимы."
#: editor/script_create_dialog.cpp
msgid "Allowed: a-z, A-Z, 0-9, _ and ."
@@ -11089,9 +11092,8 @@ msgid "Total:"
msgstr "Ð’Ñего:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Export list to a CSV file"
-msgstr "ЭкÑпортировать профиль"
+msgstr "ЭкÑпортировать профиль в CSV файл"
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
@@ -12524,7 +12526,6 @@ msgid "PathFollow only works when set as a child of a Path node."
msgstr "PathFollow работает только при еÑли она дочь узла Path."
#: scene/3d/path.cpp
-#, fuzzy
msgid ""
"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its "
"parent Path's Curve resource."
diff --git a/editor/translations/sk.po b/editor/translations/sk.po
index d5730a7db9..295b7ac429 100644
--- a/editor/translations/sk.po
+++ b/editor/translations/sk.po
@@ -13,7 +13,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2020-04-23 20:21+0000\n"
+"PO-Revision-Date: 2020-05-01 11:42+0000\n"
"Last-Translator: Richard Urban <redasuio1@gmail.com>\n"
"Language-Team: Slovak <https://hosted.weblate.org/projects/godot-engine/"
"godot/sk/>\n"
@@ -22,7 +22,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
-"X-Generator: Weblate 4.0.2-dev\n"
+"X-Generator: Weblate 4.0.2\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -3034,6 +3034,13 @@ msgid ""
"the \"Use Custom Build\" option should be enabled in the Android export "
"preset."
msgstr ""
+"Toto pripraví vás projekt pre vlastný Android builds keÄ inÅ¡talujete source "
+"template do \"res://android/build\".\n"
+"Teraz môžete pridať modifikácie a tak vytvoriť vlastné APK na export "
+"(pridávanie modulov, zmeniÅ¥ AndroidManifest.xml, atÄ.).\n"
+"Poznámka že v záujme vytvorenia vlastných zostavení namiesto použitia vopred "
+"vytvorených súborov APK by mala byť v predvoľbe exportu systému Android "
+"povolená možnosť \"Use Costom Build\"."
#: editor/editor_node.cpp
msgid ""
@@ -3042,27 +3049,30 @@ msgid ""
"Remove the \"res://android/build\" directory manually before attempting this "
"operation again."
msgstr ""
+"V tomto projekte už je nainštalovaný Android build template a nemôže byť "
+"prepísaný.\n"
+"Manuálne odstránte \"res://android/build\" predtým ako sa znova pokúsite o "
+"túto operáciu."
#: editor/editor_node.cpp
msgid "Import Templates From ZIP File"
-msgstr ""
+msgstr "Importovať Šablóny Zo ZIP File-u"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Template Package"
-msgstr "Všetky vybrané"
+msgstr "BalíÄek Å ablón"
#: editor/editor_node.cpp
msgid "Export Library"
-msgstr ""
+msgstr "Exportovať Library"
#: editor/editor_node.cpp
msgid "Merge With Existing"
-msgstr ""
+msgstr "Spojiť Z Existujúcim"
#: editor/editor_node.cpp
msgid "Open & Run a Script"
-msgstr ""
+msgstr "Otvoriť & Spustiť Script"
#: editor/editor_node.cpp
#, fuzzy
diff --git a/editor/translations/uk.po b/editor/translations/uk.po
index 46e671a8a8..e713e79a4c 100644
--- a/editor/translations/uk.po
+++ b/editor/translations/uk.po
@@ -17,7 +17,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Ukrainian (Godot Engine)\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2020-04-20 05:51+0000\n"
+"PO-Revision-Date: 2020-05-01 11:43+0000\n"
"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
"Language-Team: Ukrainian <https://hosted.weblate.org/projects/godot-engine/"
"godot/uk/>\n"
@@ -27,7 +27,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 4.0.2-dev\n"
+"X-Generator: Weblate 4.0.2\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -9937,6 +9937,9 @@ msgid ""
"To filter projects by name and full path, the query must contain at least "
"one `/` character."
msgstr ""
+"Поле пошуку фільтрує проєкти за назвою Ñ– оÑтаннім компонентом шлÑху.\n"
+"Щоб виконати Ñ„Ñ–Ð»ÑŒÑ‚Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ñ”ÐºÑ‚Ñ–Ð² за назвою Ñ– повним шлÑхом, у запиті має "
+"бути принаймні один Ñимвол `/`."
#: editor/project_settings_editor.cpp
msgid "Key "
@@ -11055,9 +11058,8 @@ msgid "Total:"
msgstr "Загалом:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Export list to a CSV file"
-msgstr "ЕкÑпорт профілю"
+msgstr "ЕкÑпортувати ÑпиÑок до файла CSV"
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
diff --git a/editor/translations/zh_CN.po b/editor/translations/zh_CN.po
index 953ec63714..538e017a5d 100644
--- a/editor/translations/zh_CN.po
+++ b/editor/translations/zh_CN.po
@@ -64,8 +64,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Chinese (Simplified) (Godot Engine)\n"
"POT-Creation-Date: 2018-01-20 12:15+0200\n"
-"PO-Revision-Date: 2020-04-24 15:30+0000\n"
-"Last-Translator: Revan Ji <jiruifancr@gmail.com>\n"
+"PO-Revision-Date: 2020-05-01 11:42+0000\n"
+"Last-Translator: Haoyu Qiu <timothyqiu32@gmail.com>\n"
"Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/"
"godot-engine/godot/zh_Hans/>\n"
"Language: zh_CN\n"
@@ -73,7 +73,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 4.0.2-dev\n"
+"X-Generator: Weblate 4.0.2\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -5901,7 +5901,6 @@ msgstr ""
"这是最准确(但是最慢)的碰撞检测手段。"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-#, fuzzy
msgid "Create Single Convex Collision Sibling"
msgstr "创建å•ä¸€å‡¸ç¢°æ’žåŒçº§"
@@ -7211,9 +7210,8 @@ msgid "This operation requires a single selected node."
msgstr "æ­¤æ“作åªèƒ½åº”用于å•ä¸ªé€‰ä¸­èŠ‚点。"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Auto Orthogonal Enabled"
-msgstr "正交"
+msgstr "å¯ç”¨è‡ªåŠ¨æ­£äº¤"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
@@ -9774,6 +9772,8 @@ msgid ""
"To filter projects by name and full path, the query must contain at least "
"one `/` character."
msgstr ""
+"æœç´¢æ¡†æ ¹æ®å称和路径的末尾部分æ¥è¿‡æ»¤é¡¹ç›®ã€‚\n"
+"如果è¦æ ¹æ®å称和完整路径过滤,æœç´¢å†…容应至少包å«ä¸€ä¸ªâ€œ/â€å­—符。"
#: editor/project_settings_editor.cpp
msgid "Key "
@@ -10874,9 +10874,8 @@ msgid "Total:"
msgstr "åˆè®¡:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Export list to a CSV file"
-msgstr "导出é…置文件"
+msgstr "将列表导出为CSV文件"
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
@@ -12171,7 +12170,7 @@ msgstr "å¹³é¢å½¢çŠ¶æ— æ³•æ­£å¸¸å·¥ä½œï¼Œæœªæ¥ç‰ˆæœ¬å°†è¢«åˆ é™¤ã€‚请勿使用
#: scene/3d/collision_shape.cpp
msgid ""
"ConcavePolygonShape doesn't support RigidBody in another mode than static."
-msgstr ""
+msgstr "ConcavePolygonShape仅支æŒé™æ€RigidBody。"
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
diff --git a/editor/translations/zh_HK.po b/editor/translations/zh_HK.po
index e3d9a84cfb..770b4d38f2 100644
--- a/editor/translations/zh_HK.po
+++ b/editor/translations/zh_HK.po
@@ -2,27 +2,28 @@
# Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur.
# Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md).
# This file is distributed under the same license as the Godot source code.
-# Wesley (zx-wt) <ZX_WT@ymail.com>, 2016-2017.
+# Wesley (zx-wt) <ZX_WT@ymail.com>, 2016-2017, 2020.
# cnieFIT <dtotncq@gmail.com>, 2019.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2019-04-10 00:46+0000\n"
-"Last-Translator: cnieFIT <dtotncq@gmail.com>\n"
-"Language-Team: Chinese (Hong Kong) <https://hosted.weblate.org/projects/"
-"godot-engine/godot/zh_Hant_HK/>\n"
+"PO-Revision-Date: 2020-05-01 11:43+0000\n"
+"Last-Translator: zx-wt <ZX_WT@ymail.com>\n"
+"Language-Team: Chinese (Traditional, Hong Kong) <https://hosted.weblate.org/"
+"projects/godot-engine/godot/zh_Hant_HK/>\n"
"Language: zh_HK\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 3.6-dev\n"
+"X-Generator: Weblate 4.0.2\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
+#, fuzzy
msgid "Invalid type argument to convert(), use TYPE_* constants."
-msgstr ""
+msgstr "convert()çš„é¡žåž‹åƒæ•¸ç„¡æ•ˆ, 請使用 TYPE_* 常數。"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
msgid "Expected a string of length 1 (a character)."
@@ -68,19 +69,19 @@ msgstr ""
#: core/ustring.cpp
msgid "KiB"
-msgstr ""
+msgstr "KiB"
#: core/ustring.cpp
msgid "MiB"
-msgstr ""
+msgstr "MiB"
#: core/ustring.cpp
msgid "GiB"
-msgstr ""
+msgstr "GiB"
#: core/ustring.cpp
msgid "TiB"
-msgstr ""
+msgstr "TiB"
#: core/ustring.cpp
msgid "PiB"
@@ -88,20 +89,19 @@ msgstr ""
#: core/ustring.cpp
msgid "EiB"
-msgstr ""
+msgstr "PiB"
#: editor/animation_bezier_editor.cpp
msgid "Free"
-msgstr ""
+msgstr "自由"
#: editor/animation_bezier_editor.cpp
msgid "Balanced"
-msgstr ""
+msgstr "å¹³å‡"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Mirror"
-msgstr "錯誤!"
+msgstr "å°ç¨±"
#: editor/animation_bezier_editor.cpp editor/editor_profiler.cpp
msgid "Time:"
@@ -112,9 +112,8 @@ msgid "Value:"
msgstr ""
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Insert Key Here"
-msgstr "å‹•æ™æ’入關éµå¹€ï¼Ÿ"
+msgstr "在這æ’入關éµå¹€"
#: editor/animation_bezier_editor.cpp
#, fuzzy
@@ -127,14 +126,12 @@ msgid "Delete Selected Key(s)"
msgstr "刪除é¸ä¸­æª”案"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Add Bezier Point"
-msgstr "新增訊號"
+msgstr "新增Bezier節點"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Move Bezier Points"
-msgstr "下移"
+msgstr "Bezier節點下移"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Duplicate Keys"
@@ -158,9 +155,8 @@ msgid "Anim Change Transform"
msgstr ""
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Change Keyframe Value"
-msgstr "動畫變化數值"
+msgstr "動畫變化關éµå¹€æ•¸å€¼"
#: editor/animation_track_editor.cpp
msgid "Anim Change Call"
@@ -199,7 +195,7 @@ msgstr "更改動畫å稱:"
#: editor/animation_track_editor.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Change Animation Loop"
-msgstr ""
+msgstr "變更動畫循環"
#: editor/animation_track_editor.cpp
msgid "Property Track"
@@ -241,23 +237,21 @@ msgid "Add Track"
msgstr "新增動畫軌跡"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Looping"
-msgstr "動畫縮放。"
+msgstr "動畫循環"
#: editor/animation_track_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Functions:"
-msgstr "行為"
+msgstr ""
#: editor/animation_track_editor.cpp
msgid "Audio Clips:"
-msgstr ""
+msgstr "è²éŸ³ç‰‡æ®µï¼š"
#: editor/animation_track_editor.cpp
msgid "Anim Clips:"
-msgstr ""
+msgstr "動畫片段:"
#: editor/animation_track_editor.cpp
msgid "Change Track Path"
@@ -272,9 +266,8 @@ msgid "Update Mode (How this property is set)"
msgstr ""
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Interpolation Mode"
-msgstr "無干擾模å¼"
+msgstr "模å¼"
#: editor/animation_track_editor.cpp
msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
@@ -311,11 +304,11 @@ msgstr "發動"
#: editor/animation_track_editor.cpp
msgid "Capture"
-msgstr ""
+msgstr "æ•æ‰"
#: editor/animation_track_editor.cpp
msgid "Nearest"
-msgstr ""
+msgstr "最近"
#: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp
#: editor/property_editor.cpp
@@ -337,7 +330,7 @@ msgstr ""
#: editor/animation_track_editor.cpp
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key"
-msgstr ""
+msgstr "æ’入動畫幀"
#: editor/animation_track_editor.cpp
#, fuzzy
@@ -447,16 +440,15 @@ msgstr ""
#: editor/animation_track_editor.cpp
msgid "Not possible to add a new track without a root"
-msgstr ""
+msgstr "沒有ROOT以新增新動畫軌跡"
#: editor/animation_track_editor.cpp
msgid "Invalid track for Bezier (no suitable sub-properties)"
msgstr ""
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Bezier Track"
-msgstr "新增動畫軌跡"
+msgstr "新增Bezier軌跡"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a key."
@@ -571,14 +563,12 @@ msgid "Edit"
msgstr "編輯"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation properties."
-msgstr "新增動畫"
+msgstr "動畫內容。"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Copy Tracks"
-msgstr "複製åƒæ•¸"
+msgstr "複製"
#: editor/animation_track_editor.cpp
msgid "Scale Selection"
@@ -701,9 +691,8 @@ msgid "Select All/None"
msgstr "ä¸é¸"
#: editor/animation_track_editor_plugins.cpp
-#, fuzzy
msgid "Add Audio Track Clip"
-msgstr "新增動畫軌跡"
+msgstr "新增è²éŸ³è»Œè·¡ç‰‡æ®µ"
#: editor/animation_track_editor_plugins.cpp
msgid "Change Audio Track Clip Start Offset"
@@ -734,18 +723,16 @@ msgid "Line Number:"
msgstr "行數:"
#: editor/code_editor.cpp
-#, fuzzy
msgid "%d replaced."
-msgstr "å–代"
+msgstr "å·²å–代 %d。"
#: editor/code_editor.cpp editor/editor_help.cpp
msgid "%d match."
msgstr ""
#: editor/code_editor.cpp editor/editor_help.cpp
-#, fuzzy
msgid "%d matches."
-msgstr "沒有相åŒ"
+msgstr "%d 相åŒã€‚"
#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
@@ -795,7 +782,7 @@ msgstr "é‡è¨­ç¸®æ”¾æ¯”例"
#: editor/code_editor.cpp
msgid "Warnings"
-msgstr ""
+msgstr "警告"
#: editor/code_editor.cpp
msgid "Line and column numbers."
@@ -817,18 +804,16 @@ msgid "Connect to Node:"
msgstr "連到:"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect to Script:"
-msgstr "ä¸èƒ½é€£åˆ°ä¸»æ©Ÿï¼š"
+msgstr "連到腳本:"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "From Signal:"
-msgstr "訊號:"
+msgstr "來自訊號:"
#: editor/connections_dialog.cpp
msgid "Scene does not contain any script."
-msgstr ""
+msgstr "場景沒有å«æœ‰ä»»ä½•è…³æœ¬ã€‚"
#: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp
#: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp
@@ -856,17 +841,16 @@ msgid "Extra Call Arguments:"
msgstr ""
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Receiver Method:"
-msgstr "é¸æ“‡æ¨¡å¼"
+msgstr "接收模å¼ï¼š"
#: editor/connections_dialog.cpp
msgid "Advanced"
-msgstr ""
+msgstr "進階"
#: editor/connections_dialog.cpp
msgid "Deferred"
-msgstr ""
+msgstr "延é²"
#: editor/connections_dialog.cpp
msgid ""
@@ -875,16 +859,15 @@ msgstr ""
#: editor/connections_dialog.cpp
msgid "Oneshot"
-msgstr ""
+msgstr "åªé™ä¸€æ¬¡"
#: editor/connections_dialog.cpp
msgid "Disconnects the signal after its first emission."
msgstr ""
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Cannot connect signal"
-msgstr "連接訊號:"
+msgstr "無法連接訊號"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/export_template_manager.cpp editor/groups_editor.cpp
@@ -956,9 +939,8 @@ msgid "Are you sure you want to remove all connections from this signal?"
msgstr ""
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Disconnect All"
-msgstr "中斷"
+msgstr "中斷全部"
#: editor/connections_dialog.cpp
#, fuzzy
@@ -1142,7 +1124,7 @@ msgstr "刪除"
#: editor/dependency_editor.cpp
msgid "Owns"
-msgstr ""
+msgstr "æ“有"
#: editor/dependency_editor.cpp
msgid "Resources Without Explicit Ownership:"
@@ -1166,19 +1148,16 @@ msgid "Godot Engine contributors"
msgstr "Godot Engine è²¢ç»è€…"
#: editor/editor_about.cpp
-#, fuzzy
msgid "Project Founders"
-msgstr "專案設定"
+msgstr "專案開è’人"
#: editor/editor_about.cpp
-#, fuzzy
msgid "Lead Developer"
-msgstr "開發者"
+msgstr "主è¦é–‹ç™¼è€…"
#: editor/editor_about.cpp
-#, fuzzy
msgid "Project Manager "
-msgstr "é–‹å•Ÿ Project Manager?"
+msgstr "é–‹å•Ÿ Project Manager "
#: editor/editor_about.cpp
msgid "Developers"
@@ -1210,7 +1189,7 @@ msgstr "白銀級æ款人"
#: editor/editor_about.cpp
msgid "Bronze Donors"
-msgstr "é’銅æ款人"
+msgstr "é’銅級æ款人"
#: editor/editor_about.cpp
msgid "Donors"
@@ -1304,14 +1283,12 @@ msgid "Add Effect"
msgstr "新增效果"
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Rename Audio Bus"
-msgstr "é‡æ–°å‘½åAutoload"
+msgstr "é‡æ–°å‘½åAudio Bus"
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Change Audio Bus Volume"
-msgstr "動畫變化數值"
+msgstr "變更Audio Busè²é‡"
#: editor/editor_audio_buses.cpp
msgid "Toggle Audio Bus Solo"
@@ -1338,9 +1315,8 @@ msgid "Move Bus Effect"
msgstr ""
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Delete Bus Effect"
-msgstr "刪除é¸ä¸­æª”案"
+msgstr "刪除Bus Effect"
#: editor/editor_audio_buses.cpp
msgid "Drag & drop to rearrange."
@@ -1348,7 +1324,7 @@ msgstr ""
#: editor/editor_audio_buses.cpp
msgid "Solo"
-msgstr ""
+msgstr "Solo"
#: editor/editor_audio_buses.cpp
msgid "Mute"
@@ -1367,7 +1343,7 @@ msgstr "é¸é …"
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
-msgstr "複製"
+msgstr "å†è£½"
#: editor/editor_audio_buses.cpp
#, fuzzy
@@ -1397,9 +1373,8 @@ msgid "Delete Audio Bus"
msgstr "刪除佈局"
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Duplicate Audio Bus"
-msgstr "複製"
+msgstr "å†è£½ Audio Bus"
#: editor/editor_audio_buses.cpp
#, fuzzy
@@ -1407,9 +1382,8 @@ msgid "Reset Bus Volume"
msgstr "é‡è¨­ç¸®æ”¾æ¯”例"
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Move Audio Bus"
-msgstr "移動"
+msgstr "移動 Audio Bus"
#: editor/editor_audio_buses.cpp
msgid "Save Audio Bus Layout As..."
@@ -1428,9 +1402,8 @@ msgid "There is no '%s' file."
msgstr ""
#: editor/editor_audio_buses.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Layout"
-msgstr "儲存佈局"
+msgstr "佈局"
#: editor/editor_audio_buses.cpp
msgid "Invalid file, not an audio bus layout."
@@ -1483,7 +1456,7 @@ msgstr ""
#: editor/editor_autoload_settings.cpp
msgid "Invalid name."
-msgstr "無效å稱"
+msgstr "無效å稱。"
#: editor/editor_autoload_settings.cpp
#, fuzzy
@@ -1491,19 +1464,16 @@ msgid "Valid characters:"
msgstr "有效字符:"
#: editor/editor_autoload_settings.cpp
-#, fuzzy
msgid "Must not collide with an existing engine class name."
-msgstr "有效å稱。"
+msgstr ""
#: editor/editor_autoload_settings.cpp
-#, fuzzy
msgid "Must not collide with an existing built-in type name."
-msgstr "有效å稱。"
+msgstr ""
#: editor/editor_autoload_settings.cpp
-#, fuzzy
msgid "Must not collide with an existing global constant name."
-msgstr "有效å稱。"
+msgstr ""
#: editor/editor_autoload_settings.cpp
msgid "Keyword cannot be used as an autoload name."
@@ -1571,7 +1541,7 @@ msgstr "路徑:"
#: editor/editor_autoload_settings.cpp
msgid "Node Name:"
-msgstr ""
+msgstr "Nodeå稱"
#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
#: editor/editor_profiler.cpp editor/project_manager.cpp
@@ -1602,16 +1572,15 @@ msgstr "正在更新場景..."
#: editor/editor_data.cpp editor/editor_properties.cpp
msgid "[empty]"
-msgstr ""
+msgstr "[空]"
#: editor/editor_data.cpp
msgid "[unsaved]"
-msgstr ""
+msgstr "[未儲存]"
#: editor/editor_dir_dialog.cpp
-#, fuzzy
msgid "Please select a base directory first."
-msgstr "請先儲存場景"
+msgstr "è«‹å…ˆé¸æ“‡ä¸»è¦è³‡æ–™å¤¾ã€‚"
#: editor/editor_dir_dialog.cpp
msgid "Choose a Directory"
@@ -1674,9 +1643,8 @@ msgstr ""
#: editor/editor_export.cpp platform/android/export/export.cpp
#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp
#: platform/osx/export/export.cpp platform/uwp/export/export.cpp
-#, fuzzy
msgid "Custom debug template not found."
-msgstr "未找到佈局å稱ï¼"
+msgstr ""
#: editor/editor_export.cpp platform/android/export/export.cpp
#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp
@@ -1685,23 +1653,20 @@ msgid "Custom release template not found."
msgstr ""
#: editor/editor_export.cpp platform/javascript/export/export.cpp
-#, fuzzy
msgid "Template file not found:"
-msgstr "未找到佈局å稱ï¼"
+msgstr ""
#: editor/editor_export.cpp
msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB."
msgstr ""
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "3D Editor"
-msgstr "編輯器"
+msgstr "3D編輯器"
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Script Editor"
-msgstr "開啟資料夾"
+msgstr ""
#: editor/editor_feature_profile.cpp
#, fuzzy
@@ -1747,9 +1712,8 @@ msgid "(Editor Disabled, Properties Disabled)"
msgstr ""
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "(Properties Disabled)"
-msgstr "é¸æ“‡æ¨¡å¼"
+msgstr ""
#: editor/editor_feature_profile.cpp
#, fuzzy
@@ -1799,9 +1763,8 @@ msgid "Unset"
msgstr ""
#: editor/editor_feature_profile.cpp
-#, fuzzy
msgid "Current Profile:"
-msgstr "新增資料夾"
+msgstr ""
#: editor/editor_feature_profile.cpp
msgid "Make Current"
@@ -1881,15 +1844,13 @@ msgid "Copy Path"
msgstr "複製路徑"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-#, fuzzy
msgid "Open in File Manager"
-msgstr "é–‹å•Ÿ Project Manager?"
+msgstr "在Project Manager開啟"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
#: editor/filesystem_dock.cpp editor/project_manager.cpp
-#, fuzzy
msgid "Show in File Manager"
-msgstr "é–‹å•Ÿ Project Manager?"
+msgstr "在Project Manager顯示"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#, fuzzy
@@ -1903,7 +1864,7 @@ msgstr "é‡æ–°æ•´ç†"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "All Recognized"
-msgstr "所有類型"
+msgstr "所有已知類型"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "All Files (*)"
@@ -1915,7 +1876,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"
@@ -1937,16 +1898,18 @@ msgid "Save a File"
msgstr "儲存檔案"
#: editor/editor_file_dialog.cpp
+#, fuzzy
msgid "Go Back"
-msgstr ""
+msgstr "å‘後"
#: editor/editor_file_dialog.cpp
+#, fuzzy
msgid "Go Forward"
-msgstr ""
+msgstr "å‘å‰"
#: editor/editor_file_dialog.cpp
msgid "Go Up"
-msgstr ""
+msgstr "å‘上"
#: editor/editor_file_dialog.cpp
msgid "Toggle Hidden Files"
@@ -1975,14 +1938,12 @@ msgid "Move Favorite Down"
msgstr "下移最愛"
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to previous folder."
-msgstr "無法新增資料夾"
+msgstr "回到上一個資料夾。"
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go to next folder."
-msgstr "無法新增資料夾"
+msgstr "下一個資料夾"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
#, fuzzy
@@ -2028,7 +1989,7 @@ msgstr "檔案:"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Must use a valid extension."
-msgstr "請用有效的副檔å"
+msgstr "請用有效的副檔å。"
#: editor/editor_file_system.cpp
msgid "ScanSources"
@@ -2069,13 +2030,12 @@ msgid "Description"
msgstr "æ述:"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Online Tutorials"
-msgstr "關閉場景"
+msgstr "Online教學"
#: editor/editor_help.cpp
msgid "Properties"
-msgstr ""
+msgstr "內客"
#: editor/editor_help.cpp
msgid "override:"
@@ -2158,29 +2118,24 @@ msgid "Classes Only"
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
msgid "Member Type"
@@ -2191,9 +2146,8 @@ msgid "Class"
msgstr ""
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Method"
-msgstr "é¸æ“‡æ¨¡å¼"
+msgstr ""
#: editor/editor_help_search.cpp editor/plugins/script_text_editor.cpp
#, fuzzy
@@ -2205,14 +2159,12 @@ msgid "Constant"
msgstr "常數"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Property"
-msgstr "é¸æ“‡æ¨¡å¼"
+msgstr "內容"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Theme Property"
-msgstr "篩é¸:"
+msgstr ""
#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
msgid "Property:"
@@ -2231,9 +2183,8 @@ msgid "Output:"
msgstr ""
#: editor/editor_log.cpp editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Copy Selection"
-msgstr "移除é¸é …"
+msgstr "複製é¸é …"
#: editor/editor_log.cpp editor/editor_network_profiler.cpp
#: editor/editor_profiler.cpp editor/editor_properties.cpp
@@ -2265,9 +2216,8 @@ msgid "%s/s"
msgstr ""
#: editor/editor_network_profiler.cpp
-#, fuzzy
msgid "Down"
-msgstr "下載"
+msgstr ""
#: editor/editor_network_profiler.cpp
msgid "Up"
@@ -2322,14 +2272,12 @@ msgid "Save Resource As..."
msgstr "把資æºå¦å­˜ç‚º..."
#: editor/editor_node.cpp
-#, fuzzy
msgid "Can't open file for writing:"
-msgstr "ä¸èƒ½å¯«å…¥ï¼Œä¸èƒ½é–‹å•Ÿæª”案:"
+msgstr "ä¸èƒ½é–‹å•Ÿæª”案以供寫入:"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Requested file format unknown:"
-msgstr "è¦æ±‚的檔案格å¼æœªçŸ¥ï¼š"
+msgstr "è¦æ±‚的檔案格å¼ä¸æ˜Žï¼š"
#: editor/editor_node.cpp
msgid "Error while saving."
@@ -3501,15 +3449,16 @@ msgstr "你是å¦å¿˜äº†é—œéµè©ž 'tool' ?"
#: editor/editor_run_script.cpp
msgid "Couldn't run script:"
-msgstr ""
+msgstr "ä¸èƒ½åŸ·è¡Œè…³æœ¬ï¼š"
#: editor/editor_run_script.cpp
msgid "Did you forget the '_run' method?"
msgstr ""
#: editor/editor_sub_scene.cpp
+#, fuzzy
msgid "Select Node(s) to Import"
-msgstr ""
+msgstr "é¸æ“‡è¦å°Žå…¥çš„Node(s)"
#: editor/editor_sub_scene.cpp editor/project_manager.cpp
msgid "Browse"
@@ -3521,7 +3470,7 @@ msgstr "場景路徑:"
#: editor/editor_sub_scene.cpp
msgid "Import From Node:"
-msgstr ""
+msgstr "從Node導入:"
#: editor/export_template_manager.cpp
#, fuzzy
@@ -3542,59 +3491,66 @@ msgid "Download"
msgstr "下載"
#: editor/export_template_manager.cpp
+#, fuzzy
msgid "Official export templates aren't available for development builds."
-msgstr ""
+msgstr "Development builds未能æ供官方export templates。"
#: editor/export_template_manager.cpp
msgid "(Missing)"
-msgstr ""
+msgstr "(欠缺)"
#: editor/export_template_manager.cpp
+#, fuzzy
msgid "(Current)"
-msgstr ""
+msgstr "(Current)"
#: editor/export_template_manager.cpp
+#, fuzzy
msgid "Retrieving mirrors, please wait..."
-msgstr ""
+msgstr "接收 mirrors中, è«‹ç¨ä¾¯..."
#: editor/export_template_manager.cpp
+#, fuzzy
msgid "Remove template version '%s'?"
-msgstr ""
+msgstr "移除版本 '%s' 的範本?"
#: editor/export_template_manager.cpp
+#, fuzzy
msgid "Can't open export templates zip."
-msgstr ""
+msgstr "ä¸èƒ½é–‹å•Ÿexport templatesçš„zip壓縮檔。"
#: editor/export_template_manager.cpp
#, fuzzy
msgid "Invalid version.txt format inside templates: %s."
-msgstr "無效的 version.txt æ ¼å¼ inside templates."
+msgstr "範本文件: %s 中的 version.txt æ ¼å¼ç„¡æ•ˆã€‚"
#: editor/export_template_manager.cpp
#, fuzzy
msgid "No version.txt found inside templates."
-msgstr "找ä¸åˆ°version.txt inside templates."
+msgstr "範本中找ä¸åˆ°version.txt。"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Error creating path for templates:"
-msgstr "載入字形出ç¾éŒ¯èª¤"
+msgstr "範本創造路徑時出ç¾éŒ¯èª¤ï¼š"
#: editor/export_template_manager.cpp
+#, fuzzy
msgid "Extracting Export Templates"
-msgstr ""
+msgstr "正在解壓Export Templates"
#: editor/export_template_manager.cpp
msgid "Importing:"
-msgstr "導入中:"
+msgstr "導入中:"
#: editor/export_template_manager.cpp
+#, fuzzy
msgid "Error getting the list of mirrors."
-msgstr ""
+msgstr "å–å¾—mirrors列表時出錯。"
#: editor/export_template_manager.cpp
+#, fuzzy
msgid "Error parsing JSON of mirror list. Please report this issue!"
-msgstr ""
+msgstr "parsing mirror列表的JSON出錯。 請回報此å•é¡Œï¼"
#: editor/export_template_manager.cpp
#, fuzzy
@@ -3605,8 +3561,9 @@ msgstr "找ä¸åˆ°é€™å€‹ç‰ˆæœ¬çš„下載連çµã€‚直接下載åªé©ç”¨æ–¼official
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
msgid "Can't resolve."
-msgstr ""
+msgstr "無法解決。"
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -3624,8 +3581,9 @@ msgid "Request Failed."
msgstr "請求失敗。"
#: editor/export_template_manager.cpp
+#, fuzzy
msgid "Redirect Loop."
-msgstr ""
+msgstr "é‡æ–°å®šå‘循環。"
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -3633,49 +3591,49 @@ msgid "Failed:"
msgstr "失敗:"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Download Complete."
-msgstr "下載出ç¾éŒ¯èª¤"
+msgstr "下載完æˆã€‚"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Cannot remove temporary file:"
-msgstr "無法移除:\n"
+msgstr "無法移除暫存檔:"
#: editor/export_template_manager.cpp
+#, fuzzy
msgid ""
"Templates installation failed.\n"
"The problematic templates archives can be found at '%s'."
msgstr ""
+"Templates安è£å¤±æ•—。\n"
+"出ç¾å•é¡Œçš„templates 存檔å¯ä»¥åœ¨ \"%s\" 中找到。"
#: editor/export_template_manager.cpp
#, fuzzy
msgid "Error requesting URL:"
-msgstr "請求時出ç¾éŒ¯èª¤"
+msgstr "請求URL時出ç¾éŒ¯èª¤ï¼š"
#: editor/export_template_manager.cpp
#, fuzzy
msgid "Connecting to Mirror..."
-msgstr "連到..."
+msgstr "正在連到Mirror..."
#: editor/export_template_manager.cpp
#, fuzzy
msgid "Disconnected"
-msgstr "中斷"
+msgstr "æ–·ç·š"
#: editor/export_template_manager.cpp
msgid "Resolving"
-msgstr ""
+msgstr "解決中"
#: editor/export_template_manager.cpp
msgid "Can't Resolve"
-msgstr ""
+msgstr "ä¸èƒ½è§£æ±º"
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Connecting..."
-msgstr "連到..."
+msgstr "連接中..."
#: editor/export_template_manager.cpp
#, fuzzy
@@ -3685,7 +3643,7 @@ msgstr "ä¸èƒ½é€£æŽ¥ã€‚"
#: editor/export_template_manager.cpp
#, fuzzy
msgid "Connected"
-msgstr "連到"
+msgstr "已連線"
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -3695,63 +3653,61 @@ msgstr "請求中..."
#: editor/export_template_manager.cpp
#, fuzzy
msgid "Downloading"
-msgstr "下載出ç¾éŒ¯èª¤"
+msgstr "下載中"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Connection Error"
-msgstr "連到..."
+msgstr "連接出錯"
#: editor/export_template_manager.cpp
+#, fuzzy
msgid "SSL Handshake Error"
-msgstr ""
+msgstr "SSL Handshake出錯"
#: editor/export_template_manager.cpp
#, fuzzy
msgid "Uncompressing Android Build Sources"
-msgstr "導入中:"
+msgstr "正在解壓Android Build Sources"
#: editor/export_template_manager.cpp
+#, fuzzy
msgid "Current Version:"
-msgstr ""
+msgstr "當å‰ç‰ˆæœ¬ï¼š"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Installed Versions:"
-msgstr "無效副檔å"
+msgstr "已安è£çš„版本:"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Install From File"
-msgstr "從檔案下載"
+msgstr "從檔案安è£"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Remove Template"
-msgstr "移除é¸é …"
+msgstr "移除Template"
#: editor/export_template_manager.cpp
#, fuzzy
msgid "Select Template File"
-msgstr "è¦åˆªé™¤é¸ä¸­æª”案?"
+msgstr "é¸å–Template檔案"
#: editor/export_template_manager.cpp
#, fuzzy
msgid "Godot Export Templates"
-msgstr "管ç†è¼¸å‡ºç¯„本"
+msgstr "Godot輸出範本"
#: editor/export_template_manager.cpp
+#, fuzzy
msgid "Export Template Manager"
-msgstr ""
+msgstr "Export Template管ç†å™¨"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Download Templates"
-msgstr "移除é¸é …"
+msgstr "下載Templates"
#: editor/export_template_manager.cpp
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
-msgstr ""
+msgstr "從清單中é¸æ“‡é¡åƒ: (Shift + 單擊: 在ç€è¦½å™¨ä¸­æ‰“é–‹)"
#: editor/filesystem_dock.cpp
#, fuzzy
@@ -3759,77 +3715,73 @@ msgid "Favorites"
msgstr "最愛:"
#: editor/filesystem_dock.cpp
+#, fuzzy
msgid "Status: Import of file failed. Please fix file and reimport manually."
-msgstr ""
+msgstr "狀態:導入檔案失敗。請修正檔案並å†æ‰‹å‹•å°Žå…¥ã€‚"
#: editor/filesystem_dock.cpp
+#, fuzzy
msgid "Cannot move/rename resources root."
-msgstr ""
+msgstr "ä¸èƒ½ç§»å‹•ï¼é‡æ–°å‘½å resources root."
#: editor/filesystem_dock.cpp
msgid "Cannot move a folder into itself."
-msgstr ""
+msgstr "ä¸èƒ½ç§»å‹•è³‡æ–™å¤¾åˆ°è³‡æ–™å¤¾è‡ªèº«ã€‚"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Error moving:"
-msgstr "載入錯誤:"
+msgstr "移動錯誤:"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Error duplicating:"
-msgstr "載入錯誤:"
+msgstr "å†è£½æ™‚出錯:"
#: editor/filesystem_dock.cpp
+#, fuzzy
msgid "Unable to update dependencies:"
-msgstr ""
+msgstr "未能更新dependencies:"
#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
msgid "No name provided."
-msgstr ""
+msgstr "沒有æä¾›å字。"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Provided name contains invalid characters."
-msgstr "有效字符:"
+msgstr "æ供的åå­—å«æœ‰ç„¡æ•ˆå­—符。"
#: editor/filesystem_dock.cpp
msgid "A file or folder with this name already exists."
-msgstr ""
+msgstr "具有此å稱的檔或資料夾已存在。"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Name contains invalid characters."
-msgstr "有效字符:"
+msgstr "åå­—å«æœ‰ç„¡æ•ˆå­—符。"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Renaming file:"
-msgstr "儲存TileSet時出ç¾éŒ¯èª¤ï¼"
+msgstr "é‡æ–°å‘½å檔案:"
#: editor/filesystem_dock.cpp
msgid "Renaming folder:"
-msgstr ""
+msgstr "é‡æ–°å‘½å資料夾:"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Duplicating file:"
-msgstr "複製"
+msgstr "å†è£½æª”案:"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Duplicating folder:"
-msgstr "複製"
+msgstr "å†è£½è³‡æ–™å¤¾ï¼š"
#: editor/filesystem_dock.cpp
#, fuzzy
msgid "New Inherited Scene"
-msgstr "下一個腳本"
+msgstr "新增 Inherited Scene"
#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Set As Main Scene"
-msgstr "é¸æ“‡ä¸»å ´æ™¯"
+msgstr "設家æˆä¸»å ´æ™¯"
#: editor/filesystem_dock.cpp
#, fuzzy
@@ -3837,22 +3789,22 @@ msgid "Open Scenes"
msgstr "開啓場景"
#: editor/filesystem_dock.cpp
+#, fuzzy
msgid "Instance"
-msgstr ""
+msgstr "Instance"
#: 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..."
-msgstr ""
+msgstr "編輯Dependencies..."
#: editor/filesystem_dock.cpp
msgid "View Owners..."
@@ -3864,9 +3816,8 @@ msgid "Rename..."
msgstr "é‡æ–°å‘½å..."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Duplicate..."
-msgstr "複製"
+msgstr "å†è£½..."
#: editor/filesystem_dock.cpp
#, fuzzy
@@ -3874,37 +3825,33 @@ msgid "Move To..."
msgstr "æ¬åˆ°..."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "New Scene..."
-msgstr "新增場景"
+msgstr "新增場景..."
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "New Script..."
-msgstr "下一個腳本"
+msgstr "新增腳本..."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "New Resource..."
-msgstr "把資æºå¦å­˜ç‚º..."
+msgstr "新增資æº..."
#: editor/filesystem_dock.cpp editor/plugins/visual_shader_editor_plugin.cpp
#: editor/script_editor_debugger.cpp
msgid "Expand All"
-msgstr ""
+msgstr "全部展開"
#: editor/filesystem_dock.cpp editor/plugins/visual_shader_editor_plugin.cpp
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Collapse All"
-msgstr "關閉"
+msgstr "全部折疊"
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
#: editor/project_manager.cpp editor/rename_dialog.cpp
#: editor/scene_tree_dock.cpp
msgid "Rename"
-msgstr "é‡æ–°å‘½å..."
+msgstr "é‡æ–°å‘½å"
#: editor/filesystem_dock.cpp
#, fuzzy
@@ -3912,18 +3859,18 @@ msgid "Previous Folder/File"
msgstr "上一個tab"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Next Folder/File"
-msgstr "新增資料夾"
+msgstr "下一個資料夾ï¼æª”案"
#: editor/filesystem_dock.cpp
+#, fuzzy
msgid "Re-Scan Filesystem"
-msgstr ""
+msgstr "é‡æ–°æŽƒæ檔案系統"
#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Toggle Split Mode"
-msgstr "(ä¸ï¼‰é¡¯ç¤ºéš±è—的文件"
+msgstr "切æ›Split 模å¼"
#: editor/filesystem_dock.cpp
#, fuzzy
@@ -3931,10 +3878,11 @@ msgid "Search files"
msgstr "在幫助檔æœå°‹"
#: editor/filesystem_dock.cpp
+#, fuzzy
msgid ""
"Scanning Files,\n"
"Please Wait..."
-msgstr ""
+msgstr "正在掃æ檔案, è«‹ç¨å€™..."
#: editor/filesystem_dock.cpp
msgid "Move"
@@ -3942,35 +3890,35 @@ msgstr "移動"
#: editor/filesystem_dock.cpp
msgid "There is already file or folder with the same name in this location."
-msgstr ""
+msgstr "æ­¤ä½ç½®å·²å­˜åœ¨åŒå的檔案或資料夾。"
#: editor/filesystem_dock.cpp
+#, fuzzy
msgid "Overwrite"
-msgstr ""
+msgstr "覆蓋"
#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Create Scene"
-msgstr "儲存場景"
+msgstr "新增場景"
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#, fuzzy
msgid "Create Script"
-msgstr ""
+msgstr "新增腳本"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "Find in Files"
-msgstr "多 %d 檔案"
+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
@@ -3978,169 +3926,166 @@ msgid "Filters:"
msgstr "篩é¸:"
#: editor/find_in_files.cpp
+#, fuzzy
msgid ""
"Include the files with the following extensions. Add or remove them in "
"ProjectSettings."
-msgstr ""
+msgstr "包å«ä¸‹åˆ—副檔å的文件。在ProjectSettings增加或移除。"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
msgid "Find..."
-msgstr ""
+msgstr "尋找..."
#: editor/find_in_files.cpp editor/plugins/script_text_editor.cpp
+#, fuzzy
msgid "Replace..."
-msgstr ""
+msgstr "替æ›â€¦"
#: editor/find_in_files.cpp editor/progress_dialog.cpp scene/gui/dialogs.cpp
msgid "Cancel"
msgstr "å–消"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Find: "
-msgstr "尋找"
+msgstr "尋找: "
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Replace: "
-msgstr "å–代"
+msgstr "å–代: "
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Replace all (no undo)"
-msgstr "全部å–代"
+msgstr "全部å–代(ä¸å¯é‚„原)"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Searching..."
-msgstr "儲存中..."
+msgstr "æœå°‹ä¸­..."
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Search complete"
-msgstr "在幫助檔æœå°‹"
+msgstr "æœå°‹å®Œæˆ"
#: editor/groups_editor.cpp
+#, fuzzy
msgid "Add to Group"
-msgstr ""
+msgstr "加到Group"
#: editor/groups_editor.cpp
msgid "Remove from Group"
-msgstr ""
+msgstr "從Group中移除"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Group name already exists."
-msgstr "錯誤:動畫å稱已存在ï¼"
+msgstr "錯誤:groupå稱已存在。"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Invalid group name."
-msgstr "無效å稱"
+msgstr "無效groupå稱。"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Rename Group"
-msgstr "專案"
+msgstr "é‡æ–°å‘½åGroup"
#: editor/groups_editor.cpp
#, fuzzy
msgid "Delete Group"
-msgstr "刪除佈局"
+msgstr "刪除Group"
#: editor/groups_editor.cpp editor/node_dock.cpp
+#, fuzzy
msgid "Groups"
-msgstr ""
+msgstr "Groups"
#: editor/groups_editor.cpp
msgid "Nodes Not in Group"
-msgstr ""
+msgstr "ä¸åœ¨Group內的Nodes"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
#: editor/scene_tree_editor.cpp
#, fuzzy
msgid "Filter nodes"
-msgstr "篩é¸:"
+msgstr "篩é¸nodes:"
#: editor/groups_editor.cpp
msgid "Nodes in Group"
-msgstr ""
+msgstr "Group中的Nodes"
#: editor/groups_editor.cpp
msgid "Empty groups will be automatically removed."
-msgstr ""
+msgstr "空groups會被移除。"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Group Editor"
-msgstr "開啟資料夾"
+msgstr "Group編輯器"
#: editor/groups_editor.cpp
msgid "Manage Groups"
-msgstr ""
+msgstr "管ç†groups"
#: editor/import/resource_importer_scene.cpp
#, fuzzy
msgid "Import as Single Scene"
-msgstr "更新場景"
+msgstr "導入為單一場景"
#: editor/import/resource_importer_scene.cpp
+#, fuzzy
msgid "Import with Separate Animations"
-msgstr ""
+msgstr "以分開的動畫導入"
#: editor/import/resource_importer_scene.cpp
msgid "Import with Separate Materials"
-msgstr ""
+msgstr "以分開的Materials導入"
#: editor/import/resource_importer_scene.cpp
msgid "Import with Separate Objects"
-msgstr ""
+msgstr "以分開的物件導入"
#: editor/import/resource_importer_scene.cpp
msgid "Import with Separate Objects+Materials"
-msgstr ""
+msgstr "以分開的物件+Materials導入"
#: editor/import/resource_importer_scene.cpp
+#, fuzzy
msgid "Import with Separate Objects+Animations"
-msgstr ""
+msgstr "以分開的物件+動畫導入"
#: editor/import/resource_importer_scene.cpp
msgid "Import with Separate Materials+Animations"
-msgstr ""
+msgstr "以分開的Materials+動畫導入"
#: editor/import/resource_importer_scene.cpp
msgid "Import with Separate Objects+Materials+Animations"
-msgstr ""
+msgstr "以分開的物件+Materials+動畫導入"
#: editor/import/resource_importer_scene.cpp
msgid "Import as Multiple Scenes"
-msgstr ""
+msgstr "導入為多個場景"
#: editor/import/resource_importer_scene.cpp
msgid "Import as Multiple Scenes+Materials"
-msgstr ""
+msgstr "導入為多個場景+Materials"
#: editor/import/resource_importer_scene.cpp
#: editor/plugins/mesh_library_editor_plugin.cpp
msgid "Import Scene"
-msgstr ""
+msgstr "導入場景"
#: editor/import/resource_importer_scene.cpp
msgid "Importing Scene..."
-msgstr ""
+msgstr "導入場景中..."
#: editor/import/resource_importer_scene.cpp
msgid "Generating Lightmaps"
-msgstr ""
+msgstr "光照圖生æˆä¸­"
#: editor/import/resource_importer_scene.cpp
msgid "Generating for Mesh: "
-msgstr ""
+msgstr "為Mesh生æˆä¸­ï¼š "
#: editor/import/resource_importer_scene.cpp
msgid "Running Custom Script..."
-msgstr ""
+msgstr "正在é‹è¡Œè‡ªå®šç¾©è…³æœ¬..."
#: editor/import/resource_importer_scene.cpp
msgid "Couldn't load post-import script:"
@@ -9101,15 +9046,15 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Equal (==)"
-msgstr ""
+msgstr "等於 (==)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Greater Than (>)"
-msgstr ""
+msgstr "大於(>)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Greater Than or Equal (>=)"
-msgstr ""
+msgstr "大於或等於(>=)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9131,15 +9076,15 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Less Than (<)"
-msgstr ""
+msgstr "å°æ–¼ (<)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Less Than or Equal (<=)"
-msgstr ""
+msgstr "å°æ–¼æˆ–等於 (<=)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Not Equal (!=)"
-msgstr ""
+msgstr "ä¸ç­‰æ–¼ (!=)"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -10833,23 +10778,24 @@ msgstr ""
#: editor/scene_tree_dock.cpp
msgid "Move Nodes In Parent"
-msgstr ""
+msgstr "在Parent內移動Nodes"
#: editor/scene_tree_dock.cpp
msgid "Duplicate Node(s)"
-msgstr ""
+msgstr "å†è£½Node"
#: editor/scene_tree_dock.cpp
msgid "Can't reparent nodes in inherited scenes, order of nodes can't change."
-msgstr ""
+msgstr "ä¸èƒ½åœ¨inherited sceneså…§reparent nodes,nodesé †åºä¸èƒ½æ”¹è®Šã€‚"
#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Node must belong to the edited scene to become root."
-msgstr ""
+msgstr "Node必須屬於已編輯的場景以æˆç‚ºroot."
#: editor/scene_tree_dock.cpp
msgid "Instantiated scenes can't become root"
-msgstr ""
+msgstr "Instantiated scenesä¸èƒ½æˆç‚ºroot"
#: editor/scene_tree_dock.cpp
#, fuzzy
@@ -10862,12 +10808,14 @@ msgid "Delete %d nodes?"
msgstr "ä¸é¸"
#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Delete the root node \"%s\"?"
-msgstr ""
+msgstr "删除root node \"%s\"?"
#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Delete node \"%s\" and its children?"
-msgstr ""
+msgstr "删除root node \"%s\"?"
#: editor/scene_tree_dock.cpp
#, fuzzy
@@ -12938,7 +12886,7 @@ msgstr ""
#: scene/gui/range.cpp
msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0."
-msgstr ""
+msgstr "當\"Exp Edit\" 啟用時,\"Min Value\" 必須大於0。"
#: scene/gui/scroll_container.cpp
msgid ""
@@ -12949,7 +12897,7 @@ msgstr ""
#: scene/gui/tree.cpp
msgid "(Other)"
-msgstr ""
+msgstr "(其他)"
#: scene/main/scene_tree.cpp
msgid ""
@@ -12966,23 +12914,22 @@ msgid ""
msgstr ""
#: scene/main/viewport.cpp
+#, fuzzy
msgid "Viewport size must be greater than 0 to render anything."
-msgstr ""
+msgstr "viewport大å°å¿…須大於ï¼ä»¥æ¸²æŸ“任何æ±è¥¿ã€‚"
#: scene/resources/visual_shader_nodes.cpp
#, fuzzy
msgid "Invalid source for preview."
-msgstr "無效字型"
+msgstr "é è¦½ä¾†è‡ªç„¡æ•ˆä¾†æºã€‚"
#: scene/resources/visual_shader_nodes.cpp
-#, fuzzy
msgid "Invalid source for shader."
-msgstr "無效字型"
+msgstr "無效的SHADER來æºã€‚"
#: scene/resources/visual_shader_nodes.cpp
-#, fuzzy
msgid "Invalid comparison function for that type."
-msgstr "無效字型"
+msgstr "無效的函å¼é¡žåž‹å°æ¯”。"
#: servers/visual/shader_language.cpp
msgid "Assignment to function."
diff --git a/main/main.cpp b/main/main.cpp
index dff7907e72..95449dd5cc 100644
--- a/main/main.cpp
+++ b/main/main.cpp
@@ -139,6 +139,7 @@ static DisplayServer::ScreenOrientation window_orientation = DisplayServer::SCRE
static uint32_t window_flags = 0;
static Size2i window_size = Size2i(1024, 600);
static bool window_vsync_via_compositor = false;
+static bool disable_wintab = false;
static int init_screen = -1;
static bool init_fullscreen = false;
@@ -314,6 +315,7 @@ void Main::print_help(const char *p_binary) {
OS::get_singleton()->print(" --enable-vsync-via-compositor When vsync is enabled, vsync via the OS' window compositor (Windows only).\n");
OS::get_singleton()->print(" --disable-vsync-via-compositor Disable vsync via the OS' window compositor (Windows only).\n");
OS::get_singleton()->print(" --single-window Use a single window (no separate subwindows).\n");
+ OS::get_singleton()->print(" --disable-wintab Disable WinTab API and always use Windows Ink API for the pen input (Windows only).\n");
OS::get_singleton()->print("\n");
#endif
@@ -595,6 +597,9 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph
} else if (I->get() == "--gpu-abort") { // force windowed window
Engine::singleton->abort_on_gpu_errors = true;
+ } else if (I->get() == "--disable-wintab") {
+
+ disable_wintab = true;
} else if (I->get() == "--single-window") { // force single window
single_window = true;
@@ -1079,6 +1084,13 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph
OS::get_singleton()->_vsync_via_compositor = window_vsync_via_compositor;
+ if (!disable_wintab) {
+ // No "--disable_wintab" option
+ disable_wintab = GLOBAL_DEF("display/window/disable_wintab_api", false);
+ }
+
+ OS::get_singleton()->_disable_wintab = disable_wintab;
+
/* todo restore
OS::get_singleton()->_allow_layered = GLOBAL_DEF("display/window/per_pixel_transparency/allowed", false);
video_mode.layered = GLOBAL_DEF("display/window/per_pixel_transparency/enabled", false);
diff --git a/misc/dist/linux/org.godotengine.Godot.desktop b/misc/dist/linux/org.godotengine.Godot.desktop
index c8b99207f8..8b74234174 100644
--- a/misc/dist/linux/org.godotengine.Godot.desktop
+++ b/misc/dist/linux/org.godotengine.Godot.desktop
@@ -5,6 +5,7 @@ Comment=Multi-platform 2D and 3D game engine with a feature-rich editor
Exec=godot %f
Icon=godot
Terminal=false
+PrefersNonDefaultGPU=true
Type=Application
MimeType=application/x-godot-project;
Categories=Development;IDE;
diff --git a/modules/csg/csg.cpp b/modules/csg/csg.cpp
index 3f61e2852f..6714db76bb 100644
--- a/modules/csg/csg.cpp
+++ b/modules/csg/csg.cpp
@@ -50,7 +50,7 @@ inline static Vector2 interpolate_segment_uv(const Vector2 p_segement_points[2],
float distance = (p_interpolation_point - p_segement_points[0]).length();
float fraction = distance / segment_length;
- return p_uvs[0].linear_interpolate(p_uvs[1], fraction);
+ return p_uvs[0].lerp(p_uvs[1], fraction);
}
inline static Vector2 interpolate_triangle_uv(const Vector2 p_vertices[3], const Vector2 p_uvs[3], const Vector2 &p_interpolation_point) {
diff --git a/modules/csg/csg_shape.cpp b/modules/csg/csg_shape.cpp
index d38ddf3f90..550a919d0d 100644
--- a/modules/csg/csg_shape.cpp
+++ b/modules/csg/csg_shape.cpp
@@ -46,7 +46,7 @@ void CSGShape3D::set_use_collision(bool p_enable) {
root_collision_instance = PhysicsServer3D::get_singleton()->body_create(PhysicsServer3D::BODY_MODE_STATIC);
PhysicsServer3D::get_singleton()->body_set_state(root_collision_instance, PhysicsServer3D::BODY_STATE_TRANSFORM, get_global_transform());
PhysicsServer3D::get_singleton()->body_add_shape(root_collision_instance, root_collision_shape->get_rid());
- PhysicsServer3D::get_singleton()->body_set_space(root_collision_instance, get_world()->get_space());
+ PhysicsServer3D::get_singleton()->body_set_space(root_collision_instance, get_world_3d()->get_space());
PhysicsServer3D::get_singleton()->body_attach_object_instance_id(root_collision_instance, get_instance_id());
set_collision_layer(collision_layer);
set_collision_mask(collision_mask);
@@ -507,7 +507,7 @@ void CSGShape3D::_notification(int p_what) {
root_collision_instance = PhysicsServer3D::get_singleton()->body_create(PhysicsServer3D::BODY_MODE_STATIC);
PhysicsServer3D::get_singleton()->body_set_state(root_collision_instance, PhysicsServer3D::BODY_STATE_TRANSFORM, get_global_transform());
PhysicsServer3D::get_singleton()->body_add_shape(root_collision_instance, root_collision_shape->get_rid());
- PhysicsServer3D::get_singleton()->body_set_space(root_collision_instance, get_world()->get_space());
+ PhysicsServer3D::get_singleton()->body_set_space(root_collision_instance, get_world_3d()->get_space());
PhysicsServer3D::get_singleton()->body_attach_object_instance_id(root_collision_instance, get_instance_id());
set_collision_layer(collision_layer);
set_collision_mask(collision_mask);
diff --git a/modules/gdnative/gdnative/color.cpp b/modules/gdnative/gdnative/color.cpp
index 914d5b03f4..68c83e05a6 100644
--- a/modules/gdnative/gdnative/color.cpp
+++ b/modules/gdnative/gdnative/color.cpp
@@ -155,11 +155,11 @@ godot_color GDAPI godot_color_contrasted(const godot_color *p_self) {
return dest;
}
-godot_color GDAPI godot_color_linear_interpolate(const godot_color *p_self, const godot_color *p_b, const godot_real p_t) {
+godot_color GDAPI godot_color_lerp(const godot_color *p_self, const godot_color *p_b, const godot_real p_t) {
godot_color dest;
const Color *self = (const Color *)p_self;
const Color *b = (const Color *)p_b;
- *((Color *)&dest) = self->linear_interpolate(*b, p_t);
+ *((Color *)&dest) = self->lerp(*b, p_t);
return dest;
}
diff --git a/modules/gdnative/gdnative/vector2.cpp b/modules/gdnative/gdnative/vector2.cpp
index e9e2a8edf8..dc273e7951 100644
--- a/modules/gdnative/gdnative/vector2.cpp
+++ b/modules/gdnative/gdnative/vector2.cpp
@@ -109,11 +109,11 @@ godot_real GDAPI godot_vector2_angle_to_point(const godot_vector2 *p_self, const
return self->angle_to_point(*to);
}
-godot_vector2 GDAPI godot_vector2_linear_interpolate(const godot_vector2 *p_self, const godot_vector2 *p_b, const godot_real p_t) {
+godot_vector2 GDAPI godot_vector2_lerp(const godot_vector2 *p_self, const godot_vector2 *p_b, const godot_real p_t) {
godot_vector2 dest;
const Vector2 *self = (const Vector2 *)p_self;
const Vector2 *b = (const Vector2 *)p_b;
- *((Vector2 *)&dest) = self->linear_interpolate(*b, p_t);
+ *((Vector2 *)&dest) = self->lerp(*b, p_t);
return dest;
}
diff --git a/modules/gdnative/gdnative/vector3.cpp b/modules/gdnative/gdnative/vector3.cpp
index e34a9370a5..bb27ad5a00 100644
--- a/modules/gdnative/gdnative/vector3.cpp
+++ b/modules/gdnative/gdnative/vector3.cpp
@@ -106,11 +106,11 @@ godot_vector3 GDAPI godot_vector3_rotated(const godot_vector3 *p_self, const god
return dest;
}
-godot_vector3 GDAPI godot_vector3_linear_interpolate(const godot_vector3 *p_self, const godot_vector3 *p_b, const godot_real p_t) {
+godot_vector3 GDAPI godot_vector3_lerp(const godot_vector3 *p_self, const godot_vector3 *p_b, const godot_real p_t) {
godot_vector3 dest;
const Vector3 *self = (const Vector3 *)p_self;
const Vector3 *b = (const Vector3 *)p_b;
- *((Vector3 *)&dest) = self->linear_interpolate(*b, p_t);
+ *((Vector3 *)&dest) = self->lerp(*b, p_t);
return dest;
}
diff --git a/modules/gdnative/gdnative_api.json b/modules/gdnative/gdnative_api.json
index 9473a3d419..d5ab62dc61 100644
--- a/modules/gdnative/gdnative_api.json
+++ b/modules/gdnative/gdnative_api.json
@@ -586,7 +586,7 @@
]
},
{
- "name": "godot_color_linear_interpolate",
+ "name": "godot_color_lerp",
"return_type": "godot_color",
"arguments": [
["const godot_color *", "p_self"],
@@ -710,7 +710,7 @@
]
},
{
- "name": "godot_vector2_linear_interpolate",
+ "name": "godot_vector2_lerp",
"return_type": "godot_vector2",
"arguments": [
["const godot_vector2 *", "p_self"],
@@ -1449,7 +1449,7 @@
]
},
{
- "name": "godot_vector3_linear_interpolate",
+ "name": "godot_vector3_lerp",
"return_type": "godot_vector3",
"arguments": [
["const godot_vector3 *", "p_self"],
diff --git a/modules/gdnative/include/gdnative/color.h b/modules/gdnative/include/gdnative/color.h
index 47c01dbb20..e7737bf8e1 100644
--- a/modules/gdnative/include/gdnative/color.h
+++ b/modules/gdnative/include/gdnative/color.h
@@ -95,7 +95,7 @@ godot_color GDAPI godot_color_inverted(const godot_color *p_self);
godot_color GDAPI godot_color_contrasted(const godot_color *p_self);
-godot_color GDAPI godot_color_linear_interpolate(const godot_color *p_self, const godot_color *p_b, const godot_real p_t);
+godot_color GDAPI godot_color_lerp(const godot_color *p_self, const godot_color *p_b, const godot_real p_t);
godot_color GDAPI godot_color_blend(const godot_color *p_self, const godot_color *p_over);
diff --git a/modules/gdnative/include/gdnative/vector2.h b/modules/gdnative/include/gdnative/vector2.h
index 15a1a6063b..c11e23a586 100644
--- a/modules/gdnative/include/gdnative/vector2.h
+++ b/modules/gdnative/include/gdnative/vector2.h
@@ -81,7 +81,7 @@ godot_real GDAPI godot_vector2_angle_to(const godot_vector2 *p_self, const godot
godot_real GDAPI godot_vector2_angle_to_point(const godot_vector2 *p_self, const godot_vector2 *p_to);
-godot_vector2 GDAPI godot_vector2_linear_interpolate(const godot_vector2 *p_self, const godot_vector2 *p_b, const godot_real p_t);
+godot_vector2 GDAPI godot_vector2_lerp(const godot_vector2 *p_self, const godot_vector2 *p_b, const godot_real p_t);
godot_vector2 GDAPI godot_vector2_cubic_interpolate(const godot_vector2 *p_self, const godot_vector2 *p_b, const godot_vector2 *p_pre_a, const godot_vector2 *p_post_b, const godot_real p_t);
diff --git a/modules/gdnative/include/gdnative/vector3.h b/modules/gdnative/include/gdnative/vector3.h
index 1b344590ea..8ebf15b724 100644
--- a/modules/gdnative/include/gdnative/vector3.h
+++ b/modules/gdnative/include/gdnative/vector3.h
@@ -86,7 +86,7 @@ godot_vector3 GDAPI godot_vector3_snapped(const godot_vector3 *p_self, const god
godot_vector3 GDAPI godot_vector3_rotated(const godot_vector3 *p_self, const godot_vector3 *p_axis, const godot_real p_phi);
-godot_vector3 GDAPI godot_vector3_linear_interpolate(const godot_vector3 *p_self, const godot_vector3 *p_b, const godot_real p_t);
+godot_vector3 GDAPI godot_vector3_lerp(const godot_vector3 *p_self, const godot_vector3 *p_b, const godot_real p_t);
godot_vector3 GDAPI godot_vector3_cubic_interpolate(const godot_vector3 *p_self, const godot_vector3 *p_b, const godot_vector3 *p_pre_a, const godot_vector3 *p_post_b, const godot_real p_t);
diff --git a/modules/gdscript/doc_classes/@GDScript.xml b/modules/gdscript/doc_classes/@GDScript.xml
index 9324691df5..be159b6407 100644
--- a/modules/gdscript/doc_classes/@GDScript.xml
+++ b/modules/gdscript/doc_classes/@GDScript.xml
@@ -568,7 +568,7 @@
<description>
Linearly interpolates between two values by a normalized value. This is the opposite of [method inverse_lerp].
If the [code]from[/code] and [code]to[/code] arguments are of type [int] or [float], the return value is a [float].
- If both are of the same vector type ([Vector2], [Vector3] or [Color]), the return value will be of the same type ([code]lerp[/code] then calls the vector type's [code]linear_interpolate[/code] method).
+ If both are of the same vector type ([Vector2], [Vector3] or [Color]), the return value will be of the same type ([code]lerp[/code] then calls the vector type's [code]lerp[/code] method).
[codeblock]
lerp(0, 4, 0.75) # Returns 3.0
lerp(Vector2(1, 5), Vector2(3, 2), 0.5) # Returns Vector2(2, 3.5)
diff --git a/modules/gdscript/gdscript.cpp b/modules/gdscript/gdscript.cpp
index 98366f7957..06ab9e226d 100644
--- a/modules/gdscript/gdscript.cpp
+++ b/modules/gdscript/gdscript.cpp
@@ -103,15 +103,14 @@ GDScriptInstance *GDScript::_create_instance(const Variant **p_args, int p_argco
instance->owner->set_script_instance(instance);
/* STEP 2, INITIALIZE AND CONSTRUCT */
-
{
MutexLock lock(GDScriptLanguage::singleton->lock);
-
instances.insert(instance->owner);
}
-
+ if (p_argcount < 0) {
+ return instance;
+ }
initializer->call(instance, p_args, p_argcount, r_error);
-
if (r_error.error != Callable::CallError::CALL_OK) {
instance->script = Ref<GDScript>();
instance->owner->set_script_instance(nullptr);
@@ -119,10 +118,8 @@ GDScriptInstance *GDScript::_create_instance(const Variant **p_args, int p_argco
MutexLock lock(GDScriptLanguage::singleton->lock);
instances.erase(p_owner);
}
-
- ERR_FAIL_COND_V(r_error.error != Callable::CallError::CALL_OK, nullptr); //error constructing
+ ERR_FAIL_V_MSG(nullptr, "Error constructing a GDScriptInstance.");
}
-
//@TODO make thread safe
return instance;
}
@@ -638,12 +635,12 @@ uint16_t GDScript::get_rpc_method_id(const StringName &p_method) const {
}
StringName GDScript::get_rpc_method(const uint16_t p_rpc_method_id) const {
- ERR_FAIL_COND_V(p_rpc_method_id >= rpc_functions.size(), StringName());
+ if (p_rpc_method_id >= rpc_functions.size()) return StringName();
return rpc_functions[p_rpc_method_id].name;
}
MultiplayerAPI::RPCMode GDScript::get_rpc_mode_by_id(const uint16_t p_rpc_method_id) const {
- ERR_FAIL_COND_V(p_rpc_method_id >= rpc_functions.size(), MultiplayerAPI::RPC_MODE_DISABLED);
+ if (p_rpc_method_id >= rpc_functions.size()) return MultiplayerAPI::RPC_MODE_DISABLED;
return rpc_functions[p_rpc_method_id].mode;
}
@@ -665,12 +662,12 @@ uint16_t GDScript::get_rset_property_id(const StringName &p_variable) const {
}
StringName GDScript::get_rset_property(const uint16_t p_rset_member_id) const {
- ERR_FAIL_COND_V(p_rset_member_id >= rpc_variables.size(), StringName());
+ if (p_rset_member_id >= rpc_variables.size()) return StringName();
return rpc_variables[p_rset_member_id].name;
}
MultiplayerAPI::RPCMode GDScript::get_rset_mode_by_id(const uint16_t p_rset_member_id) const {
- ERR_FAIL_COND_V(p_rset_member_id >= rpc_variables.size(), MultiplayerAPI::RPC_MODE_DISABLED);
+ if (p_rset_member_id >= rpc_variables.size()) return MultiplayerAPI::RPC_MODE_DISABLED;
return rpc_variables[p_rset_member_id].mode;
}
diff --git a/modules/gdscript/gdscript_editor.cpp b/modules/gdscript/gdscript_editor.cpp
index 7ad0682637..ab3228d076 100644
--- a/modules/gdscript/gdscript_editor.cpp
+++ b/modules/gdscript/gdscript_editor.cpp
@@ -1427,6 +1427,7 @@ static bool _guess_identifier_type_from_base(GDScriptCompletionContext &p_contex
// Variable used in the same expression
return false;
}
+
if (_guess_expression_type(p_context, m.expression, r_type)) {
return true;
}
@@ -3490,6 +3491,17 @@ Error GDScriptLanguage::lookup_code(const String &p_code, const String &p_symbol
return OK;
}
} break;
+ case GDScriptParser::COMPLETION_TYPE_HINT: {
+
+ GDScriptParser::DataType base_type = context._class->base_type;
+ base_type.has_type = true;
+ base_type.kind = GDScriptParser::DataType::CLASS;
+ base_type.class_type = const_cast<GDScriptParser::ClassNode *>(context._class);
+
+ if (_lookup_symbol_from_base(base_type, p_symbol, false, r_result) == OK) {
+ return OK;
+ }
+ } break;
default: {
}
}
diff --git a/modules/gdscript/gdscript_function.cpp b/modules/gdscript/gdscript_function.cpp
index 4e0891921e..44640411bb 100644
--- a/modules/gdscript/gdscript_function.cpp
+++ b/modules/gdscript/gdscript_function.cpp
@@ -294,11 +294,10 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
line = p_state->line;
ip = p_state->ip;
alloca_size = p_state->stack.size();
- script = p_state->script.ptr();
- p_instance = p_state->instance;
+ script = static_cast<GDScript *>(ObjectDB::get_instance(p_state->script_id));
+ p_instance = p_state->instance_id.is_valid() ? static_cast<GDScriptInstance *>(ObjectDB::get_instance(p_state->instance_id)->get_script_instance()) : nullptr;
defarg = p_state->defarg;
self = p_state->self;
- //stack[p_state->result_pos]=p_state->result; //assign stack with result
} else {
@@ -1280,13 +1279,14 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
gdfs->state.stack_size = _stack_size;
gdfs->state.self = self;
gdfs->state.alloca_size = alloca_size;
- gdfs->state.script = Ref<GDScript>(_script);
gdfs->state.ip = ip + ipofs;
gdfs->state.line = line;
+ gdfs->state.script_id = script->get_instance_id();
+#ifdef DEBUG_ENABLED
+ gdfs->state.script_path = _script->get_path();
+#endif
gdfs->state.instance_id = (p_instance && p_instance->get_owner()) ? p_instance->get_owner()->get_instance_id() : ObjectID();
- //gdfs->state.result_pos=ip+ipofs-1;
gdfs->state.defarg = defarg;
- gdfs->state.instance = p_instance;
gdfs->function = this;
retvalue = gdfs;
@@ -1833,9 +1833,14 @@ bool GDScriptFunctionState::is_valid(bool p_extended_check) const {
return false;
if (p_extended_check) {
- //class instance gone?
- if (state.instance_id.is_valid() && !ObjectDB::get_instance(state.instance_id))
+ // Class instance gone? (Otherwise script is valid for sure, because the instance has a ref to the script)
+ if (state.instance_id.is_valid() && !ObjectDB::get_instance(state.instance_id)) {
return false;
+ }
+ // Script gone? (Static method, so there's no instance whose ref to the script can ensure it's valid)
+ if (!ObjectDB::get_instance(state.script_id)) {
+ return false;
+ }
}
return true;
@@ -1846,7 +1851,14 @@ Variant GDScriptFunctionState::resume(const Variant &p_arg) {
ERR_FAIL_COND_V(!function, Variant());
if (state.instance_id.is_valid() && !ObjectDB::get_instance(state.instance_id)) {
#ifdef DEBUG_ENABLED
- ERR_FAIL_V_MSG(Variant(), "Resumed function '" + String(function->get_name()) + "()' after yield, but class instance is gone. At script: " + state.script->get_path() + ":" + itos(state.line));
+ ERR_FAIL_V_MSG(Variant(), "Resumed function '" + String(function->get_name()) + "()' after yield, but class instance is gone. At script: " + state.script_path + ":" + itos(state.line));
+#else
+ return Variant();
+#endif
+ }
+ if (!ObjectDB::get_instance(state.script_id)) {
+#ifdef DEBUG_ENABLED
+ ERR_FAIL_V_MSG(Variant(), "Resumed function '" + String(function->get_name()) + "()' after yield, but script is gone. At script: " + state.script_path + ":" + itos(state.line));
#else
return Variant();
#endif
diff --git a/modules/gdscript/gdscript_function.h b/modules/gdscript/gdscript_function.h
index acfc0a95b4..9d8e23d994 100644
--- a/modules/gdscript/gdscript_function.h
+++ b/modules/gdscript/gdscript_function.h
@@ -293,13 +293,15 @@ private:
public:
struct CallState {
+ ObjectID script_id;
+#ifdef DEBUG_ENABLED
+ String script_path;
+#endif
ObjectID instance_id;
- GDScriptInstance *instance;
Vector<uint8_t> stack;
int stack_size;
Variant self;
uint32_t alloca_size;
- Ref<GDScript> script;
int ip;
int line;
int defarg;
diff --git a/modules/gdscript/gdscript_functions.cpp b/modules/gdscript/gdscript_functions.cpp
index 9154d6eb89..0199af642f 100644
--- a/modules/gdscript/gdscript_functions.cpp
+++ b/modules/gdscript/gdscript_functions.cpp
@@ -362,13 +362,13 @@ void GDScriptFunctions::call(Function p_func, const Variant **p_args, int p_arg_
const double t = (double)*p_args[2];
switch (p_args[0]->get_type() == p_args[1]->get_type() ? p_args[0]->get_type() : Variant::FLOAT) {
case Variant::VECTOR2: {
- r_ret = ((Vector2)*p_args[0]).linear_interpolate((Vector2)*p_args[1], t);
+ r_ret = ((Vector2)*p_args[0]).lerp((Vector2)*p_args[1], t);
} break;
case Variant::VECTOR3: {
- r_ret = (p_args[0]->operator Vector3()).linear_interpolate(p_args[1]->operator Vector3(), t);
+ r_ret = (p_args[0]->operator Vector3()).lerp(p_args[1]->operator Vector3(), t);
} break;
case Variant::COLOR: {
- r_ret = ((Color)*p_args[0]).linear_interpolate((Color)*p_args[1], t);
+ r_ret = ((Color)*p_args[0]).lerp((Color)*p_args[1], t);
} break;
default: {
VALIDATE_ARG_NUM(0);
@@ -1197,8 +1197,7 @@ void GDScriptFunctions::call(Function p_func, const Variant **p_args, int p_arg_
return;
}
}
-
- r_ret = gdscr->_new(nullptr, 0, r_error);
+ r_ret = gdscr->_new(nullptr, -1 /*skip initializer*/, r_error);
GDScriptInstance *ins = static_cast<GDScriptInstance *>(static_cast<Object *>(r_ret)->get_script_instance());
Ref<GDScript> gd_ref = ins->get_script();
diff --git a/modules/gdscript/gdscript_parser.cpp b/modules/gdscript/gdscript_parser.cpp
index 411512d631..17077567c7 100644
--- a/modules/gdscript/gdscript_parser.cpp
+++ b/modules/gdscript/gdscript_parser.cpp
@@ -3358,15 +3358,10 @@ void GDScriptParser::_parse_block(BlockNode *p_block, bool p_static) {
}
if (args.empty() || args.size() > 2) {
- _set_error("Wrong number of arguments, expected 1 or 2");
+ _set_error("Wrong number of arguments, expected 1 or 2", assert_line);
return;
}
-#ifdef DEBUG_ENABLED
- // Mark as safe, let type check mark as unsafe if needed
- _mark_line_as_safe(assert_line);
- _reduce_node_type(args[0]);
-#endif
AssertNode *an = alloc_node<AssertNode>();
an->condition = _reduce_expression(args[0], p_static);
an->line = assert_line;
@@ -3383,7 +3378,7 @@ void GDScriptParser::_parse_block(BlockNode *p_block, bool p_static) {
p_block->statements.push_back(an);
if (!_end_statement()) {
- _set_error("Expected end of statement after \"assert\".");
+ _set_error("Expected end of statement after \"assert\".", assert_line);
return;
}
} break;
@@ -4038,7 +4033,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
if (!_enter_indent_block(block)) {
- _set_error("Indented block expected.");
+ _set_error(vformat("Indented block expected after declaration of \"%s\" function.", function->name));
return;
}
@@ -8133,10 +8128,15 @@ void GDScriptParser::_check_block_types(BlockNode *p_block) {
Node *statement = E->get();
switch (statement->type) {
case Node::TYPE_NEWLINE:
- case Node::TYPE_BREAKPOINT:
- case Node::TYPE_ASSERT: {
+ case Node::TYPE_BREAKPOINT: {
// Nothing to do
} break;
+ case Node::TYPE_ASSERT: {
+ AssertNode *an = static_cast<AssertNode *>(statement);
+ _mark_line_as_safe(an->line);
+ _reduce_node_type(an->condition);
+ _reduce_node_type(an->message);
+ } break;
case Node::TYPE_LOCAL_VAR: {
LocalVarNode *lv = static_cast<LocalVarNode *>(statement);
lv->datatype = _resolve_type(lv->datatype, lv->line);
@@ -8571,7 +8571,13 @@ Error GDScriptParser::_parse(const String &p_base_path) {
_set_error("Parse error: " + tokenizer->get_token_error());
}
- if (error_set && !for_completion) {
+ bool for_completion_error_set = false;
+ if (error_set && for_completion) {
+ for_completion_error_set = true;
+ error_set = false;
+ }
+
+ if (error_set) {
return ERR_PARSE_ERROR;
}
@@ -8601,6 +8607,10 @@ Error GDScriptParser::_parse(const String &p_base_path) {
// Resolve the function blocks
_check_class_blocks_types(main_class);
+ if (for_completion_error_set) {
+ error_set = true;
+ }
+
if (error_set) {
return ERR_PARSE_ERROR;
}
diff --git a/modules/gridmap/grid_map.cpp b/modules/gridmap/grid_map.cpp
index df7c2f397f..0dbefbb39f 100644
--- a/modules/gridmap/grid_map.cpp
+++ b/modules/gridmap/grid_map.cpp
@@ -80,7 +80,7 @@ bool GridMap::_set(const StringName &p_name, const Variant &p_value) {
RS::get_singleton()->get_singleton()->instance_set_base(bm.instance, bm.mesh->get_rid());
RS::get_singleton()->instance_attach_object_instance_id(bm.instance, get_instance_id());
if (is_inside_tree()) {
- RS::get_singleton()->instance_set_scenario(bm.instance, get_world()->get_scenario());
+ RS::get_singleton()->instance_set_scenario(bm.instance, get_world_3d()->get_scenario());
RS::get_singleton()->instance_set_transform(bm.instance, get_global_transform());
}
baked_meshes.push_back(bm);
@@ -536,7 +536,7 @@ bool GridMap::_octant_update(const OctantKey &p_key) {
RS::get_singleton()->instance_set_base(instance, mm);
if (is_inside_tree()) {
- RS::get_singleton()->instance_set_scenario(instance, get_world()->get_scenario());
+ RS::get_singleton()->instance_set_scenario(instance, get_world_3d()->get_scenario());
RS::get_singleton()->instance_set_transform(instance, get_global_transform());
}
@@ -577,15 +577,15 @@ void GridMap::_octant_enter_world(const OctantKey &p_key) {
ERR_FAIL_COND(!octant_map.has(p_key));
Octant &g = *octant_map[p_key];
PhysicsServer3D::get_singleton()->body_set_state(g.static_body, PhysicsServer3D::BODY_STATE_TRANSFORM, get_global_transform());
- PhysicsServer3D::get_singleton()->body_set_space(g.static_body, get_world()->get_space());
+ PhysicsServer3D::get_singleton()->body_set_space(g.static_body, get_world_3d()->get_space());
if (g.collision_debug_instance.is_valid()) {
- RS::get_singleton()->instance_set_scenario(g.collision_debug_instance, get_world()->get_scenario());
+ RS::get_singleton()->instance_set_scenario(g.collision_debug_instance, get_world_3d()->get_scenario());
RS::get_singleton()->instance_set_transform(g.collision_debug_instance, get_global_transform());
}
for (int i = 0; i < g.multimesh_instances.size(); i++) {
- RS::get_singleton()->instance_set_scenario(g.multimesh_instances[i].instance, get_world()->get_scenario());
+ RS::get_singleton()->instance_set_scenario(g.multimesh_instances[i].instance, get_world_3d()->get_scenario());
RS::get_singleton()->instance_set_transform(g.multimesh_instances[i].instance, get_global_transform());
}
@@ -684,7 +684,7 @@ void GridMap::_notification(int p_what) {
}
for (int i = 0; i < baked_meshes.size(); i++) {
- RS::get_singleton()->instance_set_scenario(baked_meshes[i].instance, get_world()->get_scenario());
+ RS::get_singleton()->instance_set_scenario(baked_meshes[i].instance, get_world_3d()->get_scenario());
RS::get_singleton()->instance_set_transform(baked_meshes[i].instance, get_global_transform());
}
@@ -1054,7 +1054,7 @@ void GridMap::make_baked_meshes(bool p_gen_lightmap_uv, float p_lightmap_uv_texe
RS::get_singleton()->get_singleton()->instance_set_base(bm.instance, bm.mesh->get_rid());
RS::get_singleton()->instance_attach_object_instance_id(bm.instance, get_instance_id());
if (is_inside_tree()) {
- RS::get_singleton()->instance_set_scenario(bm.instance, get_world()->get_scenario());
+ RS::get_singleton()->instance_set_scenario(bm.instance, get_world_3d()->get_scenario());
RS::get_singleton()->instance_set_transform(bm.instance, get_global_transform());
}
diff --git a/modules/gridmap/grid_map_editor_plugin.cpp b/modules/gridmap/grid_map_editor_plugin.cpp
index 9c3101945a..9abbac6a0b 100644
--- a/modules/gridmap/grid_map_editor_plugin.cpp
+++ b/modules/gridmap/grid_map_editor_plugin.cpp
@@ -556,7 +556,7 @@ void GridMapEditor::_set_clipboard_data() {
item.cell_item = itm;
item.grid_offset = Vector3(i, j, k) - selection.begin;
item.orientation = node->get_cell_item_orientation(i, j, k);
- item.instance = RenderingServer::get_singleton()->instance_create2(mesh->get_rid(), get_tree()->get_root()->get_world()->get_scenario());
+ item.instance = RenderingServer::get_singleton()->instance_create2(mesh->get_rid(), get_tree()->get_root()->get_world_3d()->get_scenario());
clipboard_items.push_back(item);
}
@@ -1083,12 +1083,12 @@ void GridMapEditor::_notification(int p_what) {
for (int i = 0; i < 3; i++) {
grid[i] = RS::get_singleton()->mesh_create();
- grid_instance[i] = RS::get_singleton()->instance_create2(grid[i], get_tree()->get_root()->get_world()->get_scenario());
- selection_level_instance[i] = RenderingServer::get_singleton()->instance_create2(selection_level_mesh[i], get_tree()->get_root()->get_world()->get_scenario());
+ grid_instance[i] = RS::get_singleton()->instance_create2(grid[i], get_tree()->get_root()->get_world_3d()->get_scenario());
+ selection_level_instance[i] = RenderingServer::get_singleton()->instance_create2(selection_level_mesh[i], get_tree()->get_root()->get_world_3d()->get_scenario());
}
- selection_instance = RenderingServer::get_singleton()->instance_create2(selection_mesh, get_tree()->get_root()->get_world()->get_scenario());
- paste_instance = RenderingServer::get_singleton()->instance_create2(paste_mesh, get_tree()->get_root()->get_world()->get_scenario());
+ selection_instance = RenderingServer::get_singleton()->instance_create2(selection_mesh, get_tree()->get_root()->get_world_3d()->get_scenario());
+ paste_instance = RenderingServer::get_singleton()->instance_create2(paste_mesh, get_tree()->get_root()->get_world_3d()->get_scenario());
_update_selection_transform();
_update_paste_indicator();
@@ -1168,7 +1168,7 @@ void GridMapEditor::_update_cursor_instance() {
Ref<Mesh> mesh = node->get_mesh_library()->get_item_mesh(selected_palette);
if (!mesh.is_null() && mesh->get_rid().is_valid()) {
- cursor_instance = RenderingServer::get_singleton()->instance_create2(mesh->get_rid(), get_tree()->get_root()->get_world()->get_scenario());
+ cursor_instance = RenderingServer::get_singleton()->instance_create2(mesh->get_rid(), get_tree()->get_root()->get_world_3d()->get_scenario());
RenderingServer::get_singleton()->instance_set_transform(cursor_instance, cursor_transform);
}
}
diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/Color.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/Color.cs
index 1d1a49945f..6030b72a44 100644
--- a/modules/mono/glue/GodotSharp/GodotSharp/Core/Color.cs
+++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/Color.cs
@@ -306,16 +306,26 @@ namespace Godot
return res;
}
- public Color LinearInterpolate(Color c, float t)
- {
- var res = this;
-
- res.r += t * (c.r - r);
- res.g += t * (c.g - g);
- res.b += t * (c.b - b);
- res.a += t * (c.a - a);
+ public Color Lerp(Color to, float weight)
+ {
+ return new Color
+ (
+ Mathf.Lerp(r, to.r, weight),
+ Mathf.Lerp(g, to.g, weight),
+ Mathf.Lerp(b, to.b, weight),
+ Mathf.Lerp(a, to.a, weight)
+ );
+ }
- return res;
+ public Color Lerp(Color to, Color weight)
+ {
+ return new Color
+ (
+ Mathf.Lerp(r, to.r, weight.r),
+ Mathf.Lerp(g, to.g, weight.g),
+ Mathf.Lerp(b, to.b, weight.b),
+ Mathf.Lerp(a, to.a, weight.a)
+ );
}
public uint ToAbgr32()
@@ -410,7 +420,7 @@ namespace Godot
return txt;
}
- // Constructors
+ // Constructors
public Color(float r, float g, float b, float a = 1.0f)
{
this.r = r;
@@ -419,6 +429,14 @@ namespace Godot
this.a = a;
}
+ public Color(Color c, float a = 1.0f)
+ {
+ r = c.r;
+ g = c.g;
+ b = c.b;
+ this.a = a;
+ }
+
public Color(uint rgba)
{
a = (rgba & 0xFF) / 255.0f;
diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/Rect2.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/Rect2.cs
index 91e614dc7b..1098ffe4e5 100644
--- a/modules/mono/glue/GodotSharp/GodotSharp/Core/Rect2.cs
+++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/Rect2.cs
@@ -127,7 +127,7 @@ namespace Godot
{
var g = this;
- g.GrowIndividual(Margin.Left == margin ? by : 0,
+ g = g.GrowIndividual(Margin.Left == margin ? by : 0,
Margin.Top == margin ? by : 0,
Margin.Right == margin ? by : 0,
Margin.Bottom == margin ? by : 0);
diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/Rect2i.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/Rect2i.cs
index bc2cad8713..c0b236c524 100644
--- a/modules/mono/glue/GodotSharp/GodotSharp/Core/Rect2i.cs
+++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/Rect2i.cs
@@ -122,7 +122,7 @@ namespace Godot
{
var g = this;
- g.GrowIndividual(Margin.Left == margin ? by : 0,
+ g = g.GrowIndividual(Margin.Left == margin ? by : 0,
Margin.Top == margin ? by : 0,
Margin.Right == margin ? by : 0,
Margin.Bottom == margin ? by : 0);
diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/Transform.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/Transform.cs
index aa8815d1aa..6a58b90561 100644
--- a/modules/mono/glue/GodotSharp/GodotSharp/Core/Transform.cs
+++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/Transform.cs
@@ -104,8 +104,8 @@ namespace Godot
Vector3 destinationLocation = transform.origin;
var interpolated = new Transform();
- interpolated.basis.SetQuatScale(sourceRotation.Slerp(destinationRotation, c).Normalized(), sourceScale.LinearInterpolate(destinationScale, c));
- interpolated.origin = sourceLocation.LinearInterpolate(destinationLocation, c);
+ interpolated.basis.SetQuatScale(sourceRotation.Slerp(destinationRotation, c).Normalized(), sourceScale.Lerp(destinationScale, c));
+ interpolated.origin = sourceLocation.Lerp(destinationLocation, c);
return interpolated;
}
diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/Transform2D.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/Transform2D.cs
index e72a44809a..3ae96d4922 100644
--- a/modules/mono/glue/GodotSharp/GodotSharp/Core/Transform2D.cs
+++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/Transform2D.cs
@@ -172,7 +172,7 @@ namespace Godot
if (dot > 0.9995f)
{
// Linearly interpolate to avoid numerical precision issues
- v = v1.LinearInterpolate(v2, c).Normalized();
+ v = v1.Lerp(v2, c).Normalized();
}
else
{
@@ -186,8 +186,8 @@ namespace Godot
Vector2 p2 = m.origin;
// Construct matrix
- var res = new Transform2D(Mathf.Atan2(v.y, v.x), p1.LinearInterpolate(p2, c));
- Vector2 scale = s1.LinearInterpolate(s2, c);
+ var res = new Transform2D(Mathf.Atan2(v.y, v.x), p1.Lerp(p2, c));
+ Vector2 scale = s1.Lerp(s2, c);
res.x *= scale;
res.y *= scale;
diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/Vector2.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/Vector2.cs
index f7b13198f8..7e4804f9fd 100644
--- a/modules/mono/glue/GodotSharp/GodotSharp/Core/Vector2.cs
+++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/Vector2.cs
@@ -186,14 +186,22 @@ namespace Godot
return x * x + y * y;
}
- public Vector2 LinearInterpolate(Vector2 b, real_t t)
+ public Vector2 Lerp(Vector2 to, real_t weight)
{
- var res = this;
-
- res.x += t * (b.x - x);
- res.y += t * (b.y - y);
+ return new Vector2
+ (
+ Mathf.Lerp(x, to.x, weight),
+ Mathf.Lerp(y, to.y, weight)
+ );
+ }
- return res;
+ public Vector2 Lerp(Vector2 to, Vector2 weight)
+ {
+ return new Vector2
+ (
+ Mathf.Lerp(x, to.x, weight.x),
+ Mathf.Lerp(y, to.y, weight.y)
+ );
}
public Vector2 MoveToward(Vector2 to, real_t delta)
diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/Vector3.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/Vector3.cs
index a43836e985..b26e17ecba 100644
--- a/modules/mono/glue/GodotSharp/GodotSharp/Core/Vector3.cs
+++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/Vector3.cs
@@ -184,13 +184,23 @@ namespace Godot
return x2 + y2 + z2;
}
- public Vector3 LinearInterpolate(Vector3 b, real_t t)
+ public Vector3 Lerp(Vector3 to, real_t weight)
{
return new Vector3
(
- x + t * (b.x - x),
- y + t * (b.y - y),
- z + t * (b.z - z)
+ Mathf.Lerp(x, to.x, weight),
+ Mathf.Lerp(y, to.y, weight),
+ Mathf.Lerp(z, to.z, weight)
+ );
+ }
+
+ public Vector3 Lerp(Vector3 to, Vector3 weight)
+ {
+ return new Vector3
+ (
+ Mathf.Lerp(x, to.x, weight.x),
+ Mathf.Lerp(y, to.y, weight.y),
+ Mathf.Lerp(z, to.z, weight.z)
);
}
diff --git a/modules/mono/utils/string_utils.cpp b/modules/mono/utils/string_utils.cpp
index 907811355f..67b264d803 100644
--- a/modules/mono/utils/string_utils.cpp
+++ b/modules/mono/utils/string_utils.cpp
@@ -196,16 +196,6 @@ String str_format(const char *p_format, ...) {
return res;
}
-// va_copy was defined in the C99, but not in C++ standards before C++11.
-// When you compile C++ without --std=c++<XX> option, compilers still define
-// va_copy, otherwise you have to use the internal version (__va_copy).
-#if !defined(va_copy)
-#if defined(__GNUC__)
-#define va_copy(d, s) __va_copy((d), (s))
-#else
-#define va_copy(d, s) ((d) = (s))
-#endif
-#endif
#if defined(MINGW_ENABLED) || defined(_MSC_VER) && _MSC_VER < 1900
#define gd_vsnprintf(m_buffer, m_count, m_format, m_args_copy) vsnprintf_s(m_buffer, m_count, _TRUNCATE, m_format, m_args_copy)
diff --git a/modules/tinyexr/SCsub b/modules/tinyexr/SCsub
index e7fd44fabd..84b3b4015b 100644
--- a/modules/tinyexr/SCsub
+++ b/modules/tinyexr/SCsub
@@ -15,6 +15,9 @@ thirdparty_sources = [thirdparty_dir + file for file in thirdparty_sources]
env_tinyexr.Prepend(CPPPATH=[thirdparty_dir])
+# Enable threaded loading with C++11.
+env_tinyexr.Append(CPPDEFINES=["TINYEXR_USE_THREAD"])
+
env_thirdparty = env_tinyexr.Clone()
env_thirdparty.disable_warnings()
env_thirdparty.add_source_files(env.modules_sources, thirdparty_sources)
diff --git a/platform/android/java/lib/src/org/godotengine/godot/Godot.java b/platform/android/java/lib/src/org/godotengine/godot/Godot.java
index bf0d1c6273..957f6223a9 100644
--- a/platform/android/java/lib/src/org/godotengine/godot/Godot.java
+++ b/platform/android/java/lib/src/org/godotengine/godot/Godot.java
@@ -30,6 +30,13 @@
package org.godotengine.godot;
+import org.godotengine.godot.input.GodotEditText;
+import org.godotengine.godot.plugin.GodotPlugin;
+import org.godotengine.godot.plugin.GodotPluginRegistry;
+import org.godotengine.godot.utils.GodotNetUtils;
+import org.godotengine.godot.utils.PermissionsUtil;
+import org.godotengine.godot.xr.XRMode;
+
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.ActivityManager;
@@ -77,6 +84,7 @@ import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
+
import com.google.android.vending.expansion.downloader.DownloadProgressInfo;
import com.google.android.vending.expansion.downloader.DownloaderClientMarshaller;
import com.google.android.vending.expansion.downloader.DownloaderServiceMarshaller;
@@ -84,6 +92,7 @@ import com.google.android.vending.expansion.downloader.Helpers;
import com.google.android.vending.expansion.downloader.IDownloaderClient;
import com.google.android.vending.expansion.downloader.IDownloaderService;
import com.google.android.vending.expansion.downloader.IStub;
+
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
@@ -91,12 +100,6 @@ import java.security.MessageDigest;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
-import org.godotengine.godot.input.GodotEditText;
-import org.godotengine.godot.plugin.GodotPlugin;
-import org.godotengine.godot.plugin.GodotPluginRegistry;
-import org.godotengine.godot.utils.GodotNetUtils;
-import org.godotengine.godot.utils.PermissionsUtil;
-import org.godotengine.godot.xr.XRMode;
public abstract class Godot extends FragmentActivity implements SensorEventListener, IDownloaderClient {
diff --git a/platform/android/java/lib/src/org/godotengine/godot/GodotDownloaderAlarmReceiver.java b/platform/android/java/lib/src/org/godotengine/godot/GodotDownloaderAlarmReceiver.java
index 1fb242d0bc..fa95e82e7a 100644
--- a/platform/android/java/lib/src/org/godotengine/godot/GodotDownloaderAlarmReceiver.java
+++ b/platform/android/java/lib/src/org/godotengine/godot/GodotDownloaderAlarmReceiver.java
@@ -35,6 +35,7 @@ import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager.NameNotFoundException;
import android.util.Log;
+
import com.google.android.vending.expansion.downloader.DownloaderClientMarshaller;
/**
diff --git a/platform/android/java/lib/src/org/godotengine/godot/GodotDownloaderService.java b/platform/android/java/lib/src/org/godotengine/godot/GodotDownloaderService.java
index 7e74e8a80d..434da95bc0 100644
--- a/platform/android/java/lib/src/org/godotengine/godot/GodotDownloaderService.java
+++ b/platform/android/java/lib/src/org/godotengine/godot/GodotDownloaderService.java
@@ -33,6 +33,7 @@ package org.godotengine.godot;
import android.content.Context;
import android.content.SharedPreferences;
import android.util.Log;
+
import com.google.android.vending.expansion.downloader.impl.DownloaderService;
/**
diff --git a/platform/android/java/lib/src/org/godotengine/godot/GodotGLRenderView.java b/platform/android/java/lib/src/org/godotengine/godot/GodotGLRenderView.java
index 9be93243b8..5d8ac09643 100644
--- a/platform/android/java/lib/src/org/godotengine/godot/GodotGLRenderView.java
+++ b/platform/android/java/lib/src/org/godotengine/godot/GodotGLRenderView.java
@@ -29,13 +29,7 @@
/*************************************************************************/
package org.godotengine.godot;
-import android.annotation.SuppressLint;
-import android.graphics.PixelFormat;
-import android.opengl.GLSurfaceView;
-import android.view.GestureDetector;
-import android.view.KeyEvent;
-import android.view.MotionEvent;
-import android.view.SurfaceView;
+
import org.godotengine.godot.input.GodotGestureHandler;
import org.godotengine.godot.input.GodotInputHandler;
import org.godotengine.godot.utils.GLUtils;
@@ -47,6 +41,14 @@ import org.godotengine.godot.xr.regular.RegularConfigChooser;
import org.godotengine.godot.xr.regular.RegularContextFactory;
import org.godotengine.godot.xr.regular.RegularFallbackConfigChooser;
+import android.annotation.SuppressLint;
+import android.graphics.PixelFormat;
+import android.opengl.GLSurfaceView;
+import android.view.GestureDetector;
+import android.view.KeyEvent;
+import android.view.MotionEvent;
+import android.view.SurfaceView;
+
/**
* A simple GLSurfaceView sub-class that demonstrate how to perform
* OpenGL ES 2.0 rendering into a GL Surface. Note the following important
diff --git a/platform/android/java/lib/src/org/godotengine/godot/GodotIO.java b/platform/android/java/lib/src/org/godotengine/godot/GodotIO.java
index 016a3a8d18..2eb6f4e313 100644
--- a/platform/android/java/lib/src/org/godotengine/godot/GodotIO.java
+++ b/platform/android/java/lib/src/org/godotengine/godot/GodotIO.java
@@ -29,6 +29,9 @@
/*************************************************************************/
package org.godotengine.godot;
+
+import org.godotengine.godot.input.*;
+
import android.content.*;
import android.content.Intent;
import android.content.pm.ActivityInfo;
@@ -39,11 +42,10 @@ import android.os.*;
import android.util.DisplayMetrics;
import android.util.Log;
import android.util.SparseArray;
+
import java.io.IOException;
import java.io.InputStream;
import java.util.Locale;
-import org.godotengine.godot.input.*;
-//android.os.Build
// Wrapper for native library
diff --git a/platform/android/java/lib/src/org/godotengine/godot/GodotLib.java b/platform/android/java/lib/src/org/godotengine/godot/GodotLib.java
index 71fe822233..9383781150 100644
--- a/platform/android/java/lib/src/org/godotengine/godot/GodotLib.java
+++ b/platform/android/java/lib/src/org/godotengine/godot/GodotLib.java
@@ -33,6 +33,7 @@ package org.godotengine.godot;
import android.app.Activity;
import android.hardware.SensorEvent;
import android.view.Surface;
+
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
diff --git a/platform/android/java/lib/src/org/godotengine/godot/GodotRenderer.java b/platform/android/java/lib/src/org/godotengine/godot/GodotRenderer.java
index 3e5bb4a4c9..39858e5fee 100644
--- a/platform/android/java/lib/src/org/godotengine/godot/GodotRenderer.java
+++ b/platform/android/java/lib/src/org/godotengine/godot/GodotRenderer.java
@@ -30,13 +30,15 @@
package org.godotengine.godot;
+import org.godotengine.godot.plugin.GodotPlugin;
+import org.godotengine.godot.plugin.GodotPluginRegistry;
+import org.godotengine.godot.utils.GLUtils;
+
import android.content.Context;
import android.opengl.GLSurfaceView;
+
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
-import org.godotengine.godot.plugin.GodotPlugin;
-import org.godotengine.godot.plugin.GodotPluginRegistry;
-import org.godotengine.godot.utils.GLUtils;
/**
* Godot's renderer implementation.
diff --git a/platform/android/java/lib/src/org/godotengine/godot/GodotVulkanRenderView.java b/platform/android/java/lib/src/org/godotengine/godot/GodotVulkanRenderView.java
index 30197d5729..3a36c512a2 100644
--- a/platform/android/java/lib/src/org/godotengine/godot/GodotVulkanRenderView.java
+++ b/platform/android/java/lib/src/org/godotengine/godot/GodotVulkanRenderView.java
@@ -30,15 +30,16 @@
package org.godotengine.godot;
+import org.godotengine.godot.input.GodotGestureHandler;
+import org.godotengine.godot.input.GodotInputHandler;
+import org.godotengine.godot.vulkan.VkRenderer;
+import org.godotengine.godot.vulkan.VkSurfaceView;
+
import android.annotation.SuppressLint;
import android.view.GestureDetector;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.SurfaceView;
-import org.godotengine.godot.input.GodotGestureHandler;
-import org.godotengine.godot.input.GodotInputHandler;
-import org.godotengine.godot.vulkan.VkRenderer;
-import org.godotengine.godot.vulkan.VkSurfaceView;
public class GodotVulkanRenderView extends VkSurfaceView implements GodotRenderView {
diff --git a/platform/android/java/lib/src/org/godotengine/godot/input/GodotEditText.java b/platform/android/java/lib/src/org/godotengine/godot/input/GodotEditText.java
index 92bb118e44..547c093419 100644
--- a/platform/android/java/lib/src/org/godotengine/godot/input/GodotEditText.java
+++ b/platform/android/java/lib/src/org/godotengine/godot/input/GodotEditText.java
@@ -29,6 +29,9 @@
/*************************************************************************/
package org.godotengine.godot.input;
+
+import org.godotengine.godot.*;
+
import android.content.Context;
import android.os.Handler;
import android.os.Message;
@@ -38,8 +41,8 @@ import android.view.KeyEvent;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
+
import java.lang.ref.WeakReference;
-import org.godotengine.godot.*;
public class GodotEditText extends EditText {
// ===========================================================
diff --git a/platform/android/java/lib/src/org/godotengine/godot/input/GodotGestureHandler.java b/platform/android/java/lib/src/org/godotengine/godot/input/GodotGestureHandler.java
index b1e0f66373..0ac82dbfe4 100644
--- a/platform/android/java/lib/src/org/godotengine/godot/input/GodotGestureHandler.java
+++ b/platform/android/java/lib/src/org/godotengine/godot/input/GodotGestureHandler.java
@@ -30,11 +30,12 @@
package org.godotengine.godot.input;
+import org.godotengine.godot.GodotLib;
+import org.godotengine.godot.GodotRenderView;
+
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
-import org.godotengine.godot.GodotLib;
-import org.godotengine.godot.GodotRenderView;
/**
* Handles gesture input related events for the {@link GodotRenderView} view.
diff --git a/platform/android/java/lib/src/org/godotengine/godot/input/GodotInputHandler.java b/platform/android/java/lib/src/org/godotengine/godot/input/GodotInputHandler.java
index 0e4fc65119..cea58f27e6 100644
--- a/platform/android/java/lib/src/org/godotengine/godot/input/GodotInputHandler.java
+++ b/platform/android/java/lib/src/org/godotengine/godot/input/GodotInputHandler.java
@@ -32,18 +32,20 @@ package org.godotengine.godot.input;
import static org.godotengine.godot.utils.GLUtils.DEBUG;
+import org.godotengine.godot.GodotLib;
+import org.godotengine.godot.GodotRenderView;
+import org.godotengine.godot.input.InputManagerCompat.InputDeviceListener;
+
import android.util.Log;
import android.view.InputDevice;
import android.view.InputDevice.MotionRange;
import android.view.KeyEvent;
import android.view.MotionEvent;
+
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
-import org.godotengine.godot.GodotLib;
-import org.godotengine.godot.GodotRenderView;
-import org.godotengine.godot.input.InputManagerCompat.InputDeviceListener;
/**
* Handles input related events for the {@link GodotRenderView} view.
diff --git a/platform/android/java/lib/src/org/godotengine/godot/input/GodotTextInputWrapper.java b/platform/android/java/lib/src/org/godotengine/godot/input/GodotTextInputWrapper.java
index e12ff266bf..9cd08de529 100644
--- a/platform/android/java/lib/src/org/godotengine/godot/input/GodotTextInputWrapper.java
+++ b/platform/android/java/lib/src/org/godotengine/godot/input/GodotTextInputWrapper.java
@@ -29,6 +29,9 @@
/*************************************************************************/
package org.godotengine.godot.input;
+
+import org.godotengine.godot.*;
+
import android.content.Context;
import android.text.Editable;
import android.text.TextWatcher;
@@ -37,7 +40,6 @@ import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodManager;
import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener;
-import org.godotengine.godot.*;
public class GodotTextInputWrapper implements TextWatcher, OnEditorActionListener {
// ===========================================================
diff --git a/platform/android/java/lib/src/org/godotengine/godot/input/InputManagerV16.java b/platform/android/java/lib/src/org/godotengine/godot/input/InputManagerV16.java
index e4bafa7ff9..3b88609cc9 100644
--- a/platform/android/java/lib/src/org/godotengine/godot/input/InputManagerV16.java
+++ b/platform/android/java/lib/src/org/godotengine/godot/input/InputManagerV16.java
@@ -23,6 +23,7 @@ import android.os.Build;
import android.os.Handler;
import android.view.InputDevice;
import android.view.MotionEvent;
+
import java.util.HashMap;
import java.util.Map;
diff --git a/platform/android/java/lib/src/org/godotengine/godot/input/Joystick.java b/platform/android/java/lib/src/org/godotengine/godot/input/Joystick.java
index 0c1bdb32aa..1f3fe1e527 100644
--- a/platform/android/java/lib/src/org/godotengine/godot/input/Joystick.java
+++ b/platform/android/java/lib/src/org/godotengine/godot/input/Joystick.java
@@ -31,6 +31,7 @@
package org.godotengine.godot.input;
import android.view.InputDevice.MotionRange;
+
import java.util.ArrayList;
/**
diff --git a/platform/android/java/lib/src/org/godotengine/godot/plugin/GodotPlugin.java b/platform/android/java/lib/src/org/godotengine/godot/plugin/GodotPlugin.java
index a051164d15..a42bcb28ce 100644
--- a/platform/android/java/lib/src/org/godotengine/godot/plugin/GodotPlugin.java
+++ b/platform/android/java/lib/src/org/godotengine/godot/plugin/GodotPlugin.java
@@ -30,6 +30,9 @@
package org.godotengine.godot.plugin;
+import org.godotengine.godot.BuildConfig;
+import org.godotengine.godot.Godot;
+
import android.app.Activity;
import android.content.Intent;
import android.support.annotation.NonNull;
@@ -38,16 +41,16 @@ import android.text.TextUtils;
import android.util.Log;
import android.view.Surface;
import android.view.View;
+
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
+
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
-import org.godotengine.godot.BuildConfig;
-import org.godotengine.godot.Godot;
/**
* Base class for the Godot Android plugins.
diff --git a/platform/android/java/lib/src/org/godotengine/godot/plugin/GodotPluginRegistry.java b/platform/android/java/lib/src/org/godotengine/godot/plugin/GodotPluginRegistry.java
index e13a9c15d8..7bc8f2c03f 100644
--- a/platform/android/java/lib/src/org/godotengine/godot/plugin/GodotPluginRegistry.java
+++ b/platform/android/java/lib/src/org/godotengine/godot/plugin/GodotPluginRegistry.java
@@ -30,12 +30,15 @@
package org.godotengine.godot.plugin;
+import org.godotengine.godot.Godot;
+
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import android.util.Log;
+
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;
@@ -43,7 +46,6 @@ import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
-import org.godotengine.godot.Godot;
/**
* Registry used to load and access the registered Godot Android plugins.
diff --git a/platform/android/java/lib/src/org/godotengine/godot/plugin/SignalInfo.java b/platform/android/java/lib/src/org/godotengine/godot/plugin/SignalInfo.java
index f907706889..b940d679f0 100644
--- a/platform/android/java/lib/src/org/godotengine/godot/plugin/SignalInfo.java
+++ b/platform/android/java/lib/src/org/godotengine/godot/plugin/SignalInfo.java
@@ -32,6 +32,7 @@ package org.godotengine.godot.plugin;
import android.support.annotation.NonNull;
import android.text.TextUtils;
+
import java.util.Arrays;
/**
diff --git a/platform/android/java/lib/src/org/godotengine/godot/utils/GLUtils.java b/platform/android/java/lib/src/org/godotengine/godot/utils/GLUtils.java
index 9d29551f89..291847723c 100644
--- a/platform/android/java/lib/src/org/godotengine/godot/utils/GLUtils.java
+++ b/platform/android/java/lib/src/org/godotengine/godot/utils/GLUtils.java
@@ -31,6 +31,7 @@
package org.godotengine.godot.utils;
import android.util.Log;
+
import javax.microedition.khronos.egl.EGL10;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.egl.EGLDisplay;
diff --git a/platform/android/java/lib/src/org/godotengine/godot/utils/GodotNetUtils.java b/platform/android/java/lib/src/org/godotengine/godot/utils/GodotNetUtils.java
index 011d426c7e..bb1667afda 100644
--- a/platform/android/java/lib/src/org/godotengine/godot/utils/GodotNetUtils.java
+++ b/platform/android/java/lib/src/org/godotengine/godot/utils/GodotNetUtils.java
@@ -30,10 +30,11 @@
package org.godotengine.godot.utils;
+import org.godotengine.godot.Godot;
+
import android.content.Context;
import android.net.wifi.WifiManager;
import android.util.Log;
-import org.godotengine.godot.Godot;
/**
* This class handles Android-specific networking functions.
diff --git a/platform/android/java/lib/src/org/godotengine/godot/utils/PermissionsUtil.java b/platform/android/java/lib/src/org/godotengine/godot/utils/PermissionsUtil.java
index 7cf32b00fe..4000e63fbe 100644
--- a/platform/android/java/lib/src/org/godotengine/godot/utils/PermissionsUtil.java
+++ b/platform/android/java/lib/src/org/godotengine/godot/utils/PermissionsUtil.java
@@ -30,15 +30,18 @@
package org.godotengine.godot.utils;
+import org.godotengine.godot.Godot;
+
import android.Manifest;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PermissionInfo;
import android.os.Build;
import android.support.v4.content.ContextCompat;
+import android.util.Log;
+
import java.util.ArrayList;
import java.util.List;
-import org.godotengine.godot.Godot;
/**
* This class includes utility functions for Android permissions related operations.
@@ -46,6 +49,8 @@ import org.godotengine.godot.Godot;
*/
public final class PermissionsUtil {
+ private static final String TAG = PermissionsUtil.class.getSimpleName();
+
static final int REQUEST_RECORD_AUDIO_PERMISSION = 1;
static final int REQUEST_CAMERA_PERMISSION = 2;
static final int REQUEST_VIBRATE_PERMISSION = 3;
@@ -113,8 +118,8 @@ public final class PermissionsUtil {
dangerousPermissions.add(manifestPermission);
}
} catch (PackageManager.NameNotFoundException e) {
- e.printStackTrace();
- return false;
+ // Skip this permission and continue.
+ Log.w(TAG, "Unable to identify permission " + manifestPermission, e);
}
}
@@ -153,8 +158,8 @@ public final class PermissionsUtil {
dangerousPermissions.add(manifestPermission);
}
} catch (PackageManager.NameNotFoundException e) {
- e.printStackTrace();
- return new String[0];
+ // Skip this permission and continue.
+ Log.w(TAG, "Unable to identify permission " + manifestPermission, e);
}
}
diff --git a/platform/android/java/lib/src/org/godotengine/godot/xr/ovr/OvrConfigChooser.java b/platform/android/java/lib/src/org/godotengine/godot/xr/ovr/OvrConfigChooser.java
index 9209d6ccf2..c66d75bb2d 100644
--- a/platform/android/java/lib/src/org/godotengine/godot/xr/ovr/OvrConfigChooser.java
+++ b/platform/android/java/lib/src/org/godotengine/godot/xr/ovr/OvrConfigChooser.java
@@ -32,6 +32,7 @@ package org.godotengine.godot.xr.ovr;
import android.opengl.EGLExt;
import android.opengl.GLSurfaceView;
+
import javax.microedition.khronos.egl.EGL10;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.egl.EGLDisplay;
diff --git a/platform/android/java/lib/src/org/godotengine/godot/xr/ovr/OvrContextFactory.java b/platform/android/java/lib/src/org/godotengine/godot/xr/ovr/OvrContextFactory.java
index 36f4416df2..16d4a998f2 100644
--- a/platform/android/java/lib/src/org/godotengine/godot/xr/ovr/OvrContextFactory.java
+++ b/platform/android/java/lib/src/org/godotengine/godot/xr/ovr/OvrContextFactory.java
@@ -32,6 +32,7 @@ package org.godotengine.godot.xr.ovr;
import android.opengl.EGL14;
import android.opengl.GLSurfaceView;
+
import javax.microedition.khronos.egl.EGL10;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.egl.EGLContext;
diff --git a/platform/android/java/lib/src/org/godotengine/godot/xr/ovr/OvrWindowSurfaceFactory.java b/platform/android/java/lib/src/org/godotengine/godot/xr/ovr/OvrWindowSurfaceFactory.java
index b2aa130f37..7ca0777f11 100644
--- a/platform/android/java/lib/src/org/godotengine/godot/xr/ovr/OvrWindowSurfaceFactory.java
+++ b/platform/android/java/lib/src/org/godotengine/godot/xr/ovr/OvrWindowSurfaceFactory.java
@@ -31,6 +31,7 @@
package org.godotengine.godot.xr.ovr;
import android.opengl.GLSurfaceView;
+
import javax.microedition.khronos.egl.EGL10;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.egl.EGLDisplay;
diff --git a/platform/android/java/lib/src/org/godotengine/godot/xr/regular/RegularConfigChooser.java b/platform/android/java/lib/src/org/godotengine/godot/xr/regular/RegularConfigChooser.java
index 8409e37f8f..924d12f0bc 100644
--- a/platform/android/java/lib/src/org/godotengine/godot/xr/regular/RegularConfigChooser.java
+++ b/platform/android/java/lib/src/org/godotengine/godot/xr/regular/RegularConfigChooser.java
@@ -30,11 +30,13 @@
package org.godotengine.godot.xr.regular;
+import org.godotengine.godot.utils.GLUtils;
+
import android.opengl.GLSurfaceView;
+
import javax.microedition.khronos.egl.EGL10;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.egl.EGLDisplay;
-import org.godotengine.godot.utils.GLUtils;
/**
* Used to select the egl config for pancake games.
diff --git a/platform/android/java/lib/src/org/godotengine/godot/xr/regular/RegularContextFactory.java b/platform/android/java/lib/src/org/godotengine/godot/xr/regular/RegularContextFactory.java
index 31cf696195..126f3ad5f5 100644
--- a/platform/android/java/lib/src/org/godotengine/godot/xr/regular/RegularContextFactory.java
+++ b/platform/android/java/lib/src/org/godotengine/godot/xr/regular/RegularContextFactory.java
@@ -30,14 +30,16 @@
package org.godotengine.godot.xr.regular;
+import org.godotengine.godot.GodotLib;
+import org.godotengine.godot.utils.GLUtils;
+
import android.opengl.GLSurfaceView;
import android.util.Log;
+
import javax.microedition.khronos.egl.EGL10;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.egl.EGLContext;
import javax.microedition.khronos.egl.EGLDisplay;
-import org.godotengine.godot.GodotLib;
-import org.godotengine.godot.utils.GLUtils;
/**
* Factory used to setup the opengl context for pancake games.
diff --git a/platform/android/java/lib/src/org/godotengine/godot/xr/regular/RegularFallbackConfigChooser.java b/platform/android/java/lib/src/org/godotengine/godot/xr/regular/RegularFallbackConfigChooser.java
index 71fcf06020..64bc4ac1da 100644
--- a/platform/android/java/lib/src/org/godotengine/godot/xr/regular/RegularFallbackConfigChooser.java
+++ b/platform/android/java/lib/src/org/godotengine/godot/xr/regular/RegularFallbackConfigChooser.java
@@ -30,11 +30,13 @@
package org.godotengine.godot.xr.regular;
+import org.godotengine.godot.utils.GLUtils;
+
import android.util.Log;
+
import javax.microedition.khronos.egl.EGL10;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.egl.EGLDisplay;
-import org.godotengine.godot.utils.GLUtils;
/* Fallback if 32bit View is not supported*/
public class RegularFallbackConfigChooser extends RegularConfigChooser {
diff --git a/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/ConsumeTask.java b/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/ConsumeTask.java
index c15bc232ce..31c72fe7f8 100644
--- a/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/ConsumeTask.java
+++ b/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/ConsumeTask.java
@@ -33,7 +33,9 @@ package org.godotengine.godot.plugin.payment;
import android.content.Context;
import android.os.AsyncTask;
import android.os.RemoteException;
+
import com.android.vending.billing.IInAppBillingService;
+
import java.lang.ref.WeakReference;
abstract public class ConsumeTask {
diff --git a/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/GodotPayment.java b/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/GodotPayment.java
index c7d0a5de65..08ade2a18d 100644
--- a/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/GodotPayment.java
+++ b/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/GodotPayment.java
@@ -30,16 +30,19 @@
package org.godotengine.godot.plugin.payment;
+import org.godotengine.godot.Dictionary;
+import org.godotengine.godot.Godot;
+import org.godotengine.godot.GodotLib;
+import org.godotengine.godot.plugin.GodotPlugin;
+
import android.content.Intent;
import android.support.annotation.NonNull;
import android.util.Log;
+
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
-import org.godotengine.godot.Dictionary;
-import org.godotengine.godot.Godot;
-import org.godotengine.godot.GodotLib;
-import org.godotengine.godot.plugin.GodotPlugin;
+
import org.json.JSONException;
import org.json.JSONObject;
diff --git a/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/HandlePurchaseTask.java b/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/HandlePurchaseTask.java
index fe5685288b..70a51fcb97 100644
--- a/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/HandlePurchaseTask.java
+++ b/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/HandlePurchaseTask.java
@@ -32,6 +32,7 @@ package org.godotengine.godot.plugin.payment;
import android.app.Activity;
import android.content.Intent;
+
import org.json.JSONException;
import org.json.JSONObject;
diff --git a/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/PaymentsManager.java b/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/PaymentsManager.java
index bded1f452f..0393c0b06e 100644
--- a/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/PaymentsManager.java
+++ b/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/PaymentsManager.java
@@ -40,9 +40,12 @@ import android.os.IBinder;
import android.os.RemoteException;
import android.text.TextUtils;
import android.util.Log;
+
import com.android.vending.billing.IInAppBillingService;
+
import java.util.ArrayList;
import java.util.Arrays;
+
import org.json.JSONException;
import org.json.JSONObject;
diff --git a/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/PurchaseTask.java b/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/PurchaseTask.java
index eecd1d2151..4894e4020f 100644
--- a/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/PurchaseTask.java
+++ b/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/PurchaseTask.java
@@ -37,6 +37,7 @@ import android.content.IntentSender.SendIntentException;
import android.os.Bundle;
import android.os.RemoteException;
import android.util.Log;
+
import com.android.vending.billing.IInAppBillingService;
abstract public class PurchaseTask {
diff --git a/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/ReleaseAllConsumablesTask.java b/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/ReleaseAllConsumablesTask.java
index b7bd638feb..006688a450 100644
--- a/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/ReleaseAllConsumablesTask.java
+++ b/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/ReleaseAllConsumablesTask.java
@@ -34,9 +34,12 @@ import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
+
import com.android.vending.billing.IInAppBillingService;
+
import java.lang.ref.WeakReference;
import java.util.ArrayList;
+
import org.json.JSONException;
import org.json.JSONObject;
diff --git a/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/ValidateTask.java b/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/ValidateTask.java
index d42ded0c9b..4ee7b5a0f8 100644
--- a/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/ValidateTask.java
+++ b/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/ValidateTask.java
@@ -30,12 +30,15 @@
package org.godotengine.godot.plugin.payment;
+import org.godotengine.godot.plugin.payment.utils.HttpRequester;
+import org.godotengine.godot.plugin.payment.utils.RequestParams;
+
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
+
import java.lang.ref.WeakReference;
-import org.godotengine.godot.plugin.payment.utils.HttpRequester;
-import org.godotengine.godot.plugin.payment.utils.RequestParams;
+
import org.json.JSONException;
import org.json.JSONObject;
diff --git a/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/utils/CustomSSLSocketFactory.java b/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/utils/CustomSSLSocketFactory.java
index 9571769cd3..55b87b49e5 100644
--- a/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/utils/CustomSSLSocketFactory.java
+++ b/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/utils/CustomSSLSocketFactory.java
@@ -38,8 +38,10 @@ import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
+
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManagerFactory;
+
import org.apache.http.conn.ssl.SSLSocketFactory;
/**
diff --git a/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/utils/HttpRequester.java b/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/utils/HttpRequester.java
index dcb983201e..acd17f10f2 100644
--- a/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/utils/HttpRequester.java
+++ b/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/utils/HttpRequester.java
@@ -30,9 +30,12 @@
package org.godotengine.godot.plugin.payment.utils;
+import org.godotengine.godot.utils.Crypt;
+
import android.content.Context;
import android.content.SharedPreferences;
import android.util.Log;
+
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
@@ -40,6 +43,7 @@ import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.security.KeyStore;
import java.util.Date;
+
import org.apache.http.HttpResponse;
import org.apache.http.HttpVersion;
import org.apache.http.client.ClientProtocolException;
@@ -61,7 +65,6 @@ import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
-import org.godotengine.godot.utils.Crypt;
/**
*
diff --git a/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/utils/RequestParams.java b/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/utils/RequestParams.java
index 4be8b37473..023fd87f68 100644
--- a/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/utils/RequestParams.java
+++ b/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/utils/RequestParams.java
@@ -33,6 +33,7 @@ package org.godotengine.godot.plugin.payment.utils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
+
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
diff --git a/platform/javascript/os_javascript.cpp b/platform/javascript/os_javascript.cpp
index ad06aef86e..c0230b94fa 100644
--- a/platform/javascript/os_javascript.cpp
+++ b/platform/javascript/os_javascript.cpp
@@ -981,7 +981,7 @@ Error OS_JavaScript::initialize(const VideoMode &p_desired, int p_video_driver,
SET_EM_CALLBACK(EMSCRIPTEN_EVENT_TARGET_WINDOW, mousemove, mousemove_callback)
SET_EM_CALLBACK(GODOT_CANVAS_SELECTOR, mousedown, mouse_button_callback)
SET_EM_CALLBACK(EMSCRIPTEN_EVENT_TARGET_WINDOW, mouseup, mouse_button_callback)
- SET_EM_CALLBACK(EMSCRIPTEN_EVENT_TARGET_WINDOW, wheel, wheel_callback)
+ SET_EM_CALLBACK(GODOT_CANVAS_SELECTOR, wheel, wheel_callback)
SET_EM_CALLBACK(GODOT_CANVAS_SELECTOR, touchstart, touch_press_callback)
SET_EM_CALLBACK(GODOT_CANVAS_SELECTOR, touchmove, touchmove_callback)
SET_EM_CALLBACK(GODOT_CANVAS_SELECTOR, touchend, touch_press_callback)
diff --git a/platform/linuxbsd/display_server_x11.cpp b/platform/linuxbsd/display_server_x11.cpp
index e38b0c13d0..dd9298d667 100644
--- a/platform/linuxbsd/display_server_x11.cpp
+++ b/platform/linuxbsd/display_server_x11.cpp
@@ -254,13 +254,16 @@ bool DisplayServerX11::_refresh_device_info() {
bool absolute_mode = false;
int resolution_x = 0;
int resolution_y = 0;
- double range_min_x = 0;
- double range_min_y = 0;
- double range_max_x = 0;
- double range_max_y = 0;
- int pressure_resolution = 0;
- int tilt_resolution_x = 0;
- int tilt_resolution_y = 0;
+ double abs_x_min = 0;
+ double abs_x_max = 0;
+ double abs_y_min = 0;
+ double abs_y_max = 0;
+ double pressure_min = 0;
+ double pressure_max = 0;
+ double tilt_x_min = 0;
+ double tilt_x_max = 0;
+ double tilt_y_min = 0;
+ double tilt_y_max = 0;
for (int j = 0; j < dev->num_classes; j++) {
#ifdef TOUCH_ENABLED
if (dev->classes[j]->type == XITouchClass && ((XITouchClassInfo *)dev->classes[j])->mode == XIDirectTouch) {
@@ -272,23 +275,23 @@ bool DisplayServerX11::_refresh_device_info() {
if (class_info->number == VALUATOR_ABSX && class_info->mode == XIModeAbsolute) {
resolution_x = class_info->resolution;
- range_min_x = class_info->min;
- range_max_x = class_info->max;
+ abs_x_min = class_info->min;
+ abs_y_max = class_info->max;
absolute_mode = true;
} else if (class_info->number == VALUATOR_ABSY && class_info->mode == XIModeAbsolute) {
resolution_y = class_info->resolution;
- range_min_y = class_info->min;
- range_max_y = class_info->max;
+ abs_y_min = class_info->min;
+ abs_y_max = class_info->max;
absolute_mode = true;
} else if (class_info->number == VALUATOR_PRESSURE && class_info->mode == XIModeAbsolute) {
- pressure_resolution = (class_info->max - class_info->min);
- if (pressure_resolution == 0) pressure_resolution = 1;
+ pressure_min = class_info->min;
+ pressure_max = class_info->max;
} else if (class_info->number == VALUATOR_TILTX && class_info->mode == XIModeAbsolute) {
- tilt_resolution_x = (class_info->max - class_info->min);
- if (tilt_resolution_x == 0) tilt_resolution_x = 1;
+ tilt_x_min = class_info->min;
+ tilt_x_max = class_info->max;
} else if (class_info->number == VALUATOR_TILTY && class_info->mode == XIModeAbsolute) {
- tilt_resolution_y = (class_info->max - class_info->min);
- if (tilt_resolution_y == 0) tilt_resolution_y = 1;
+ tilt_x_min = class_info->min;
+ tilt_x_max = class_info->max;
}
}
}
@@ -299,18 +302,19 @@ bool DisplayServerX11::_refresh_device_info() {
if (absolute_mode) {
// If no resolution was reported, use the min/max ranges.
if (resolution_x <= 0) {
- resolution_x = (range_max_x - range_min_x) * abs_resolution_range_mult;
+ resolution_x = (abs_x_max - abs_x_min) * abs_resolution_range_mult;
}
if (resolution_y <= 0) {
- resolution_y = (range_max_y - range_min_y) * abs_resolution_range_mult;
+ resolution_y = (abs_y_max - abs_y_min) * abs_resolution_range_mult;
}
-
xi.absolute_devices[dev->deviceid] = Vector2(abs_resolution_mult / resolution_x, abs_resolution_mult / resolution_y);
print_verbose("XInput: Absolute pointing device: " + String(dev->name));
}
xi.pressure = 0;
- xi.pen_devices[dev->deviceid] = Vector3(pressure_resolution, tilt_resolution_x, tilt_resolution_y);
+ xi.pen_pressure_range[dev->deviceid] = Vector2(pressure_min, pressure_max);
+ xi.pen_tilt_x_range[dev->deviceid] = Vector2(tilt_x_min, tilt_x_max);
+ xi.pen_tilt_y_range[dev->deviceid] = Vector2(tilt_y_min, tilt_y_max);
}
XIFreeDeviceInfo(info);
@@ -2353,6 +2357,10 @@ void DisplayServerX11::process_events() {
// Is the current mouse mode one where it needs to be grabbed.
bool mouse_mode_grab = mouse_mode == MOUSE_MODE_CAPTURED || mouse_mode == MOUSE_MODE_CONFINED;
+ xi.pressure = 0;
+ xi.tilt = Vector2();
+ xi.pressure_supported = false;
+
while (XPending(x11_display) > 0) {
XEvent event;
XNextEvent(x11_display, &event);
@@ -2399,9 +2407,6 @@ void DisplayServerX11::process_events() {
double rel_x = 0.0;
double rel_y = 0.0;
- double pressure = 0.0;
- double tilt_x = 0.0;
- double tilt_y = 0.0;
if (XIMaskIsSet(raw_event->valuators.mask, VALUATOR_ABSX)) {
rel_x = *values;
@@ -2414,24 +2419,41 @@ void DisplayServerX11::process_events() {
}
if (XIMaskIsSet(raw_event->valuators.mask, VALUATOR_PRESSURE)) {
- pressure = *values;
+ Map<int, Vector2>::Element *pen_pressure = xi.pen_pressure_range.find(device_id);
+ if (pen_pressure) {
+ Vector2 pen_pressure_range = pen_pressure->value();
+ if (pen_pressure_range != Vector2()) {
+ xi.pressure_supported = true;
+ xi.pressure = (*values - pen_pressure_range[0]) /
+ (pen_pressure_range[1] - pen_pressure_range[0]);
+ }
+ }
+
values++;
}
if (XIMaskIsSet(raw_event->valuators.mask, VALUATOR_TILTX)) {
- tilt_x = *values;
+ Map<int, Vector2>::Element *pen_tilt_x = xi.pen_tilt_x_range.find(device_id);
+ if (pen_tilt_x) {
+ Vector2 pen_tilt_x_range = pen_tilt_x->value();
+ if (pen_tilt_x_range != Vector2()) {
+ xi.tilt.x = ((*values - pen_tilt_x_range[0]) / (pen_tilt_x_range[1] - pen_tilt_x_range[0])) * 2 - 1;
+ }
+ }
+
values++;
}
if (XIMaskIsSet(raw_event->valuators.mask, VALUATOR_TILTY)) {
- tilt_y = *values;
- }
+ Map<int, Vector2>::Element *pen_tilt_y = xi.pen_tilt_y_range.find(device_id);
+ if (pen_tilt_y) {
+ Vector2 pen_tilt_y_range = pen_tilt_y->value();
+ if (pen_tilt_y_range != Vector2()) {
+ xi.tilt.y = ((*values - pen_tilt_y_range[0]) / (pen_tilt_y_range[1] - pen_tilt_y_range[0])) * 2 - 1;
+ }
+ }
- Map<int, Vector3>::Element *pen_info = xi.pen_devices.find(device_id);
- if (pen_info) {
- Vector3 mult = pen_info->value();
- if (mult.x != 0.0) xi.pressure = pressure / mult.x;
- if ((mult.y != 0.0) && (mult.z != 0.0)) xi.tilt = Vector2(tilt_x / mult.y, tilt_y / mult.z);
+ values++;
}
// https://bugs.freedesktop.org/show_bug.cgi?id=71609
@@ -2763,7 +2785,11 @@ void DisplayServerX11::process_events() {
mm.instance();
mm->set_window_id(window_id);
- mm->set_pressure(xi.pressure);
+ if (xi.pressure_supported) {
+ mm->set_pressure(xi.pressure);
+ } else {
+ mm->set_pressure((mouse_get_button_state() & (1 << (BUTTON_LEFT - 1))) ? 1.0f : 0.0f);
+ }
mm->set_tilt(xi.tilt);
// Make the absolute position integral so it doesn't look _too_ weird :)
diff --git a/platform/linuxbsd/display_server_x11.h b/platform/linuxbsd/display_server_x11.h
index 8f090d3fad..b5ea71f72a 100644
--- a/platform/linuxbsd/display_server_x11.h
+++ b/platform/linuxbsd/display_server_x11.h
@@ -170,10 +170,13 @@ class DisplayServerX11 : public DisplayServer {
int opcode;
Vector<int> touch_devices;
Map<int, Vector2> absolute_devices;
- Map<int, Vector3> pen_devices;
+ Map<int, Vector2> pen_pressure_range;
+ Map<int, Vector2> pen_tilt_x_range;
+ Map<int, Vector2> pen_tilt_y_range;
XIEventMask all_event_mask;
Map<int, Vector2> state;
double pressure;
+ bool pressure_supported;
Vector2 tilt;
Vector2 mouse_pos_to_filter;
Vector2 relative_motion;
diff --git a/platform/windows/display_server_windows.cpp b/platform/windows/display_server_windows.cpp
index e4fe7f04d0..3afe6c20ec 100644
--- a/platform/windows/display_server_windows.cpp
+++ b/platform/windows/display_server_windows.cpp
@@ -36,10 +36,6 @@
#include <avrt.h>
-#ifndef WM_POINTERUPDATE
-#define WM_POINTERUPDATE 0x0245
-#endif
-
#ifdef DEBUG_ENABLED
static String format_error_message(DWORD id) {
@@ -545,6 +541,10 @@ void DisplayServerWindows::delete_sub_window(WindowID p_window) {
}
#endif
+ if (!OS::get_singleton()->is_wintab_disabled() && wintab_available && windows[p_window].wtctx) {
+ wintab_WTClose(windows[p_window].wtctx);
+ windows[p_window].wtctx = 0;
+ }
DestroyWindow(windows[p_window].hWnd);
windows.erase(p_window);
}
@@ -1849,7 +1849,11 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
alt_mem = false;
};
- return 0; // Return To The Message Loop
+ if (!OS::get_singleton()->is_wintab_disabled() && wintab_available && windows[window_id].wtctx) {
+ wintab_WTEnable(windows[window_id].wtctx, GET_WM_ACTIVATE_STATE(wParam, lParam));
+ }
+
+ return 0; // Return To The Message Loop
}
case WM_GETMINMAXINFO: {
if (windows[window_id].resizable && !windows[window_id].fullscreen) {
@@ -1929,6 +1933,8 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
mm->set_shift(shift_mem);
mm->set_alt(alt_mem);
+ mm->set_pressure((raw->data.mouse.ulButtons & RI_MOUSE_LEFT_BUTTON_DOWN) ? 1.0f : 0.0f);
+
mm->set_button_mask(last_button_state);
Point2i c(windows[window_id].width / 2, windows[window_id].height / 2);
@@ -1977,6 +1983,42 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
}
delete[] lpb;
} break;
+ case WT_CSRCHANGE:
+ case WT_PROXIMITY: {
+ if (!OS::get_singleton()->is_wintab_disabled() && wintab_available && windows[window_id].wtctx) {
+ AXIS pressure;
+ if (wintab_WTInfo(WTI_DEVICES + windows[window_id].wtlc.lcDevice, DVC_NPRESSURE, &pressure)) {
+ windows[window_id].min_pressure = int(pressure.axMin);
+ windows[window_id].max_pressure = int(pressure.axMax);
+ }
+ AXIS orientation[3];
+ if (wintab_WTInfo(WTI_DEVICES + windows[window_id].wtlc.lcDevice, DVC_ORIENTATION, &orientation)) {
+ windows[window_id].tilt_supported = orientation[0].axResolution && orientation[1].axResolution;
+ }
+ return 0;
+ }
+ } break;
+ case WT_PACKET: {
+ if (!OS::get_singleton()->is_wintab_disabled() && wintab_available && windows[window_id].wtctx) {
+ PACKET packet;
+ if (wintab_WTPacket(windows[window_id].wtctx, wParam, &packet)) {
+
+ float pressure = float(packet.pkNormalPressure - windows[window_id].min_pressure) / float(windows[window_id].max_pressure - windows[window_id].min_pressure);
+ windows[window_id].last_pressure = pressure;
+ windows[window_id].last_pressure_update = 0;
+
+ double azim = (packet.pkOrientation.orAzimuth / 10.0f) * (Math_PI / 180);
+ double alt = Math::tan((Math::abs(packet.pkOrientation.orAltitude / 10.0f)) * (Math_PI / 180));
+
+ if (windows[window_id].tilt_supported) {
+ windows[window_id].last_tilt = Vector2(Math::atan(Math::sin(azim) / alt), Math::atan(Math::cos(azim) / alt));
+ } else {
+ windows[window_id].last_tilt = Vector2();
+ }
+ }
+ return 0;
+ }
+ } break;
case WM_POINTERUPDATE: {
if (mouse_mode == MOUSE_MODE_CAPTURED && use_raw_input) {
break;
@@ -2038,8 +2080,14 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
mm.instance();
mm->set_window_id(window_id);
- mm->set_pressure(pen_info.pressure ? (float)pen_info.pressure / 1024 : 0);
- mm->set_tilt(Vector2(pen_info.tiltX ? (float)pen_info.tiltX / 90 : 0, pen_info.tiltY ? (float)pen_info.tiltY / 90 : 0));
+ if (pen_info.penMask & PEN_MASK_PRESSURE) {
+ mm->set_pressure((float)pen_info.pressure / 1024);
+ } else {
+ mm->set_pressure((HIWORD(wParam) & POINTER_MESSAGE_FLAG_FIRSTBUTTON) ? 1.0f : 0.0f);
+ }
+ if ((pen_info.penMask & PEN_MASK_TILT_X) && (pen_info.penMask & PEN_MASK_TILT_Y)) {
+ mm->set_tilt(Vector2((float)pen_info.tiltX / 90, (float)pen_info.tiltY / 90));
+ }
mm->set_control((wParam & MK_CONTROL) != 0);
mm->set_shift((wParam & MK_SHIFT) != 0);
@@ -2138,6 +2186,22 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
mm->set_shift((wParam & MK_SHIFT) != 0);
mm->set_alt(alt_mem);
+ if (!OS::get_singleton()->is_wintab_disabled() && wintab_available && windows[window_id].wtctx) {
+ // Note: WinTab sends both WT_PACKET and WM_xBUTTONDOWN/UP/MOUSEMOVE events, use mouse 1/0 pressure only when last_pressure was not update recently.
+ if (windows[window_id].last_pressure_update < 10) {
+ windows[window_id].last_pressure_update++;
+ } else {
+ windows[window_id].last_tilt = Vector2();
+ windows[window_id].last_pressure = (wParam & MK_LBUTTON) ? 1.0f : 0.0f;
+ }
+ } else {
+ windows[window_id].last_tilt = Vector2();
+ windows[window_id].last_pressure = (wParam & MK_LBUTTON) ? 1.0f : 0.0f;
+ }
+
+ mm->set_pressure(windows[window_id].last_pressure);
+ mm->set_tilt(windows[window_id].last_tilt);
+
mm->set_button_mask(last_button_state);
mm->set_position(Vector2(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)));
@@ -2759,6 +2823,39 @@ DisplayServer::WindowID DisplayServerWindows::_create_window(WindowMode p_mode,
DragAcceptFiles(wd.hWnd, true);
+ if (!OS::get_singleton()->is_wintab_disabled() && wintab_available) {
+ wintab_WTInfo(WTI_DEFSYSCTX, 0, &wd.wtlc);
+ wd.wtlc.lcOptions |= CXO_MESSAGES;
+ wd.wtlc.lcPktData = PK_NORMAL_PRESSURE | PK_TANGENT_PRESSURE | PK_ORIENTATION;
+ wd.wtlc.lcMoveMask = PK_NORMAL_PRESSURE | PK_TANGENT_PRESSURE;
+ wd.wtlc.lcPktMode = 0;
+ wd.wtlc.lcOutOrgX = 0;
+ wd.wtlc.lcOutExtX = wd.wtlc.lcInExtX;
+ wd.wtlc.lcOutOrgY = 0;
+ wd.wtlc.lcOutExtY = -wd.wtlc.lcInExtY;
+ wd.wtctx = wintab_WTOpen(wd.hWnd, &wd.wtlc, false);
+ if (wd.wtctx) {
+ wintab_WTEnable(wd.wtctx, true);
+ AXIS pressure;
+ if (wintab_WTInfo(WTI_DEVICES + wd.wtlc.lcDevice, DVC_NPRESSURE, &pressure)) {
+ wd.min_pressure = int(pressure.axMin);
+ wd.max_pressure = int(pressure.axMax);
+ }
+ AXIS orientation[3];
+ if (wintab_WTInfo(WTI_DEVICES + wd.wtlc.lcDevice, DVC_ORIENTATION, &orientation)) {
+ wd.tilt_supported = orientation[0].axResolution && orientation[1].axResolution;
+ }
+ } else {
+ print_verbose("WinTab context creation failed.");
+ }
+ } else {
+ wd.wtctx = 0;
+ }
+
+ wd.last_pressure = 0;
+ wd.last_pressure_update = 0;
+ wd.last_tilt = Vector2();
+
// IME
wd.im_himc = ImmGetContext(wd.hWnd);
ImmReleaseContext(wd.hWnd, wd.im_himc);
@@ -2776,6 +2873,15 @@ DisplayServer::WindowID DisplayServerWindows::_create_window(WindowMode p_mode,
return id;
}
+// WinTab API
+bool DisplayServerWindows::wintab_available = false;
+WTOpenPtr DisplayServerWindows::wintab_WTOpen = nullptr;
+WTClosePtr DisplayServerWindows::wintab_WTClose = nullptr;
+WTInfoPtr DisplayServerWindows::wintab_WTInfo = nullptr;
+WTPacketPtr DisplayServerWindows::wintab_WTPacket = nullptr;
+WTEnablePtr DisplayServerWindows::wintab_WTEnable = nullptr;
+
+// Windows Ink API
GetPointerTypePtr DisplayServerWindows::win8p_GetPointerType = nullptr;
GetPointerPenInfoPtr DisplayServerWindows::win8p_GetPointerPenInfo = nullptr;
@@ -2787,7 +2893,19 @@ typedef enum _SHC_PROCESS_DPI_AWARENESS {
DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, WindowMode p_mode, uint32_t p_flags, const Vector2i &p_resolution, Error &r_error) {
- //Note: Functions for pen input, available on Windows 8+
+ //Note: Wacom WinTab driver API for pen input, for devices incompatible with Windows Ink.
+ HMODULE wintab_lib = LoadLibraryW(L"wintab32.dll");
+ if (wintab_lib) {
+ wintab_WTOpen = (WTOpenPtr)GetProcAddress(wintab_lib, "WTOpenW");
+ wintab_WTClose = (WTClosePtr)GetProcAddress(wintab_lib, "WTClose");
+ wintab_WTInfo = (WTInfoPtr)GetProcAddress(wintab_lib, "WTInfoW");
+ wintab_WTPacket = (WTPacketPtr)GetProcAddress(wintab_lib, "WTPacket");
+ wintab_WTEnable = (WTEnablePtr)GetProcAddress(wintab_lib, "WTEnable");
+
+ wintab_available = wintab_WTOpen && wintab_WTClose && wintab_WTInfo && wintab_WTPacket && wintab_WTEnable;
+ }
+
+ //Note: Windows Ink API for pen input, available on Windows 8+ only.
HMODULE user32_lib = LoadLibraryW(L"user32.dll");
if (user32_lib) {
win8p_GetPointerType = (GetPointerTypePtr)GetProcAddress(user32_lib, "GetPointerType");
@@ -3004,7 +3122,10 @@ DisplayServerWindows::~DisplayServerWindows() {
context_vulkan->window_destroy(MAIN_WINDOW_ID);
}
#endif
-
+ if (wintab_available && windows[MAIN_WINDOW_ID].wtctx) {
+ wintab_WTClose(windows[MAIN_WINDOW_ID].wtctx);
+ windows[MAIN_WINDOW_ID].wtctx = 0;
+ }
DestroyWindow(windows[MAIN_WINDOW_ID].hWnd);
}
}
diff --git a/platform/windows/display_server_windows.h b/platform/windows/display_server_windows.h
index 6243f54cfa..4f5bdbac5b 100644
--- a/platform/windows/display_server_windows.h
+++ b/platform/windows/display_server_windows.h
@@ -66,6 +66,87 @@
#include <windows.h>
#include <windowsx.h>
+// WinTab API
+#define WT_PACKET 0x7FF0
+#define WT_PROXIMITY 0x7FF5
+#define WT_INFOCHANGE 0x7FF6
+#define WT_CSRCHANGE 0x7FF7
+
+#define WTI_DEFSYSCTX 4
+#define WTI_DEVICES 100
+#define DVC_NPRESSURE 15
+#define DVC_TPRESSURE 16
+#define DVC_ORIENTATION 17
+#define DVC_ROTATION 18
+
+#define CXO_MESSAGES 0x0004
+#define PK_NORMAL_PRESSURE 0x0400
+#define PK_TANGENT_PRESSURE 0x0800
+#define PK_ORIENTATION 0x1000
+
+typedef struct tagLOGCONTEXTW {
+ WCHAR lcName[40];
+ UINT lcOptions;
+ UINT lcStatus;
+ UINT lcLocks;
+ UINT lcMsgBase;
+ UINT lcDevice;
+ UINT lcPktRate;
+ DWORD lcPktData;
+ DWORD lcPktMode;
+ DWORD lcMoveMask;
+ DWORD lcBtnDnMask;
+ DWORD lcBtnUpMask;
+ LONG lcInOrgX;
+ LONG lcInOrgY;
+ LONG lcInOrgZ;
+ LONG lcInExtX;
+ LONG lcInExtY;
+ LONG lcInExtZ;
+ LONG lcOutOrgX;
+ LONG lcOutOrgY;
+ LONG lcOutOrgZ;
+ LONG lcOutExtX;
+ LONG lcOutExtY;
+ LONG lcOutExtZ;
+ DWORD lcSensX;
+ DWORD lcSensY;
+ DWORD lcSensZ;
+ BOOL lcSysMode;
+ int lcSysOrgX;
+ int lcSysOrgY;
+ int lcSysExtX;
+ int lcSysExtY;
+ DWORD lcSysSensX;
+ DWORD lcSysSensY;
+} LOGCONTEXTW;
+
+typedef struct tagAXIS {
+ LONG axMin;
+ LONG axMax;
+ UINT axUnits;
+ DWORD axResolution;
+} AXIS;
+
+typedef struct tagORIENTATION {
+ int orAzimuth;
+ int orAltitude;
+ int orTwist;
+} ORIENTATION;
+
+typedef struct tagPACKET {
+ int pkNormalPressure;
+ int pkTangentPressure;
+ ORIENTATION pkOrientation;
+} PACKET;
+
+typedef HANDLE(WINAPI *WTOpenPtr)(HWND p_window, LOGCONTEXTW *p_ctx, BOOL p_enable);
+typedef BOOL(WINAPI *WTClosePtr)(HANDLE p_ctx);
+typedef UINT(WINAPI *WTInfoPtr)(UINT p_category, UINT p_index, LPVOID p_output);
+typedef BOOL(WINAPI *WTPacketPtr)(HANDLE p_ctx, UINT p_param, LPVOID p_packets);
+typedef BOOL(WINAPI *WTEnablePtr)(HANDLE p_ctx, BOOL p_enable);
+
+// Windows Ink API
#ifndef POINTER_STRUCTURES
#define POINTER_STRUCTURES
@@ -75,6 +156,22 @@ typedef UINT32 POINTER_FLAGS;
typedef UINT32 PEN_FLAGS;
typedef UINT32 PEN_MASK;
+#ifndef PEN_MASK_PRESSURE
+#define PEN_MASK_PRESSURE 0x00000001
+#endif
+
+#ifndef PEN_MASK_TILT_X
+#define PEN_MASK_TILT_X 0x00000004
+#endif
+
+#ifndef PEN_MASK_TILT_Y
+#define PEN_MASK_TILT_Y 0x00000008
+#endif
+
+#ifndef POINTER_MESSAGE_FLAG_FIRSTBUTTON
+#define POINTER_MESSAGE_FLAG_FIRSTBUTTON 0x00000010
+#endif
+
enum tagPOINTER_INPUT_TYPE {
PT_POINTER = 0x00000001,
PT_TOUCH = 0x00000002,
@@ -128,6 +225,10 @@ typedef struct tagPOINTER_PEN_INFO {
#endif //POINTER_STRUCTURES
+#ifndef WM_POINTERUPDATE
+#define WM_POINTERUPDATE 0x0245
+#endif
+
typedef BOOL(WINAPI *GetPointerTypePtr)(uint32_t p_id, POINTER_INPUT_TYPE *p_type);
typedef BOOL(WINAPI *GetPointerPenInfoPtr)(uint32_t p_id, POINTER_PEN_INFO *p_pen_info);
@@ -155,6 +256,15 @@ class DisplayServerWindows : public DisplayServer {
_THREAD_SAFE_CLASS_
+ // WinTab API
+ static bool wintab_available;
+ static WTOpenPtr wintab_WTOpen;
+ static WTClosePtr wintab_WTClose;
+ static WTInfoPtr wintab_WTInfo;
+ static WTPacketPtr wintab_WTPacket;
+ static WTEnablePtr wintab_WTEnable;
+
+ // Windows Ink API
static GetPointerTypePtr win8p_GetPointerType;
static GetPointerPenInfoPtr win8p_GetPointerPenInfo;
@@ -214,6 +324,16 @@ class DisplayServerWindows : public DisplayServer {
bool no_focus = false;
bool window_has_focus = false;
+ HANDLE wtctx;
+ LOGCONTEXTW wtlc;
+ int min_pressure;
+ int max_pressure;
+ bool tilt_supported;
+
+ int last_pressure_update;
+ float last_pressure;
+ Vector2 last_tilt;
+
HBITMAP hBitmap; //DIB section for layered window
uint8_t *dib_data = nullptr;
Size2 dib_size;
diff --git a/scene/2d/navigation_region_2d.cpp b/scene/2d/navigation_region_2d.cpp
index 19484442b1..abbfbf83b7 100644
--- a/scene/2d/navigation_region_2d.cpp
+++ b/scene/2d/navigation_region_2d.cpp
@@ -118,7 +118,7 @@ Array NavigationPolygon::_get_polygons() const {
return ret;
}
-void NavigationPolygon::_set_outlines(const TypedArray<Vector<int32_t>> &p_array) {
+void NavigationPolygon::_set_outlines(const TypedArray<Vector<Vector2>> &p_array) {
outlines.resize(p_array.size());
for (int i = 0; i < p_array.size(); i++) {
diff --git a/scene/2d/navigation_region_2d.h b/scene/2d/navigation_region_2d.h
index cbfe4299fb..e730df6373 100644
--- a/scene/2d/navigation_region_2d.h
+++ b/scene/2d/navigation_region_2d.h
@@ -58,7 +58,7 @@ protected:
void _set_polygons(const TypedArray<Vector<int32_t>> &p_array);
Array _get_polygons() const;
- void _set_outlines(const TypedArray<Vector<int32_t>> &p_array);
+ void _set_outlines(const TypedArray<Vector<Vector2>> &p_array);
Array _get_outlines() const;
public:
diff --git a/scene/2d/node_2d.cpp b/scene/2d/node_2d.cpp
index ac8a77b6cb..1ea51be148 100644
--- a/scene/2d/node_2d.cpp
+++ b/scene/2d/node_2d.cpp
@@ -42,6 +42,7 @@ Dictionary Node2D::_edit_get_state() const {
state["position"] = get_position();
state["rotation"] = get_rotation();
state["scale"] = get_scale();
+ state["skew"] = get_skew();
return state;
}
@@ -51,11 +52,14 @@ void Node2D::_edit_set_state(const Dictionary &p_state) {
pos = p_state["position"];
angle = p_state["rotation"];
_scale = p_state["scale"];
+ skew = p_state["skew"];
_update_transform();
_change_notify("rotation");
_change_notify("rotation_degrees");
_change_notify("scale");
+ _change_notify("skew");
+ _change_notify("skew_degrees");
_change_notify("position");
}
@@ -111,7 +115,7 @@ void Node2D::_edit_set_rect(const Rect2 &p_edit_rect) {
Point2 new_pos = p_edit_rect.position + p_edit_rect.size * zero_offset;
Transform2D postxf;
- postxf.set_rotation_and_scale(angle, _scale);
+ postxf.set_rotation_scale_and_skew(angle, _scale, skew);
new_pos = postxf.xform(new_pos);
pos += new_pos;
@@ -128,12 +132,13 @@ void Node2D::_update_xform_values() {
pos = _mat.elements[2];
angle = _mat.get_rotation();
_scale = _mat.get_scale();
+ skew = _mat.get_skew();
_xform_dirty = false;
}
void Node2D::_update_transform() {
- _mat.set_rotation_and_scale(angle, _scale);
+ _mat.set_rotation_scale_and_skew(angle, _scale, skew);
_mat.elements[2] = pos;
RenderingServer::get_singleton()->canvas_item_set_transform(get_canvas_item(), _mat);
@@ -163,11 +168,26 @@ void Node2D::set_rotation(float p_radians) {
_change_notify("rotation_degrees");
}
+void Node2D::set_skew(float p_radians) {
+
+ if (_xform_dirty)
+ ((Node2D *)this)->_update_xform_values();
+ skew = p_radians;
+ _update_transform();
+ _change_notify("skew");
+ _change_notify("skew_degrees");
+}
+
void Node2D::set_rotation_degrees(float p_degrees) {
set_rotation(Math::deg2rad(p_degrees));
}
+void Node2D::set_skew_degrees(float p_degrees) {
+
+ set_skew(Math::deg2rad(p_degrees));
+}
+
void Node2D::set_scale(const Size2 &p_scale) {
if (_xform_dirty)
@@ -196,11 +216,22 @@ float Node2D::get_rotation() const {
return angle;
}
+float Node2D::get_skew() const {
+ if (_xform_dirty)
+ ((Node2D *)this)->_update_xform_values();
+
+ return skew;
+}
+
float Node2D::get_rotation_degrees() const {
return Math::rad2deg(get_rotation());
}
+float Node2D::get_skew_degrees() const {
+
+ return Math::rad2deg(get_skew());
+}
Size2 Node2D::get_scale() const {
if (_xform_dirty)
((Node2D *)this)->_update_xform_values();
@@ -398,11 +429,15 @@ void Node2D::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_position", "position"), &Node2D::set_position);
ClassDB::bind_method(D_METHOD("set_rotation", "radians"), &Node2D::set_rotation);
ClassDB::bind_method(D_METHOD("set_rotation_degrees", "degrees"), &Node2D::set_rotation_degrees);
+ ClassDB::bind_method(D_METHOD("set_skew", "radians"), &Node2D::set_skew);
+ ClassDB::bind_method(D_METHOD("set_skew_degrees", "degrees"), &Node2D::set_skew_degrees);
ClassDB::bind_method(D_METHOD("set_scale", "scale"), &Node2D::set_scale);
ClassDB::bind_method(D_METHOD("get_position"), &Node2D::get_position);
ClassDB::bind_method(D_METHOD("get_rotation"), &Node2D::get_rotation);
ClassDB::bind_method(D_METHOD("get_rotation_degrees"), &Node2D::get_rotation_degrees);
+ ClassDB::bind_method(D_METHOD("get_skew"), &Node2D::get_skew);
+ ClassDB::bind_method(D_METHOD("get_skew_degrees"), &Node2D::get_skew_degrees);
ClassDB::bind_method(D_METHOD("get_scale"), &Node2D::get_scale);
ClassDB::bind_method(D_METHOD("rotate", "radians"), &Node2D::rotate);
@@ -443,6 +478,8 @@ void Node2D::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "rotation", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR), "set_rotation", "get_rotation");
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "rotation_degrees", PROPERTY_HINT_RANGE, "-360,360,0.1,or_lesser,or_greater", PROPERTY_USAGE_EDITOR), "set_rotation_degrees", "get_rotation_degrees");
ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "scale"), "set_scale", "get_scale");
+ ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "skew", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR), "set_skew", "get_skew");
+ ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "skew_degrees", PROPERTY_HINT_RANGE, "-89.9,89.9,0.1", PROPERTY_USAGE_EDITOR), "set_skew_degrees", "get_skew_degrees");
ADD_PROPERTY(PropertyInfo(Variant::TRANSFORM2D, "transform", PROPERTY_HINT_NONE, "", 0), "set_transform", "get_transform");
ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "global_position", PROPERTY_HINT_NONE, "", 0), "set_global_position", "get_global_position");
@@ -460,6 +497,7 @@ Node2D::Node2D() {
angle = 0;
_scale = Vector2(1, 1);
+ skew = 0;
_xform_dirty = false;
z_index = 0;
z_relative = true;
diff --git a/scene/2d/node_2d.h b/scene/2d/node_2d.h
index abed05ed0c..0afec36254 100644
--- a/scene/2d/node_2d.h
+++ b/scene/2d/node_2d.h
@@ -40,6 +40,7 @@ class Node2D : public CanvasItem {
Point2 pos;
float angle;
Size2 _scale;
+ float skew;
int z_index;
bool z_relative;
@@ -75,6 +76,8 @@ public:
void set_position(const Point2 &p_pos);
void set_rotation(float p_radians);
void set_rotation_degrees(float p_degrees);
+ void set_skew(float p_radians);
+ void set_skew_degrees(float p_radians);
void set_scale(const Size2 &p_scale);
void rotate(float p_radians);
@@ -86,7 +89,9 @@ public:
Point2 get_position() const;
float get_rotation() const;
+ float get_skew() const;
float get_rotation_degrees() const;
+ float get_skew_degrees() const;
Size2 get_scale() const;
Point2 get_global_position() const;
diff --git a/scene/2d/tile_map.cpp b/scene/2d/tile_map.cpp
index 9628c01718..86e61fe878 100644
--- a/scene/2d/tile_map.cpp
+++ b/scene/2d/tile_map.cpp
@@ -940,13 +940,10 @@ void TileMap::update_bitmask_area(const Vector2 &p_pos) {
void TileMap::update_bitmask_region(const Vector2 &p_start, const Vector2 &p_end) {
if ((p_end.x < p_start.x || p_end.y < p_start.y) || (p_end.x == p_start.x && p_end.y == p_start.y)) {
- int i;
Array a = get_used_cells();
- for (i = 0; i < a.size(); i++) {
- // update_bitmask_area() in order to update cells adjacent to the
- // current cell, since ordering in array may not be reliable
+ for (int i = 0; i < a.size(); i++) {
Vector2 vector = (Vector2)a[i];
- update_bitmask_area(Vector2(vector.x, vector.y));
+ update_cell_bitmask(vector.x, vector.y);
}
return;
}
diff --git a/scene/3d/audio_stream_player_3d.cpp b/scene/3d/audio_stream_player_3d.cpp
index 097368853e..5701d3cea2 100644
--- a/scene/3d/audio_stream_player_3d.cpp
+++ b/scene/3d/audio_stream_player_3d.cpp
@@ -385,8 +385,8 @@ void AudioStreamPlayer3D::_notification(int p_what) {
linear_velocity = velocity_tracker->get_tracked_linear_velocity();
}
- Ref<World3D> world = get_world();
- ERR_FAIL_COND(world.is_null());
+ Ref<World3D> world_3d = get_world_3d();
+ ERR_FAIL_COND(world_3d.is_null());
int new_output_count = 0;
@@ -396,7 +396,7 @@ void AudioStreamPlayer3D::_notification(int p_what) {
//check if any area is diverting sound into a bus
- PhysicsDirectSpaceState3D *space_state = PhysicsServer3D::get_singleton()->space_get_direct_state(world->get_space());
+ PhysicsDirectSpaceState3D *space_state = PhysicsServer3D::get_singleton()->space_get_direct_state(world_3d->get_space());
PhysicsDirectSpaceState3D::ShapeResult sr[MAX_INTERSECT_AREAS];
@@ -419,7 +419,7 @@ void AudioStreamPlayer3D::_notification(int p_what) {
}
List<Camera3D *> cameras;
- world->get_camera_list(&cameras);
+ world_3d->get_camera_list(&cameras);
for (List<Camera3D *>::Element *E = cameras.front(); E; E = E->next()) {
@@ -556,7 +556,7 @@ void AudioStreamPlayer3D::_notification(int p_what) {
for (int i = 0; i < vol_index_max; i++) {
- output.reverb_vol[i] = output.reverb_vol[i].linear_interpolate(center_frame, attenuation);
+ output.reverb_vol[i] = output.reverb_vol[i].lerp(center_frame, attenuation);
}
} else {
for (int i = 0; i < vol_index_max; i++) {
@@ -567,7 +567,7 @@ void AudioStreamPlayer3D::_notification(int p_what) {
for (int i = 0; i < vol_index_max; i++) {
- output.reverb_vol[i] = output.vol[i].linear_interpolate(output.reverb_vol[i] * attenuation, uniformity);
+ output.reverb_vol[i] = output.vol[i].lerp(output.reverb_vol[i] * attenuation, uniformity);
output.reverb_vol[i] *= area_send;
}
@@ -710,6 +710,11 @@ float AudioStreamPlayer3D::get_pitch_scale() const {
void AudioStreamPlayer3D::play(float p_from_pos) {
+ if (!is_playing()) {
+ // Reset the prev_output_count if the stream is stopped
+ prev_output_count = 0;
+ }
+
if (stream_playback.is_valid()) {
active = true;
setplay = p_from_pos;
diff --git a/scene/3d/camera_3d.cpp b/scene/3d/camera_3d.cpp
index 706c49b43b..871f3119bc 100644
--- a/scene/3d/camera_3d.cpp
+++ b/scene/3d/camera_3d.cpp
@@ -95,8 +95,8 @@ void Camera3D::_update_camera() {
get_viewport()->_camera_transform_changed_notify();
- if (get_world().is_valid()) {
- get_world()->_update_camera(this);
+ if (get_world_3d().is_valid()) {
+ get_world_3d()->_update_camera(this);
}
}
@@ -144,12 +144,12 @@ void Camera3D::_notification(int p_what) {
} break;
case NOTIFICATION_BECAME_CURRENT: {
if (viewport) {
- viewport->find_world()->_register_camera(this);
+ viewport->find_world_3d()->_register_camera(this);
}
} break;
case NOTIFICATION_LOST_CURRENT: {
if (viewport) {
- viewport->find_world()->_remove_camera(this);
+ viewport->find_world_3d()->_remove_camera(this);
}
} break;
}
@@ -689,7 +689,7 @@ Camera3D::Camera3D() {
viewport = nullptr;
force_change = false;
mode = PROJECTION_PERSPECTIVE;
- set_perspective(70.0, 0.05, 100.0);
+ set_perspective(75.0, 0.05, 100.0);
keep_aspect = KEEP_HEIGHT;
layers = 0xfffff;
v_offset = 0;
@@ -743,7 +743,7 @@ void ClippedCamera3D::_notification(int p_what) {
return;
}
- PhysicsDirectSpaceState3D *dspace = get_world()->get_direct_space_state();
+ PhysicsDirectSpaceState3D *dspace = get_world_3d()->get_direct_space_state();
ERR_FAIL_COND(!dspace); // most likely physics set to threads
Vector3 cam_fw = -get_global_transform().basis.get_axis(Vector3::AXIS_Z).normalized();
diff --git a/scene/3d/collision_object_3d.cpp b/scene/3d/collision_object_3d.cpp
index e6cd7bfe7e..5d050e32b0 100644
--- a/scene/3d/collision_object_3d.cpp
+++ b/scene/3d/collision_object_3d.cpp
@@ -44,7 +44,7 @@ void CollisionObject3D::_notification(int p_what) {
else
PhysicsServer3D::get_singleton()->body_set_state(rid, PhysicsServer3D::BODY_STATE_TRANSFORM, get_global_transform());
- RID space = get_world()->get_space();
+ RID space = get_world_3d()->get_space();
if (area) {
PhysicsServer3D::get_singleton()->area_set_space(rid, space);
} else
diff --git a/scene/3d/cpu_particles_3d.cpp b/scene/3d/cpu_particles_3d.cpp
index 12c105b0f4..4c25f55f0b 100644
--- a/scene/3d/cpu_particles_3d.cpp
+++ b/scene/3d/cpu_particles_3d.cpp
@@ -69,6 +69,7 @@ void CPUParticles3D::set_amount(int p_amount) {
for (int i = 0; i < p_amount; i++) {
w[i].active = false;
+ w[i].custom[3] = 0.0; // Make sure w component isn't garbage data
}
}
diff --git a/scene/3d/node_3d.cpp b/scene/3d/node_3d.cpp
index 0b7407e049..913a3ea49f 100644
--- a/scene/3d/node_3d.cpp
+++ b/scene/3d/node_3d.cpp
@@ -507,12 +507,12 @@ bool Node3D::is_set_as_toplevel() const {
return data.toplevel;
}
-Ref<World3D> Node3D::get_world() const {
+Ref<World3D> Node3D::get_world_3d() const {
ERR_FAIL_COND_V(!is_inside_world(), Ref<World3D>());
ERR_FAIL_COND_V(!data.viewport, Ref<World3D>());
- return data.viewport->find_world();
+ return data.viewport->find_world_3d();
}
void Node3D::_propagate_visibility_changed() {
@@ -756,7 +756,7 @@ void Node3D::_bind_methods() {
ClassDB::bind_method(D_METHOD("is_set_as_toplevel"), &Node3D::is_set_as_toplevel);
ClassDB::bind_method(D_METHOD("set_disable_scale", "disable"), &Node3D::set_disable_scale);
ClassDB::bind_method(D_METHOD("is_scale_disabled"), &Node3D::is_scale_disabled);
- ClassDB::bind_method(D_METHOD("get_world"), &Node3D::get_world);
+ ClassDB::bind_method(D_METHOD("get_world_3d"), &Node3D::get_world_3d);
ClassDB::bind_method(D_METHOD("force_update_transform"), &Node3D::force_update_transform);
diff --git a/scene/3d/node_3d.h b/scene/3d/node_3d.h
index f97a8a97dc..a4191eb2b3 100644
--- a/scene/3d/node_3d.h
+++ b/scene/3d/node_3d.h
@@ -124,7 +124,7 @@ public:
Node3D *get_parent_spatial() const;
- Ref<World3D> get_world() const;
+ Ref<World3D> get_world_3d() const;
void set_translation(const Vector3 &p_translation);
void set_rotation(const Vector3 &p_euler_rad);
diff --git a/scene/3d/physics_joint_3d.cpp b/scene/3d/physics_joint_3d.cpp
index 591c17a91e..140d887d9a 100644
--- a/scene/3d/physics_joint_3d.cpp
+++ b/scene/3d/physics_joint_3d.cpp
@@ -807,6 +807,9 @@ void Generic6DOFJoint3D::_bind_methods() {
BIND_ENUM_CONSTANT(PARAM_LINEAR_DAMPING);
BIND_ENUM_CONSTANT(PARAM_LINEAR_MOTOR_TARGET_VELOCITY);
BIND_ENUM_CONSTANT(PARAM_LINEAR_MOTOR_FORCE_LIMIT);
+ BIND_ENUM_CONSTANT(PARAM_LINEAR_SPRING_STIFFNESS);
+ BIND_ENUM_CONSTANT(PARAM_LINEAR_SPRING_DAMPING);
+ BIND_ENUM_CONSTANT(PARAM_LINEAR_SPRING_EQUILIBRIUM_POINT);
BIND_ENUM_CONSTANT(PARAM_ANGULAR_LOWER_LIMIT);
BIND_ENUM_CONSTANT(PARAM_ANGULAR_UPPER_LIMIT);
BIND_ENUM_CONSTANT(PARAM_ANGULAR_LIMIT_SOFTNESS);
@@ -816,6 +819,9 @@ void Generic6DOFJoint3D::_bind_methods() {
BIND_ENUM_CONSTANT(PARAM_ANGULAR_ERP);
BIND_ENUM_CONSTANT(PARAM_ANGULAR_MOTOR_TARGET_VELOCITY);
BIND_ENUM_CONSTANT(PARAM_ANGULAR_MOTOR_FORCE_LIMIT);
+ BIND_ENUM_CONSTANT(PARAM_ANGULAR_SPRING_STIFFNESS);
+ BIND_ENUM_CONSTANT(PARAM_ANGULAR_SPRING_DAMPING);
+ BIND_ENUM_CONSTANT(PARAM_ANGULAR_SPRING_EQUILIBRIUM_POINT);
BIND_ENUM_CONSTANT(PARAM_MAX);
BIND_ENUM_CONSTANT(FLAG_ENABLE_LINEAR_LIMIT);
diff --git a/scene/3d/ray_cast_3d.cpp b/scene/3d/ray_cast_3d.cpp
index a18da61656..304a5e1254 100644
--- a/scene/3d/ray_cast_3d.cpp
+++ b/scene/3d/ray_cast_3d.cpp
@@ -196,7 +196,7 @@ void RayCast3D::_notification(int p_what) {
}
void RayCast3D::_update_raycast_state() {
- Ref<World3D> w3d = get_world();
+ Ref<World3D> w3d = get_world_3d();
ERR_FAIL_COND(w3d.is_null());
PhysicsDirectSpaceState3D *dss = PhysicsServer3D::get_singleton()->space_get_direct_state(w3d->get_space());
diff --git a/scene/3d/skeleton_ik_3d.cpp b/scene/3d/skeleton_ik_3d.cpp
index 7366290ed3..10bdd71d73 100644
--- a/scene/3d/skeleton_ik_3d.cpp
+++ b/scene/3d/skeleton_ik_3d.cpp
@@ -287,14 +287,22 @@ void FabrikInverseKinematic::solve(Task *p_task, real_t blending_delta, bool ove
return; // Skip solving
}
- p_task->skeleton->clear_bones_global_pose_override();
+ p_task->skeleton->set_bone_global_pose_override(p_task->chain.chain_root.bone, Transform(), 0.0, true);
+
+ if (p_task->chain.middle_chain_item) {
+ p_task->skeleton->set_bone_global_pose_override(p_task->chain.middle_chain_item->bone, Transform(), 0.0, true);
+ }
+
+ for (int i = 0; i < p_task->chain.tips.size(); i += 1) {
+ p_task->skeleton->set_bone_global_pose_override(p_task->chain.tips[i].chain_item->bone, Transform(), 0.0, true);
+ }
make_goal(p_task, p_task->skeleton->get_global_transform().affine_inverse().scaled(p_task->skeleton->get_global_transform().get_basis().get_scale()), blending_delta);
update_chain(p_task->skeleton, &p_task->chain.chain_root);
if (p_use_magnet && p_task->chain.middle_chain_item) {
- p_task->chain.magnet_position = p_task->chain.middle_chain_item->initial_transform.origin.linear_interpolate(p_magnet_position, blending_delta);
+ p_task->chain.magnet_position = p_task->chain.middle_chain_item->initial_transform.origin.lerp(p_magnet_position, blending_delta);
solve_simple(p_task, true);
}
solve_simple(p_task, false);
diff --git a/scene/3d/soft_body_3d.cpp b/scene/3d/soft_body_3d.cpp
index 6092818252..850ffab292 100644
--- a/scene/3d/soft_body_3d.cpp
+++ b/scene/3d/soft_body_3d.cpp
@@ -270,7 +270,7 @@ void SoftBody3D::_notification(int p_what) {
add_change_receptor(this);
}
- RID space = get_world()->get_space();
+ RID space = get_world_3d()->get_space();
PhysicsServer3D::get_singleton()->soft_body_set_space(physics_rid, space);
prepare_physics_server();
} break;
diff --git a/scene/3d/spring_arm_3d.cpp b/scene/3d/spring_arm_3d.cpp
index 0ffde7aa8f..1410b730fd 100644
--- a/scene/3d/spring_arm_3d.cpp
+++ b/scene/3d/spring_arm_3d.cpp
@@ -147,7 +147,7 @@ void SpringArm3D::process_spring() {
if (shape.is_null()) {
motion = Vector3(cast_direction * (spring_length));
PhysicsDirectSpaceState3D::RayResult r;
- bool intersected = get_world()->get_direct_space_state()->intersect_ray(get_global_transform().origin, get_global_transform().origin + motion, r, excluded_objects, mask);
+ bool intersected = get_world_3d()->get_direct_space_state()->intersect_ray(get_global_transform().origin, get_global_transform().origin + motion, r, excluded_objects, mask);
if (intersected) {
float dist = get_global_transform().origin.distance_to(r.position);
dist -= margin;
@@ -155,7 +155,7 @@ void SpringArm3D::process_spring() {
}
} else {
motion = Vector3(cast_direction * spring_length);
- get_world()->get_direct_space_state()->cast_motion(shape->get_rid(), get_global_transform(), motion, 0, motion_delta, motion_delta_unsafe, excluded_objects, mask);
+ get_world_3d()->get_direct_space_state()->cast_motion(shape->get_rid(), get_global_transform(), motion, 0, motion_delta, motion_delta_unsafe, excluded_objects, mask);
}
current_spring_length = spring_length * motion_delta;
diff --git a/scene/3d/visibility_notifier_3d.cpp b/scene/3d/visibility_notifier_3d.cpp
index 2f657fe7b1..2707a0a514 100644
--- a/scene/3d/visibility_notifier_3d.cpp
+++ b/scene/3d/visibility_notifier_3d.cpp
@@ -68,7 +68,7 @@ void VisibilityNotifier3D::set_aabb(const AABB &p_aabb) {
aabb = p_aabb;
if (is_inside_world()) {
- get_world()->_update_notifier(this, get_global_transform().xform(aabb));
+ get_world_3d()->_update_notifier(this, get_global_transform().xform(aabb));
}
_change_notify("aabb");
@@ -85,15 +85,15 @@ void VisibilityNotifier3D::_notification(int p_what) {
switch (p_what) {
case NOTIFICATION_ENTER_WORLD: {
- get_world()->_register_notifier(this, get_global_transform().xform(aabb));
+ get_world_3d()->_register_notifier(this, get_global_transform().xform(aabb));
} break;
case NOTIFICATION_TRANSFORM_CHANGED: {
- get_world()->_update_notifier(this, get_global_transform().xform(aabb));
+ get_world_3d()->_update_notifier(this, get_global_transform().xform(aabb));
} break;
case NOTIFICATION_EXIT_WORLD: {
- get_world()->_remove_notifier(this);
+ get_world_3d()->_remove_notifier(this);
} break;
}
}
diff --git a/scene/3d/visual_instance_3d.cpp b/scene/3d/visual_instance_3d.cpp
index 604bc53422..ce8672c1dd 100644
--- a/scene/3d/visual_instance_3d.cpp
+++ b/scene/3d/visual_instance_3d.cpp
@@ -60,8 +60,8 @@ void VisualInstance3D::_notification(int p_what) {
if (skeleton)
RenderingServer::get_singleton()->instance_attach_skeleton( instance, skeleton->get_skeleton() );
*/
- ERR_FAIL_COND(get_world().is_null());
- RenderingServer::get_singleton()->instance_set_scenario(instance, get_world()->get_scenario());
+ ERR_FAIL_COND(get_world_3d().is_null());
+ RenderingServer::get_singleton()->instance_set_scenario(instance, get_world_3d()->get_scenario());
_update_visibility();
} break;
diff --git a/scene/3d/world_environment.cpp b/scene/3d/world_environment.cpp
index 8cf4554653..8dbb709ae4 100644
--- a/scene/3d/world_environment.cpp
+++ b/scene/3d/world_environment.cpp
@@ -36,50 +36,50 @@ void WorldEnvironment::_notification(int p_what) {
if (p_what == Node3D::NOTIFICATION_ENTER_WORLD || p_what == Node3D::NOTIFICATION_ENTER_TREE) {
if (environment.is_valid()) {
- if (get_viewport()->find_world()->get_environment().is_valid()) {
+ if (get_viewport()->find_world_3d()->get_environment().is_valid()) {
WARN_PRINT("World already has an environment (Another WorldEnvironment?), overriding.");
}
- get_viewport()->find_world()->set_environment(environment);
- add_to_group("_world_environment_" + itos(get_viewport()->find_world()->get_scenario().get_id()));
+ get_viewport()->find_world_3d()->set_environment(environment);
+ add_to_group("_world_environment_" + itos(get_viewport()->find_world_3d()->get_scenario().get_id()));
}
if (camera_effects.is_valid()) {
- if (get_viewport()->find_world()->get_camera_effects().is_valid()) {
+ if (get_viewport()->find_world_3d()->get_camera_effects().is_valid()) {
WARN_PRINT("World already has a camera effects (Another WorldEnvironment?), overriding.");
}
- get_viewport()->find_world()->set_camera_effects(camera_effects);
- add_to_group("_world_camera_effects_" + itos(get_viewport()->find_world()->get_scenario().get_id()));
+ get_viewport()->find_world_3d()->set_camera_effects(camera_effects);
+ add_to_group("_world_camera_effects_" + itos(get_viewport()->find_world_3d()->get_scenario().get_id()));
}
} else if (p_what == Node3D::NOTIFICATION_EXIT_WORLD || p_what == Node3D::NOTIFICATION_EXIT_TREE) {
- if (environment.is_valid() && get_viewport()->find_world()->get_environment() == environment) {
- get_viewport()->find_world()->set_environment(Ref<Environment>());
- remove_from_group("_world_environment_" + itos(get_viewport()->find_world()->get_scenario().get_id()));
+ if (environment.is_valid() && get_viewport()->find_world_3d()->get_environment() == environment) {
+ get_viewport()->find_world_3d()->set_environment(Ref<Environment>());
+ remove_from_group("_world_environment_" + itos(get_viewport()->find_world_3d()->get_scenario().get_id()));
}
- if (camera_effects.is_valid() && get_viewport()->find_world()->get_camera_effects() == camera_effects) {
- get_viewport()->find_world()->set_camera_effects(Ref<CameraEffects>());
- remove_from_group("_world_camera_effects_" + itos(get_viewport()->find_world()->get_scenario().get_id()));
+ if (camera_effects.is_valid() && get_viewport()->find_world_3d()->get_camera_effects() == camera_effects) {
+ get_viewport()->find_world_3d()->set_camera_effects(Ref<CameraEffects>());
+ remove_from_group("_world_camera_effects_" + itos(get_viewport()->find_world_3d()->get_scenario().get_id()));
}
}
}
void WorldEnvironment::set_environment(const Ref<Environment> &p_environment) {
- if (is_inside_tree() && environment.is_valid() && get_viewport()->find_world()->get_environment() == environment) {
- get_viewport()->find_world()->set_environment(Ref<Environment>());
- remove_from_group("_world_environment_" + itos(get_viewport()->find_world()->get_scenario().get_id()));
+ if (is_inside_tree() && environment.is_valid() && get_viewport()->find_world_3d()->get_environment() == environment) {
+ get_viewport()->find_world_3d()->set_environment(Ref<Environment>());
+ remove_from_group("_world_environment_" + itos(get_viewport()->find_world_3d()->get_scenario().get_id()));
//clean up
}
environment = p_environment;
if (is_inside_tree() && environment.is_valid()) {
- if (get_viewport()->find_world()->get_environment().is_valid()) {
+ if (get_viewport()->find_world_3d()->get_environment().is_valid()) {
WARN_PRINT("World already has an environment (Another WorldEnvironment?), overriding.");
}
- get_viewport()->find_world()->set_environment(environment);
- add_to_group("_world_environment_" + itos(get_viewport()->find_world()->get_scenario().get_id()));
+ get_viewport()->find_world_3d()->set_environment(environment);
+ add_to_group("_world_environment_" + itos(get_viewport()->find_world_3d()->get_scenario().get_id()));
}
update_configuration_warning();
@@ -92,19 +92,19 @@ Ref<Environment> WorldEnvironment::get_environment() const {
void WorldEnvironment::set_camera_effects(const Ref<CameraEffects> &p_camera_effects) {
- if (is_inside_tree() && camera_effects.is_valid() && get_viewport()->find_world()->get_camera_effects() == camera_effects) {
- get_viewport()->find_world()->set_camera_effects(Ref<CameraEffects>());
- remove_from_group("_world_camera_effects_" + itos(get_viewport()->find_world()->get_scenario().get_id()));
+ if (is_inside_tree() && camera_effects.is_valid() && get_viewport()->find_world_3d()->get_camera_effects() == camera_effects) {
+ get_viewport()->find_world_3d()->set_camera_effects(Ref<CameraEffects>());
+ remove_from_group("_world_camera_effects_" + itos(get_viewport()->find_world_3d()->get_scenario().get_id()));
//clean up
}
camera_effects = p_camera_effects;
if (is_inside_tree() && camera_effects.is_valid()) {
- if (get_viewport()->find_world()->get_camera_effects().is_valid()) {
+ if (get_viewport()->find_world_3d()->get_camera_effects().is_valid()) {
WARN_PRINT("World already has an camera_effects (Another WorldEnvironment?), overriding.");
}
- get_viewport()->find_world()->set_camera_effects(camera_effects);
- add_to_group("_world_camera_effects_" + itos(get_viewport()->find_world()->get_scenario().get_id()));
+ get_viewport()->find_world_3d()->set_camera_effects(camera_effects);
+ add_to_group("_world_camera_effects_" + itos(get_viewport()->find_world_3d()->get_scenario().get_id()));
}
update_configuration_warning();
@@ -125,7 +125,7 @@ String WorldEnvironment::get_configuration_warning() const {
return String();
List<Node *> nodes;
- get_tree()->get_nodes_in_group("_world_environment_" + itos(get_viewport()->find_world()->get_scenario().get_id()), &nodes);
+ get_tree()->get_nodes_in_group("_world_environment_" + itos(get_viewport()->find_world_3d()->get_scenario().get_id()), &nodes);
if (nodes.size() > 1) {
return TTR("Only one WorldEnvironment is allowed per scene (or set of instanced scenes).");
diff --git a/scene/animation/animation_player.cpp b/scene/animation/animation_player.cpp
index 946f759610..8228cf67bd 100644
--- a/scene/animation/animation_player.cpp
+++ b/scene/animation/animation_player.cpp
@@ -395,9 +395,9 @@ void AnimationPlayer::_animation_process_animation(AnimationData *p_anim, float
} else {
- nc->loc_accum = nc->loc_accum.linear_interpolate(loc, p_interp);
+ nc->loc_accum = nc->loc_accum.lerp(loc, p_interp);
nc->rot_accum = nc->rot_accum.slerp(rot, p_interp);
- nc->scale_accum = nc->scale_accum.linear_interpolate(scale, p_interp);
+ nc->scale_accum = nc->scale_accum.lerp(scale, p_interp);
}
} break;
@@ -950,13 +950,13 @@ void AnimationPlayer::_animation_process(float p_delta) {
play(queued.front()->get());
String new_name = playback.assigned;
queued.pop_front();
- if (end_notify || playback.seeked)
+ if (end_notify)
emit_signal(SceneStringNames::get_singleton()->animation_changed, old, new_name);
} else {
//stop();
playing = false;
_set_process(false);
- if (end_notify || playback.seeked)
+ if (end_notify)
emit_signal(SceneStringNames::get_singleton()->animation_finished, playback.assigned);
}
end_reached = false;
diff --git a/scene/animation/animation_tree.cpp b/scene/animation/animation_tree.cpp
index f8b3ca291b..56e224819f 100644
--- a/scene/animation/animation_tree.cpp
+++ b/scene/animation/animation_tree.cpp
@@ -958,7 +958,7 @@ void AnimationTree::_process_graph(float p_delta) {
if (err != OK)
continue;
- t->loc = t->loc.linear_interpolate(loc, blend);
+ t->loc = t->loc.lerp(loc, blend);
if (t->rot_blend_accum == 0) {
t->rot = rot;
t->rot_blend_accum = blend;
@@ -967,7 +967,7 @@ void AnimationTree::_process_graph(float p_delta) {
t->rot = rot.slerp(t->rot, t->rot_blend_accum / rot_total).normalized();
t->rot_blend_accum = rot_total;
}
- t->scale = t->scale.linear_interpolate(scale, blend);
+ t->scale = t->scale.lerp(scale, blend);
}
} break;
diff --git a/scene/animation/tween.cpp b/scene/animation/tween.cpp
index bc28c38e2c..d0c6cac8cf 100644
--- a/scene/animation/tween.cpp
+++ b/scene/animation/tween.cpp
@@ -126,14 +126,17 @@ bool Tween::_set(const StringName &p_name, const Variant &p_value) {
String name = p_name;
if (name == "playback/speed" || name == "speed") { // Backwards compatibility
set_speed_scale(p_value);
+ return true;
} else if (name == "playback/active") {
set_active(p_value);
+ return true;
} else if (name == "playback/repeat") {
set_repeat(p_value);
+ return true;
}
- return true;
+ return false;
}
bool Tween::_get(const StringName &p_name, Variant &r_ret) const {
@@ -142,14 +145,17 @@ bool Tween::_get(const StringName &p_name, Variant &r_ret) const {
String name = p_name;
if (name == "playback/speed") { // Backwards compatibility
r_ret = speed_scale;
+ return true;
} else if (name == "playback/active") {
r_ret = is_active();
+ return true;
} else if (name == "playback/repeat") {
r_ret = is_repeat();
+ return true;
}
- return true;
+ return false;
}
void Tween::_get_property_list(List<PropertyInfo> *p_list) const {
diff --git a/scene/gui/control.cpp b/scene/gui/control.cpp
index b4dc37c74f..b710ba4803 100644
--- a/scene/gui/control.cpp
+++ b/scene/gui/control.cpp
@@ -2896,7 +2896,7 @@ void Control::_bind_methods() {
ADD_GROUP("Size Flags", "size_flags_");
ADD_PROPERTY(PropertyInfo(Variant::INT, "size_flags_horizontal", PROPERTY_HINT_FLAGS, "Fill,Expand,Shrink Center,Shrink End"), "set_h_size_flags", "get_h_size_flags");
ADD_PROPERTY(PropertyInfo(Variant::INT, "size_flags_vertical", PROPERTY_HINT_FLAGS, "Fill,Expand,Shrink Center,Shrink End"), "set_v_size_flags", "get_v_size_flags");
- ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "size_flags_stretch_ratio", PROPERTY_HINT_RANGE, "0,128,0.01"), "set_stretch_ratio", "get_stretch_ratio");
+ ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "size_flags_stretch_ratio", PROPERTY_HINT_RANGE, "0,20,0.01,or_greater"), "set_stretch_ratio", "get_stretch_ratio");
ADD_GROUP("Theme", "");
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "theme", PROPERTY_HINT_RESOURCE_TYPE, "Theme"), "set_theme", "get_theme");
ADD_GROUP("", "");
diff --git a/scene/gui/gradient_edit.cpp b/scene/gui/gradient_edit.cpp
index 88107f754c..a6ed3d8de9 100644
--- a/scene/gui/gradient_edit.cpp
+++ b/scene/gui/gradient_edit.cpp
@@ -207,7 +207,7 @@ void GradientEdit::_gui_input(const Ref<InputEvent> &p_event) {
prev = points[pos];
}
- newPoint.color = prev.color.linear_interpolate(next.color, (newPoint.offset - prev.offset) / (next.offset - prev.offset));
+ newPoint.color = prev.color.lerp(next.color, (newPoint.offset - prev.offset) / (next.offset - prev.offset));
points.push_back(newPoint);
points.sort();
diff --git a/scene/gui/graph_edit.cpp b/scene/gui/graph_edit.cpp
index 3af730de23..0bf67df9b4 100644
--- a/scene/gui/graph_edit.cpp
+++ b/scene/gui/graph_edit.cpp
@@ -653,7 +653,7 @@ void GraphEdit::_bake_segment2d(Vector<Vector2> &points, Vector<Color> &colors,
if (p_depth >= p_min_depth && (dp < p_tol || p_depth >= p_max_depth)) {
points.push_back((beg + end) * 0.5);
- colors.push_back(p_color.linear_interpolate(p_to_color, mp));
+ colors.push_back(p_color.lerp(p_to_color, mp));
lines++;
} else {
_bake_segment2d(points, colors, p_begin, mp, p_a, p_out, p_b, p_in, p_depth + 1, p_min_depth, p_max_depth, p_tol, p_color, p_to_color, lines);
@@ -737,8 +737,8 @@ void GraphEdit::_connections_layer_draw() {
Color tocolor = gto->get_connection_input_color(E->get().to_port);
if (E->get().activity > 0) {
- color = color.linear_interpolate(activity_color, E->get().activity);
- tocolor = tocolor.linear_interpolate(activity_color, E->get().activity);
+ color = color.lerp(activity_color, E->get().activity);
+ tocolor = tocolor.lerp(activity_color, E->get().activity);
}
_draw_cos_line(connections_layer, frompos, topos, color, tocolor);
}
diff --git a/scene/gui/popup_menu.cpp b/scene/gui/popup_menu.cpp
index a247863298..9c48801ec1 100644
--- a/scene/gui/popup_menu.cpp
+++ b/scene/gui/popup_menu.cpp
@@ -1079,6 +1079,11 @@ bool PopupMenu::is_item_shortcut_disabled(int p_idx) const {
return items[p_idx].shortcut_is_disabled;
}
+int PopupMenu::get_current_index() const {
+
+ return mouse_over;
+}
+
int PopupMenu::get_item_count() const {
return items.size();
@@ -1457,6 +1462,7 @@ void PopupMenu::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_item_tooltip", "idx"), &PopupMenu::get_item_tooltip);
ClassDB::bind_method(D_METHOD("get_item_shortcut", "idx"), &PopupMenu::get_item_shortcut);
+ ClassDB::bind_method(D_METHOD("get_current_index"), &PopupMenu::get_current_index);
ClassDB::bind_method(D_METHOD("get_item_count"), &PopupMenu::get_item_count);
ClassDB::bind_method(D_METHOD("remove_item", "idx"), &PopupMenu::remove_item);
diff --git a/scene/gui/popup_menu.h b/scene/gui/popup_menu.h
index 2eef1f009d..d5c1015863 100644
--- a/scene/gui/popup_menu.h
+++ b/scene/gui/popup_menu.h
@@ -178,6 +178,7 @@ public:
Ref<ShortCut> get_item_shortcut(int p_idx) const;
int get_item_state(int p_idx) const;
+ int get_current_index() const;
int get_item_count() const;
bool activate_item_by_event(const Ref<InputEvent> &p_event, bool p_for_global_only = false);
diff --git a/scene/gui/rich_text_label.cpp b/scene/gui/rich_text_label.cpp
index 4ae9d9b2f5..84097eb6a1 100644
--- a/scene/gui/rich_text_label.cpp
+++ b/scene/gui/rich_text_label.cpp
@@ -2093,6 +2093,8 @@ Error RichTextLabel::append_bbcode(const String &p_bbcode) {
}
String tag = p_bbcode.substr(brk_pos + 1, brk_end - brk_pos - 1);
+ Vector<String> split_tag_block = tag.split(" ", false);
+ String bbcode = !split_tag_block.empty() ? split_tag_block[0] : "";
if (tag.begins_with("/") && tag_stack.size()) {
bool tag_ok = tag_stack.size() && tag_stack.front()->get() == tag.substr(1, tag.length());
@@ -2325,15 +2327,14 @@ Error RichTextLabel::append_bbcode(const String &p_bbcode) {
pos = brk_end + 1;
tag_stack.push_front("font");
- } else if (tag.begins_with("fade")) {
- Vector<String> tags = tag.split(" ", false);
+ } else if (bbcode == "fade") {
int startIndex = 0;
int length = 10;
- if (tags.size() > 1) {
- tags.remove(0);
- for (int i = 0; i < tags.size(); i++) {
- String expr = tags[i];
+ if (split_tag_block.size() > 1) {
+ split_tag_block.remove(0);
+ for (int i = 0; i < split_tag_block.size(); i++) {
+ String expr = split_tag_block[i];
if (expr.begins_with("start=")) {
String start_str = expr.substr(6, expr.length());
startIndex = start_str.to_int();
@@ -2347,15 +2348,14 @@ Error RichTextLabel::append_bbcode(const String &p_bbcode) {
push_fade(startIndex, length);
pos = brk_end + 1;
tag_stack.push_front("fade");
- } else if (tag.begins_with("shake")) {
- Vector<String> tags = tag.split(" ", false);
+ } else if (bbcode == "shake") {
int strength = 5;
float rate = 20.0f;
- if (tags.size() > 1) {
- tags.remove(0);
- for (int i = 0; i < tags.size(); i++) {
- String expr = tags[i];
+ if (split_tag_block.size() > 1) {
+ split_tag_block.remove(0);
+ for (int i = 0; i < split_tag_block.size(); i++) {
+ String expr = split_tag_block[i];
if (expr.begins_with("level=")) {
String str_str = expr.substr(6, expr.length());
strength = str_str.to_int();
@@ -2370,15 +2370,14 @@ Error RichTextLabel::append_bbcode(const String &p_bbcode) {
pos = brk_end + 1;
tag_stack.push_front("shake");
set_process_internal(true);
- } else if (tag.begins_with("wave")) {
- Vector<String> tags = tag.split(" ", false);
+ } else if (bbcode == "wave") {
float amplitude = 20.0f;
float period = 5.0f;
- if (tags.size() > 1) {
- tags.remove(0);
- for (int i = 0; i < tags.size(); i++) {
- String expr = tags[i];
+ if (split_tag_block.size() > 1) {
+ split_tag_block.remove(0);
+ for (int i = 0; i < split_tag_block.size(); i++) {
+ String expr = split_tag_block[i];
if (expr.begins_with("amp=")) {
String amp_str = expr.substr(4, expr.length());
amplitude = amp_str.to_float();
@@ -2393,15 +2392,14 @@ Error RichTextLabel::append_bbcode(const String &p_bbcode) {
pos = brk_end + 1;
tag_stack.push_front("wave");
set_process_internal(true);
- } else if (tag.begins_with("tornado")) {
- Vector<String> tags = tag.split(" ", false);
+ } else if (bbcode == "tornado") {
float radius = 10.0f;
float frequency = 1.0f;
- if (tags.size() > 1) {
- tags.remove(0);
- for (int i = 0; i < tags.size(); i++) {
- String expr = tags[i];
+ if (split_tag_block.size() > 1) {
+ split_tag_block.remove(0);
+ for (int i = 0; i < split_tag_block.size(); i++) {
+ String expr = split_tag_block[i];
if (expr.begins_with("radius=")) {
String amp_str = expr.substr(7, expr.length());
radius = amp_str.to_float();
@@ -2416,16 +2414,15 @@ Error RichTextLabel::append_bbcode(const String &p_bbcode) {
pos = brk_end + 1;
tag_stack.push_front("tornado");
set_process_internal(true);
- } else if (tag.begins_with("rainbow")) {
- Vector<String> tags = tag.split(" ", false);
+ } else if (bbcode == "rainbow") {
float saturation = 0.8f;
float value = 0.8f;
float frequency = 1.0f;
- if (tags.size() > 1) {
- tags.remove(0);
- for (int i = 0; i < tags.size(); i++) {
- String expr = tags[i];
+ if (split_tag_block.size() > 1) {
+ split_tag_block.remove(0);
+ for (int i = 0; i < split_tag_block.size(); i++) {
+ String expr = split_tag_block[i];
if (expr.begins_with("sat=")) {
String sat_str = expr.substr(4, expr.length());
saturation = sat_str.to_float();
@@ -2444,7 +2441,7 @@ Error RichTextLabel::append_bbcode(const String &p_bbcode) {
tag_stack.push_front("rainbow");
set_process_internal(true);
} else {
- Vector<String> expr = tag.split(" ", false);
+ Vector<String> &expr = split_tag_block;
if (expr.size() < 1) {
add_text("[");
pos = brk_pos + 1;
diff --git a/scene/gui/text_edit.cpp b/scene/gui/text_edit.cpp
index 5643bb6709..aa518fbb7d 100644
--- a/scene/gui/text_edit.cpp
+++ b/scene/gui/text_edit.cpp
@@ -1153,7 +1153,7 @@ void TextEdit::_notification(int p_what) {
highlighted_text_col = _get_column_pos_of_word(highlighted_text, str, SEARCH_MATCH_CASE | SEARCH_WHOLE_WORDS, 0);
if (select_identifiers_enabled && highlighted_word.length() != 0) {
- if (_is_char(highlighted_word[0])) {
+ if (_is_char(highlighted_word[0]) || highlighted_word[0] == '.') {
highlighted_word_col = _get_column_pos_of_word(highlighted_word, fullstr, SEARCH_MATCH_CASE | SEARCH_WHOLE_WORDS, 0);
}
}
@@ -6215,6 +6215,10 @@ void TextEdit::_push_current_op() {
current_op.type = TextOperation::TYPE_NONE;
current_op.text = "";
current_op.chain_forward = false;
+
+ if (undo_stack.size() > undo_stack_max_size) {
+ undo_stack.pop_front();
+ }
}
void TextEdit::set_indent_using_spaces(const bool p_use_spaces) {
@@ -7079,6 +7083,7 @@ void TextEdit::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_line_count"), &TextEdit::get_line_count);
ClassDB::bind_method(D_METHOD("get_text"), &TextEdit::get_text);
ClassDB::bind_method(D_METHOD("get_line", "line"), &TextEdit::get_line);
+ ClassDB::bind_method(D_METHOD("set_line", "line", "new_text"), &TextEdit::set_line);
ClassDB::bind_method(D_METHOD("center_viewport_to_cursor"), &TextEdit::center_viewport_to_cursor);
ClassDB::bind_method(D_METHOD("cursor_set_column", "column", "adjust_viewport"), &TextEdit::cursor_set_column, DEFVAL(true));
@@ -7239,6 +7244,8 @@ void TextEdit::_bind_methods() {
GLOBAL_DEF("gui/timers/text_edit_idle_detect_sec", 3);
ProjectSettings::get_singleton()->set_custom_property_info("gui/timers/text_edit_idle_detect_sec", PropertyInfo(Variant::FLOAT, "gui/timers/text_edit_idle_detect_sec", PROPERTY_HINT_RANGE, "0,10,0.01,or_greater")); // No negative numbers.
+ GLOBAL_DEF("gui/common/text_edit_undo_stack_max_size", 1024);
+ ProjectSettings::get_singleton()->set_custom_property_info("gui/common/text_edit_undo_stack_max_size", PropertyInfo(Variant::INT, "gui/common/text_edit_undo_stack_max_size", PROPERTY_HINT_RANGE, "0,10000,1,or_greater")); // No negative numbers.
}
TextEdit::TextEdit() {
@@ -7318,6 +7325,7 @@ TextEdit::TextEdit() {
current_op.type = TextOperation::TYPE_NONE;
undo_enabled = true;
+ undo_stack_max_size = GLOBAL_GET("gui/common/text_edit_undo_stack_max_size");
undo_stack_pos = nullptr;
setting_text = false;
last_dblclk = 0;
diff --git a/scene/gui/text_edit.h b/scene/gui/text_edit.h
index ef8c39d32f..ac8eb5da1d 100644
--- a/scene/gui/text_edit.h
+++ b/scene/gui/text_edit.h
@@ -306,6 +306,7 @@ private:
List<TextOperation> undo_stack;
List<TextOperation>::Element *undo_stack_pos;
+ int undo_stack_max_size;
void _clear_redo();
void _do_text_op(const TextOperation &p_op, bool p_reverse);
diff --git a/scene/gui/tree.cpp b/scene/gui/tree.cpp
index aad36ebf02..329c1085df 100644
--- a/scene/gui/tree.cpp
+++ b/scene/gui/tree.cpp
@@ -779,6 +779,9 @@ void TreeItem::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_text", "column", "text"), &TreeItem::set_text);
ClassDB::bind_method(D_METHOD("get_text", "column"), &TreeItem::get_text);
+ ClassDB::bind_method(D_METHOD("set_suffix", "column", "text"), &TreeItem::set_suffix);
+ ClassDB::bind_method(D_METHOD("get_suffix", "column"), &TreeItem::get_suffix);
+
ClassDB::bind_method(D_METHOD("set_icon", "column", "texture"), &TreeItem::set_icon);
ClassDB::bind_method(D_METHOD("get_icon", "column"), &TreeItem::get_icon);
diff --git a/scene/main/scene_tree.cpp b/scene/main/scene_tree.cpp
index 22cd1c98ab..07cb8e3cd2 100644
--- a/scene/main/scene_tree.cpp
+++ b/scene/main/scene_tree.cpp
@@ -504,7 +504,7 @@ bool SceneTree::idle(float p_time) {
String env_path = ProjectSettings::get_singleton()->get("rendering/environment/default_environment");
env_path = env_path.strip_edges(); //user may have added a space or two
String cpath;
- Ref<Environment> fallback = get_root()->get_world()->get_fallback_environment();
+ Ref<Environment> fallback = get_root()->get_world_3d()->get_fallback_environment();
if (fallback.is_valid()) {
cpath = fallback->get_path();
}
@@ -519,7 +519,7 @@ bool SceneTree::idle(float p_time) {
} else {
fallback.unref();
}
- get_root()->get_world()->set_fallback_environment(fallback);
+ get_root()->get_world_3d()->set_fallback_environment(fallback);
}
}
@@ -1409,8 +1409,8 @@ SceneTree::SceneTree() {
root = memnew(Window);
root->set_name("root");
- if (!root->get_world().is_valid())
- root->set_world(Ref<World3D>(memnew(World3D)));
+ if (!root->get_world_3d().is_valid())
+ root->set_world_3d(Ref<World3D>(memnew(World3D)));
// Initialize network state
multiplayer_poll = true;
@@ -1447,7 +1447,7 @@ SceneTree::SceneTree() {
if (env_path != String()) {
Ref<Environment> env = ResourceLoader::load(env_path);
if (env.is_valid()) {
- root->get_world()->set_fallback_environment(env);
+ root->get_world_3d()->set_fallback_environment(env);
} else {
if (Engine::get_singleton()->is_editor_hint()) {
//file was erased, clear the field.
diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp
index b0718eed79..e9827d521b 100644
--- a/scene/main/viewport.cpp
+++ b/scene/main/viewport.cpp
@@ -215,7 +215,7 @@ void Viewport::update_worlds() {
find_world_2d()->_update_viewport(this, xformed_rect);
find_world_2d()->_update();
- find_world()->_update(get_tree()->get_frame());
+ find_world_3d()->_update(get_tree()->get_frame());
}
void Viewport::_collision_object_input_event(CollisionObject3D *p_object, Camera3D *p_camera, const Ref<InputEvent> &p_input_event, const Vector3 &p_pos, const Vector3 &p_normal, int p_shape) {
@@ -422,22 +422,22 @@ void Viewport::_sub_window_remove(Window *p_window) {
RenderingServer::get_singleton()->viewport_set_parent_viewport(p_window->viewport, p_window->parent ? p_window->parent->viewport : RID());
}
-void Viewport::_own_world_changed() {
- ERR_FAIL_COND(world.is_null());
- ERR_FAIL_COND(own_world.is_null());
+void Viewport::_own_world_3d_changed() {
+ ERR_FAIL_COND(world_3d.is_null());
+ ERR_FAIL_COND(own_world_3d.is_null());
if (is_inside_tree()) {
_propagate_exit_world(this);
}
- own_world = world->duplicate();
+ own_world_3d = world_3d->duplicate();
if (is_inside_tree()) {
_propagate_enter_world(this);
}
if (is_inside_tree()) {
- RenderingServer::get_singleton()->viewport_set_scenario(viewport, find_world()->get_scenario());
+ RenderingServer::get_singleton()->viewport_set_scenario(viewport, find_world_3d()->get_scenario());
}
_update_listener();
@@ -459,7 +459,7 @@ void Viewport::_notification(int p_what) {
}
current_canvas = find_world_2d()->get_canvas();
- RenderingServer::get_singleton()->viewport_set_scenario(viewport, find_world()->get_scenario());
+ RenderingServer::get_singleton()->viewport_set_scenario(viewport, find_world_3d()->get_scenario());
RenderingServer::get_singleton()->viewport_attach_canvas(viewport, current_canvas);
_update_listener();
@@ -474,14 +474,14 @@ void Viewport::_notification(int p_what) {
contact_2d_debug = RenderingServer::get_singleton()->canvas_item_create();
RenderingServer::get_singleton()->canvas_item_set_parent(contact_2d_debug, find_world_2d()->get_canvas());
//3D
- PhysicsServer3D::get_singleton()->space_set_debug_contacts(find_world()->get_space(), get_tree()->get_collision_debug_contact_count());
+ PhysicsServer3D::get_singleton()->space_set_debug_contacts(find_world_3d()->get_space(), get_tree()->get_collision_debug_contact_count());
contact_3d_debug_multimesh = RenderingServer::get_singleton()->multimesh_create();
RenderingServer::get_singleton()->multimesh_allocate(contact_3d_debug_multimesh, get_tree()->get_collision_debug_contact_count(), RS::MULTIMESH_TRANSFORM_3D, true);
RenderingServer::get_singleton()->multimesh_set_visible_instances(contact_3d_debug_multimesh, 0);
RenderingServer::get_singleton()->multimesh_set_mesh(contact_3d_debug_multimesh, get_tree()->get_debug_contact_mesh()->get_rid());
contact_3d_debug_instance = RenderingServer::get_singleton()->instance_create();
RenderingServer::get_singleton()->instance_set_base(contact_3d_debug_instance, contact_3d_debug_multimesh);
- RenderingServer::get_singleton()->instance_set_scenario(contact_3d_debug_instance, find_world()->get_scenario());
+ RenderingServer::get_singleton()->instance_set_scenario(contact_3d_debug_instance, find_world_3d()->get_scenario());
//RenderingServer::get_singleton()->instance_geometry_set_flag(contact_3d_debug_instance, RS::INSTANCE_FLAG_VISIBLE_IN_ALL_ROOMS, true);
}
@@ -576,8 +576,8 @@ void Viewport::_notification(int p_what) {
if (get_tree()->is_debugging_collisions_hint() && contact_3d_debug_multimesh.is_valid()) {
- Vector<Vector3> points = PhysicsServer3D::get_singleton()->space_get_contacts(find_world()->get_space());
- int point_count = PhysicsServer3D::get_singleton()->space_get_contact_count(find_world()->get_space());
+ Vector<Vector3> points = PhysicsServer3D::get_singleton()->space_get_contacts(find_world_3d()->get_space());
+ int point_count = PhysicsServer3D::get_singleton()->space_get_contact_count(find_world_3d()->get_space());
RS::get_singleton()->multimesh_set_visible_instances(contact_3d_debug_multimesh, point_count);
}
@@ -805,7 +805,7 @@ void Viewport::_notification(int p_what) {
Vector3 from = camera->project_ray_origin(pos);
Vector3 dir = camera->project_ray_normal(pos);
- PhysicsDirectSpaceState3D *space = PhysicsServer3D::get_singleton()->space_get_direct_state(find_world()->get_space());
+ PhysicsDirectSpaceState3D *space = PhysicsServer3D::get_singleton()->space_get_direct_state(find_world_3d()->get_space());
if (space) {
bool col = space->intersect_ray(from, from + dir * 10000, result, Set<RID>(), 0xFFFFFFFF, true, true, true);
@@ -1185,7 +1185,7 @@ void Viewport::set_world_2d(const Ref<World2D> &p_world_2d) {
return;
if (parent && parent->find_world_2d() == p_world_2d) {
- WARN_PRINT("Unable to use parent world as world_2d");
+ WARN_PRINT("Unable to use parent world_3d as world_2d");
return;
}
@@ -1197,7 +1197,7 @@ void Viewport::set_world_2d(const Ref<World2D> &p_world_2d) {
if (p_world_2d.is_valid())
world_2d = p_world_2d;
else {
- WARN_PRINT("Invalid world");
+ WARN_PRINT("Invalid world_3d");
world_2d = Ref<World2D>(memnew(World2D));
}
@@ -1235,7 +1235,7 @@ void Viewport::_propagate_enter_world(Node *p_node) {
Viewport *v = Object::cast_to<Viewport>(p_node);
if (v) {
- if (v->world.is_valid() || v->own_world.is_valid())
+ if (v->world_3d.is_valid() || v->own_world_3d.is_valid())
return;
}
#ifndef _3D_DISABLED
@@ -1275,7 +1275,7 @@ void Viewport::_propagate_exit_world(Node *p_node) {
Viewport *v = Object::cast_to<Viewport>(p_node);
if (v) {
- if (v->world.is_valid() || v->own_world.is_valid())
+ if (v->world_3d.is_valid() || v->own_world_3d.is_valid())
return;
}
#ifndef _3D_DISABLED
@@ -1289,26 +1289,26 @@ void Viewport::_propagate_exit_world(Node *p_node) {
}
}
-void Viewport::set_world(const Ref<World3D> &p_world) {
+void Viewport::set_world_3d(const Ref<World3D> &p_world_3d) {
- if (world == p_world)
+ if (world_3d == p_world_3d)
return;
if (is_inside_tree())
_propagate_exit_world(this);
- if (own_world.is_valid() && world.is_valid()) {
- world->disconnect(CoreStringNames::get_singleton()->changed, callable_mp(this, &Viewport::_own_world_changed));
+ if (own_world_3d.is_valid() && world_3d.is_valid()) {
+ world_3d->disconnect(CoreStringNames::get_singleton()->changed, callable_mp(this, &Viewport::_own_world_3d_changed));
}
- world = p_world;
+ world_3d = p_world_3d;
- if (own_world.is_valid()) {
- if (world.is_valid()) {
- own_world = world->duplicate();
- world->connect(CoreStringNames::get_singleton()->changed, callable_mp(this, &Viewport::_own_world_changed));
+ if (own_world_3d.is_valid()) {
+ if (world_3d.is_valid()) {
+ own_world_3d = world_3d->duplicate();
+ world_3d->connect(CoreStringNames::get_singleton()->changed, callable_mp(this, &Viewport::_own_world_3d_changed));
} else {
- own_world = Ref<World3D>(memnew(World3D));
+ own_world_3d = Ref<World3D>(memnew(World3D));
}
}
@@ -1316,15 +1316,15 @@ void Viewport::set_world(const Ref<World3D> &p_world) {
_propagate_enter_world(this);
if (is_inside_tree()) {
- RenderingServer::get_singleton()->viewport_set_scenario(viewport, find_world()->get_scenario());
+ RenderingServer::get_singleton()->viewport_set_scenario(viewport, find_world_3d()->get_scenario());
}
_update_listener();
}
-Ref<World3D> Viewport::get_world() const {
+Ref<World3D> Viewport::get_world_3d() const {
- return world;
+ return world_3d;
}
Ref<World2D> Viewport::get_world_2d() const {
@@ -1332,14 +1332,14 @@ Ref<World2D> Viewport::get_world_2d() const {
return world_2d;
}
-Ref<World3D> Viewport::find_world() const {
+Ref<World3D> Viewport::find_world_3d() const {
- if (own_world.is_valid())
- return own_world;
- else if (world.is_valid())
- return world;
+ if (own_world_3d.is_valid())
+ return own_world_3d;
+ else if (world_3d.is_valid())
+ return world_3d;
else if (parent)
- return parent->find_world();
+ return parent->find_world_3d();
else
return Ref<World3D>();
}
@@ -3077,25 +3077,25 @@ void Viewport::unhandled_input(const Ref<InputEvent> &p_event, bool p_local_coor
}
}
-void Viewport::set_use_own_world(bool p_world) {
+void Viewport::set_use_own_world_3d(bool p_world_3d) {
- if (p_world == own_world.is_valid())
+ if (p_world_3d == own_world_3d.is_valid())
return;
if (is_inside_tree())
_propagate_exit_world(this);
- if (!p_world) {
- own_world = Ref<World3D>();
- if (world.is_valid()) {
- world->disconnect(CoreStringNames::get_singleton()->changed, callable_mp(this, &Viewport::_own_world_changed));
+ if (!p_world_3d) {
+ own_world_3d = Ref<World3D>();
+ if (world_3d.is_valid()) {
+ world_3d->disconnect(CoreStringNames::get_singleton()->changed, callable_mp(this, &Viewport::_own_world_3d_changed));
}
} else {
- if (world.is_valid()) {
- own_world = world->duplicate();
- world->connect(CoreStringNames::get_singleton()->changed, callable_mp(this, &Viewport::_own_world_changed));
+ if (world_3d.is_valid()) {
+ own_world_3d = world_3d->duplicate();
+ world_3d->connect(CoreStringNames::get_singleton()->changed, callable_mp(this, &Viewport::_own_world_3d_changed));
} else {
- own_world = Ref<World3D>(memnew(World3D));
+ own_world_3d = Ref<World3D>(memnew(World3D));
}
}
@@ -3103,15 +3103,15 @@ void Viewport::set_use_own_world(bool p_world) {
_propagate_enter_world(this);
if (is_inside_tree()) {
- RenderingServer::get_singleton()->viewport_set_scenario(viewport, find_world()->get_scenario());
+ RenderingServer::get_singleton()->viewport_set_scenario(viewport, find_world_3d()->get_scenario());
}
_update_listener();
}
-bool Viewport::is_using_own_world() const {
+bool Viewport::is_using_own_world_3d() const {
- return own_world.is_valid();
+ return own_world_3d.is_valid();
}
void Viewport::set_physics_object_picking(bool p_enable) {
@@ -3366,9 +3366,9 @@ void Viewport::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_world_2d", "world_2d"), &Viewport::set_world_2d);
ClassDB::bind_method(D_METHOD("get_world_2d"), &Viewport::get_world_2d);
ClassDB::bind_method(D_METHOD("find_world_2d"), &Viewport::find_world_2d);
- ClassDB::bind_method(D_METHOD("set_world", "world"), &Viewport::set_world);
- ClassDB::bind_method(D_METHOD("get_world"), &Viewport::get_world);
- ClassDB::bind_method(D_METHOD("find_world"), &Viewport::find_world);
+ ClassDB::bind_method(D_METHOD("set_world_3d", "world_3d"), &Viewport::set_world_3d);
+ ClassDB::bind_method(D_METHOD("get_world_3d"), &Viewport::get_world_3d);
+ ClassDB::bind_method(D_METHOD("find_world_3d"), &Viewport::find_world_3d);
ClassDB::bind_method(D_METHOD("set_canvas_transform", "xform"), &Viewport::set_canvas_transform);
ClassDB::bind_method(D_METHOD("get_canvas_transform"), &Viewport::get_canvas_transform);
@@ -3404,8 +3404,8 @@ void Viewport::_bind_methods() {
ClassDB::bind_method(D_METHOD("update_worlds"), &Viewport::update_worlds);
- ClassDB::bind_method(D_METHOD("set_use_own_world", "enable"), &Viewport::set_use_own_world);
- ClassDB::bind_method(D_METHOD("is_using_own_world"), &Viewport::is_using_own_world);
+ ClassDB::bind_method(D_METHOD("set_use_own_world_3d", "enable"), &Viewport::set_use_own_world_3d);
+ ClassDB::bind_method(D_METHOD("is_using_own_world_3d"), &Viewport::is_using_own_world_3d);
ClassDB::bind_method(D_METHOD("get_camera"), &Viewport::get_camera);
@@ -3453,8 +3453,8 @@ void Viewport::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_default_canvas_item_texture_repeat", "mode"), &Viewport::set_default_canvas_item_texture_repeat);
ClassDB::bind_method(D_METHOD("get_default_canvas_item_texture_repeat"), &Viewport::get_default_canvas_item_texture_repeat);
- ADD_PROPERTY(PropertyInfo(Variant::BOOL, "own_world"), "set_use_own_world", "is_using_own_world");
- ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "world", PROPERTY_HINT_RESOURCE_TYPE, "World"), "set_world", "get_world");
+ ADD_PROPERTY(PropertyInfo(Variant::BOOL, "own_world_3d"), "set_use_own_world_3d", "is_using_own_world_3d");
+ ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "world_3d", PROPERTY_HINT_RESOURCE_TYPE, "World3D"), "set_world_3d", "get_world_3d");
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "world_2d", PROPERTY_HINT_RESOURCE_TYPE, "World2D", 0), "set_world_2d", "get_world_2d");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "transparent_bg"), "set_transparent_background", "has_transparent_background");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "handle_input_locally"), "set_handle_input_locally", "is_handling_input_locally");
diff --git a/scene/main/viewport.h b/scene/main/viewport.h
index 7e2df9fe42..7da57347fd 100644
--- a/scene/main/viewport.h
+++ b/scene/main/viewport.h
@@ -253,8 +253,8 @@ private:
Map<ObjectID, uint64_t> physics_2d_mouseover;
Ref<World2D> world_2d;
- Ref<World3D> world;
- Ref<World3D> own_world;
+ Ref<World3D> world_3d;
+ Ref<World3D> own_world_3d;
Rect2i to_screen_rect;
StringName input_group;
@@ -430,7 +430,7 @@ private:
void _gui_set_root_order_dirty();
- void _own_world_changed();
+ void _own_world_3d_changed();
friend class Window;
@@ -477,10 +477,10 @@ public:
Rect2 get_visible_rect() const;
RID get_viewport_rid() const;
- void set_world(const Ref<World3D> &p_world);
+ void set_world_3d(const Ref<World3D> &p_world_3d);
void set_world_2d(const Ref<World2D> &p_world_2d);
- Ref<World3D> get_world() const;
- Ref<World3D> find_world() const;
+ Ref<World3D> get_world_3d() const;
+ Ref<World3D> find_world_3d() const;
Ref<World2D> get_world_2d() const;
Ref<World2D> find_world_2d() const;
@@ -519,8 +519,8 @@ public:
Vector2 get_camera_coords(const Vector2 &p_viewport_coords) const;
Vector2 get_camera_rect_size() const;
- void set_use_own_world(bool p_world);
- bool is_using_own_world() const;
+ void set_use_own_world_3d(bool p_world_3d);
+ bool is_using_own_world_3d() const;
void input_text(const String &p_text);
void input(const Ref<InputEvent> &p_event, bool p_local_coords = false);
diff --git a/scene/resources/animation.cpp b/scene/resources/animation.cpp
index aa4c9bf225..ea4338519e 100644
--- a/scene/resources/animation.cpp
+++ b/scene/resources/animation.cpp
@@ -1570,7 +1570,7 @@ Animation::TransformKey Animation::_interpolate(const Animation::TransformKey &p
Vector3 Animation::_interpolate(const Vector3 &p_a, const Vector3 &p_b, float p_c) const {
- return p_a.linear_interpolate(p_b, p_c);
+ return p_a.lerp(p_b, p_c);
}
Quat Animation::_interpolate(const Quat &p_a, const Quat &p_b, float p_c) const {
@@ -2432,7 +2432,7 @@ float Animation::bezier_track_interpolate(int p_track, float p_time) const {
Vector2 high_pos = _bezier_interp(high, start, start_out, end_in, end);
float c = (t - low_pos.x) / (high_pos.x - low_pos.x);
- return low_pos.linear_interpolate(high_pos, c).y;
+ return low_pos.lerp(high_pos, c).y;
}
int Animation::audio_track_insert_key(int p_track, float p_time, const RES &p_stream, float p_start_offset, float p_end_offset) {
diff --git a/scene/resources/curve.cpp b/scene/resources/curve.cpp
index d19eae0d4f..ae705a47e8 100644
--- a/scene/resources/curve.cpp
+++ b/scene/resources/curve.cpp
@@ -796,7 +796,7 @@ Vector2 Curve2D::interpolate_baked(float p_offset, bool p_cubic) const {
Vector2 post = (idx < (bpc - 2)) ? r[idx + 2] : r[idx + 1];
return r[idx].cubic_interpolate(r[idx + 1], pre, post, frac);
} else {
- return r[idx].linear_interpolate(r[idx + 1], frac);
+ return r[idx].lerp(r[idx + 1], frac);
}
}
@@ -1354,7 +1354,7 @@ Vector3 Curve3D::interpolate_baked(float p_offset, bool p_cubic) const {
Vector3 post = (idx < (bpc - 2)) ? r[idx + 2] : r[idx + 1];
return r[idx].cubic_interpolate(r[idx + 1], pre, post, frac);
} else {
- return r[idx].linear_interpolate(r[idx + 1], frac);
+ return r[idx].lerp(r[idx + 1], frac);
}
}
diff --git a/scene/resources/gradient.h b/scene/resources/gradient.h
index 2d98f799e2..573749ea7e 100644
--- a/scene/resources/gradient.h
+++ b/scene/resources/gradient.h
@@ -120,7 +120,7 @@ public:
return points[0].color;
const Point &pointFirst = points[first];
const Point &pointSecond = points[second];
- return pointFirst.color.linear_interpolate(pointSecond.color, (p_offset - pointFirst.offset) / (pointSecond.offset - pointFirst.offset));
+ return pointFirst.color.lerp(pointSecond.color, (p_offset - pointFirst.offset) / (pointSecond.offset - pointFirst.offset));
}
int get_points_count() const;
diff --git a/scene/resources/visual_shader.cpp b/scene/resources/visual_shader.cpp
index 310a7ef4e4..3b245f908a 100644
--- a/scene/resources/visual_shader.cpp
+++ b/scene/resources/visual_shader.cpp
@@ -1630,9 +1630,11 @@ const VisualShaderNodeInput::Port VisualShaderNodeInput::ports[] = {
{ Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "light_vec", "vec3(LIGHT_VEC, 0.0)" },
{ Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_SCALAR, "light_height", "LIGHT_HEIGHT" },
{ Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "light_color", "LIGHT_COLOR.rgb" },
- { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "light_alpha", "LIGHT_COLOR.a" },
+ { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_SCALAR, "light_alpha", "LIGHT_COLOR.a" },
{ Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "light_uv", "vec3(LIGHT_UV, 0.0)" },
{ Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "shadow_color", "SHADOW_COLOR.rgb" },
+ { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_SCALAR, "shadow_alpha", "SHADOW_COLOR.a" },
+ { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "shadow_vec", "vec3(SHADOW_VEC, 0.0)" },
{ Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "screen_uv", "vec3(SCREEN_UV, 0.0)" },
{ Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "texture_pixel_size", "vec3(TEXTURE_PIXEL_SIZE, 1.0)" },
{ Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "point_coord", "vec3(POINT_COORD, 0.0)" },
@@ -2156,12 +2158,43 @@ String VisualShaderNodeUniform::get_uniform_name() const {
return uniform_name;
}
+void VisualShaderNodeUniform::set_qualifier(VisualShaderNodeUniform::Qualifier p_qual) {
+ qualifier = p_qual;
+ emit_changed();
+}
+
+VisualShaderNodeUniform::Qualifier VisualShaderNodeUniform::get_qualifier() const {
+ return qualifier;
+}
+
void VisualShaderNodeUniform::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_uniform_name", "name"), &VisualShaderNodeUniform::set_uniform_name);
ClassDB::bind_method(D_METHOD("get_uniform_name"), &VisualShaderNodeUniform::get_uniform_name);
+ ClassDB::bind_method(D_METHOD("set_qualifier", "qualifier"), &VisualShaderNodeUniform::set_qualifier);
+ ClassDB::bind_method(D_METHOD("get_qualifier"), &VisualShaderNodeUniform::get_qualifier);
+
ADD_PROPERTY(PropertyInfo(Variant::STRING_NAME, "uniform_name"), "set_uniform_name", "get_uniform_name");
+ ADD_PROPERTY(PropertyInfo(Variant::INT, "qualifier", PROPERTY_HINT_ENUM, "None,Global,Instance"), "set_qualifier", "get_qualifier");
+
+ BIND_ENUM_CONSTANT(QUAL_NONE);
+ BIND_ENUM_CONSTANT(QUAL_GLOBAL);
+ BIND_ENUM_CONSTANT(QUAL_INSTANCE);
+}
+
+String VisualShaderNodeUniform::_get_qual_str() const {
+ if (is_qualifier_supported(qualifier)) {
+ switch (qualifier) {
+ case QUAL_NONE:
+ break;
+ case QUAL_GLOBAL:
+ return "global ";
+ case QUAL_INSTANCE:
+ return "instance ";
+ }
+ }
+ return String();
}
String VisualShaderNodeUniform::get_warning(Shader::Mode p_mode, VisualShader::Type p_type) const {
@@ -2171,11 +2204,21 @@ String VisualShaderNodeUniform::get_warning(Shader::Mode p_mode, VisualShader::T
if (keyword_list.find(uniform_name)) {
return TTR("Uniform name cannot be equal to a shader keyword. Choose another name.");
}
+ if (!is_qualifier_supported(qualifier)) {
+ return "This uniform type does not support that qualifier.";
+ }
return String();
}
+Vector<StringName> VisualShaderNodeUniform::get_editable_properties() const {
+ Vector<StringName> props;
+ props.push_back("qualifier");
+ return props;
+}
+
VisualShaderNodeUniform::VisualShaderNodeUniform() {
+ qualifier = QUAL_NONE;
}
////////////// GroupBase
diff --git a/scene/resources/visual_shader.h b/scene/resources/visual_shader.h
index ecf3f93fbb..56f8e74d2b 100644
--- a/scene/resources/visual_shader.h
+++ b/scene/resources/visual_shader.h
@@ -369,21 +369,38 @@ public:
class VisualShaderNodeUniform : public VisualShaderNode {
GDCLASS(VisualShaderNodeUniform, VisualShaderNode);
+public:
+ enum Qualifier {
+ QUAL_NONE,
+ QUAL_GLOBAL,
+ QUAL_INSTANCE,
+ };
+
private:
String uniform_name;
+ Qualifier qualifier;
protected:
static void _bind_methods();
+ String _get_qual_str() const;
public:
void set_uniform_name(const String &p_name);
String get_uniform_name() const;
+ void set_qualifier(Qualifier p_qual);
+ Qualifier get_qualifier() const;
+
+ virtual bool is_qualifier_supported(Qualifier p_qual) const = 0;
+
+ virtual Vector<StringName> get_editable_properties() const;
virtual String get_warning(Shader::Mode p_mode, VisualShader::Type p_type) const;
VisualShaderNodeUniform();
};
+VARIANT_ENUM_CAST(VisualShaderNodeUniform::Qualifier)
+
class VisualShaderNodeGroupBase : public VisualShaderNode {
GDCLASS(VisualShaderNodeGroupBase, VisualShaderNode);
diff --git a/scene/resources/visual_shader_nodes.cpp b/scene/resources/visual_shader_nodes.cpp
index 2064ca10f3..7b9953a90f 100644
--- a/scene/resources/visual_shader_nodes.cpp
+++ b/scene/resources/visual_shader_nodes.cpp
@@ -3283,11 +3283,11 @@ String VisualShaderNodeFloatUniform::get_output_port_name(int p_port) const {
String VisualShaderNodeFloatUniform::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
if (hint == HINT_RANGE) {
- return "uniform float " + get_uniform_name() + " : hint_range(" + rtos(hint_range_min) + ", " + rtos(hint_range_max) + ");\n";
+ return _get_qual_str() + "uniform float " + get_uniform_name() + " : hint_range(" + rtos(hint_range_min) + ", " + rtos(hint_range_max) + ");\n";
} else if (hint == HINT_RANGE_STEP) {
- return "uniform float " + get_uniform_name() + " : hint_range(" + rtos(hint_range_min) + ", " + rtos(hint_range_max) + ", " + rtos(hint_range_step) + ");\n";
+ return _get_qual_str() + "uniform float " + get_uniform_name() + " : hint_range(" + rtos(hint_range_min) + ", " + rtos(hint_range_max) + ", " + rtos(hint_range_step) + ");\n";
}
- return "uniform float " + get_uniform_name() + ";\n";
+ return _get_qual_str() + "uniform float " + get_uniform_name() + ";\n";
}
String VisualShaderNodeFloatUniform::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
@@ -3353,8 +3353,12 @@ void VisualShaderNodeFloatUniform::_bind_methods() {
BIND_ENUM_CONSTANT(HINT_RANGE_STEP);
}
+bool VisualShaderNodeFloatUniform::is_qualifier_supported(Qualifier p_qual) const {
+ return true; // all qualifiers are supported
+}
+
Vector<StringName> VisualShaderNodeFloatUniform::get_editable_properties() const {
- Vector<StringName> props;
+ Vector<StringName> props = VisualShaderNodeUniform::get_editable_properties();
props.push_back("hint");
if (hint == HINT_RANGE || hint == HINT_RANGE_STEP) {
props.push_back("min");
@@ -3405,11 +3409,11 @@ String VisualShaderNodeIntUniform::get_output_port_name(int p_port) const {
String VisualShaderNodeIntUniform::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
if (hint == HINT_RANGE) {
- return "uniform int " + get_uniform_name() + " : hint_range(" + rtos(hint_range_min) + ", " + rtos(hint_range_max) + ");\n";
+ return _get_qual_str() + "uniform int " + get_uniform_name() + " : hint_range(" + rtos(hint_range_min) + ", " + rtos(hint_range_max) + ");\n";
} else if (hint == HINT_RANGE_STEP) {
- return "uniform int " + get_uniform_name() + " : hint_range(" + rtos(hint_range_min) + ", " + rtos(hint_range_max) + ", " + rtos(hint_range_step) + ");\n";
+ return _get_qual_str() + "uniform int " + get_uniform_name() + " : hint_range(" + rtos(hint_range_min) + ", " + rtos(hint_range_max) + ", " + rtos(hint_range_step) + ");\n";
}
- return "uniform int " + get_uniform_name() + ";\n";
+ return _get_qual_str() + "uniform int " + get_uniform_name() + ";\n";
}
String VisualShaderNodeIntUniform::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
@@ -3475,8 +3479,12 @@ void VisualShaderNodeIntUniform::_bind_methods() {
BIND_ENUM_CONSTANT(HINT_RANGE_STEP);
}
+bool VisualShaderNodeIntUniform::is_qualifier_supported(Qualifier p_qual) const {
+ return true; // all qualifiers are supported
+}
+
Vector<StringName> VisualShaderNodeIntUniform::get_editable_properties() const {
- Vector<StringName> props;
+ Vector<StringName> props = VisualShaderNodeUniform::get_editable_properties();
props.push_back("hint");
if (hint == HINT_RANGE || hint == HINT_RANGE_STEP) {
props.push_back("min");
@@ -3526,13 +3534,17 @@ String VisualShaderNodeBooleanUniform::get_output_port_name(int p_port) const {
}
String VisualShaderNodeBooleanUniform::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
- return "uniform bool " + get_uniform_name() + ";\n";
+ return _get_qual_str() + "uniform bool " + get_uniform_name() + ";\n";
}
String VisualShaderNodeBooleanUniform::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
return "\t" + p_output_vars[0] + " = " + get_uniform_name() + ";\n";
}
+bool VisualShaderNodeBooleanUniform::is_qualifier_supported(Qualifier p_qual) const {
+ return true; // all qualifiers are supported
+}
+
VisualShaderNodeBooleanUniform::VisualShaderNodeBooleanUniform() {
}
@@ -3568,7 +3580,7 @@ String VisualShaderNodeColorUniform::get_output_port_name(int p_port) const {
String VisualShaderNodeColorUniform::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
- return "uniform vec4 " + get_uniform_name() + " : hint_color;\n";
+ return _get_qual_str() + "uniform vec4 " + get_uniform_name() + " : hint_color;\n";
}
String VisualShaderNodeColorUniform::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
@@ -3577,6 +3589,10 @@ String VisualShaderNodeColorUniform::generate_code(Shader::Mode p_mode, VisualSh
return code;
}
+bool VisualShaderNodeColorUniform::is_qualifier_supported(Qualifier p_qual) const {
+ return true; // all qualifiers are supported
+}
+
VisualShaderNodeColorUniform::VisualShaderNodeColorUniform() {
}
@@ -3611,13 +3627,17 @@ String VisualShaderNodeVec3Uniform::get_output_port_name(int p_port) const {
}
String VisualShaderNodeVec3Uniform::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
- return "uniform vec3 " + get_uniform_name() + ";\n";
+ return _get_qual_str() + "uniform vec3 " + get_uniform_name() + ";\n";
}
String VisualShaderNodeVec3Uniform::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
return "\t" + p_output_vars[0] + " = " + get_uniform_name() + ";\n";
}
+bool VisualShaderNodeVec3Uniform::is_qualifier_supported(Qualifier p_qual) const {
+ return true; // all qualifiers are supported
+}
+
VisualShaderNodeVec3Uniform::VisualShaderNodeVec3Uniform() {
}
@@ -3652,13 +3672,17 @@ String VisualShaderNodeTransformUniform::get_output_port_name(int p_port) const
}
String VisualShaderNodeTransformUniform::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
- return "uniform mat4 " + get_uniform_name() + ";\n";
+ return _get_qual_str() + "uniform mat4 " + get_uniform_name() + ";\n";
}
String VisualShaderNodeTransformUniform::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
return "\t" + p_output_vars[0] + " = " + get_uniform_name() + ";\n";
}
+bool VisualShaderNodeTransformUniform::is_qualifier_supported(Qualifier p_qual) const {
+ return true; // all qualifiers are supported
+}
+
VisualShaderNodeTransformUniform::VisualShaderNodeTransformUniform() {
}
@@ -3713,7 +3737,7 @@ String VisualShaderNodeTextureUniform::get_output_port_name(int p_port) const {
}
String VisualShaderNodeTextureUniform::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
- String code = "uniform sampler2D " + get_uniform_name();
+ String code = _get_qual_str() + "uniform sampler2D " + get_uniform_name();
switch (texture_type) {
case TYPE_DATA:
@@ -3778,7 +3802,7 @@ VisualShaderNodeTextureUniform::ColorDefault VisualShaderNodeTextureUniform::get
}
Vector<StringName> VisualShaderNodeTextureUniform::get_editable_properties() const {
- Vector<StringName> props;
+ Vector<StringName> props = VisualShaderNodeUniform::get_editable_properties();
props.push_back("texture_type");
props.push_back("color_default");
return props;
@@ -3810,6 +3834,18 @@ String VisualShaderNodeTextureUniform::get_input_port_default_hint(int p_port) c
return "";
}
+bool VisualShaderNodeTextureUniform::is_qualifier_supported(Qualifier p_qual) const {
+ switch (p_qual) {
+ case Qualifier::QUAL_NONE:
+ return true;
+ case Qualifier::QUAL_GLOBAL:
+ return true;
+ case Qualifier::QUAL_INSTANCE:
+ return false;
+ }
+ return false;
+}
+
VisualShaderNodeTextureUniform::VisualShaderNodeTextureUniform() {
texture_type = TYPE_DATA;
color_default = COLOR_DEFAULT_WHITE;
@@ -3952,7 +3988,7 @@ String VisualShaderNodeCubemapUniform::get_input_port_default_hint(int p_port) c
}
String VisualShaderNodeCubemapUniform::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
- String code = "uniform samplerCube " + get_uniform_name();
+ String code = _get_qual_str() + "uniform samplerCube " + get_uniform_name();
switch (texture_type) {
case TYPE_DATA:
diff --git a/scene/resources/visual_shader_nodes.h b/scene/resources/visual_shader_nodes.h
index 035e39230c..69f42f621a 100644
--- a/scene/resources/visual_shader_nodes.h
+++ b/scene/resources/visual_shader_nodes.h
@@ -1457,6 +1457,8 @@ public:
void set_step(float p_value);
float get_step() const;
+ bool is_qualifier_supported(Qualifier p_qual) const;
+
virtual Vector<StringName> get_editable_properties() const;
VisualShaderNodeFloatUniform();
@@ -1509,6 +1511,8 @@ public:
void set_step(int p_value);
int get_step() const;
+ bool is_qualifier_supported(Qualifier p_qual) const;
+
virtual Vector<StringName> get_editable_properties() const;
VisualShaderNodeIntUniform();
@@ -1535,6 +1539,8 @@ public:
virtual String generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const;
virtual String generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview = false) const; //if no output is connected, the output var passed will be empty. if no input is connected and input is NIL, the input var passed will be empty
+ bool is_qualifier_supported(Qualifier p_qual) const;
+
VisualShaderNodeBooleanUniform();
};
@@ -1557,6 +1563,8 @@ public:
virtual String generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const;
virtual String generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview = false) const; //if no output is connected, the output var passed will be empty. if no input is connected and input is NIL, the input var passed will be empty
+ bool is_qualifier_supported(Qualifier p_qual) const;
+
VisualShaderNodeColorUniform();
};
@@ -1579,6 +1587,8 @@ public:
virtual String generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const;
virtual String generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview = false) const; //if no output is connected, the output var passed will be empty. if no input is connected and input is NIL, the input var passed will be empty
+ bool is_qualifier_supported(Qualifier p_qual) const;
+
VisualShaderNodeVec3Uniform();
};
@@ -1601,6 +1611,8 @@ public:
virtual String generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const;
virtual String generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview = false) const; //if no output is connected, the output var passed will be empty. if no input is connected and input is NIL, the input var passed will be empty
+ bool is_qualifier_supported(Qualifier p_qual) const;
+
VisualShaderNodeTransformUniform();
};
@@ -1652,6 +1664,8 @@ public:
void set_color_default(ColorDefault p_default);
ColorDefault get_color_default() const;
+ bool is_qualifier_supported(Qualifier p_qual) const;
+
VisualShaderNodeTextureUniform();
};
diff --git a/servers/register_server_types.cpp b/servers/register_server_types.cpp
index 60217002fb..eb92cf55e3 100644
--- a/servers/register_server_types.cpp
+++ b/servers/register_server_types.cpp
@@ -218,6 +218,7 @@ void register_server_singletons() {
Engine::get_singleton()->add_singleton(Engine::Singleton("DisplayServer", DisplayServer::get_singleton()));
Engine::get_singleton()->add_singleton(Engine::Singleton("RenderingServer", RenderingServer::get_singleton()));
+ Engine::get_singleton()->add_singleton(Engine::Singleton("RenderingDevice", RenderingDevice::get_singleton()));
Engine::get_singleton()->add_singleton(Engine::Singleton("AudioServer", AudioServer::get_singleton()));
Engine::get_singleton()->add_singleton(Engine::Singleton("PhysicsServer2D", PhysicsServer2D::get_singleton()));
Engine::get_singleton()->add_singleton(Engine::Singleton("PhysicsServer3D", PhysicsServer3D::get_singleton()));
diff --git a/servers/rendering/rasterizer_rd/rasterizer_rd.cpp b/servers/rendering/rasterizer_rd/rasterizer_rd.cpp
index 9c54f0caae..4c92912e9c 100644
--- a/servers/rendering/rasterizer_rd/rasterizer_rd.cpp
+++ b/servers/rendering/rasterizer_rd/rasterizer_rd.cpp
@@ -30,6 +30,8 @@
#include "rasterizer_rd.h"
+#include "core/project_settings.h"
+
void RasterizerRD::prepare_for_blitting_render_targets() {
RD::get_singleton()->prepare_screen_for_drawing();
}
@@ -78,6 +80,10 @@ void RasterizerRD::blit_render_targets_to_screen(DisplayServer::WindowID p_scree
void RasterizerRD::begin_frame(double frame_step) {
frame++;
time += frame_step;
+
+ double time_roll_over = GLOBAL_GET("rendering/limits/time/time_rollover_secs");
+ time = Math::fmod(time, time_roll_over);
+
canvas->set_time(time);
scene->set_time(time, frame_step);
}
diff --git a/servers/rendering/rasterizer_rd/rasterizer_scene_high_end_rd.cpp b/servers/rendering/rasterizer_rd/rasterizer_scene_high_end_rd.cpp
index b3cf40f166..6986f82065 100644
--- a/servers/rendering/rasterizer_rd/rasterizer_scene_high_end_rd.cpp
+++ b/servers/rendering/rasterizer_rd/rasterizer_scene_high_end_rd.cpp
@@ -1720,6 +1720,16 @@ void RasterizerSceneHighEndRD::_setup_lights(RID *p_light_cull_result, int p_lig
light_data.shadow_enabled = p_using_shadows && storage->light_has_shadow(base);
+ float angular_diameter = storage->light_get_param(base, RS::LIGHT_PARAM_SIZE);
+ if (angular_diameter > 0.0) {
+ // I know tan(0) is 0, but let's not risk it with numerical precision.
+ // technically this will keep expanding until reaching the sun, but all we care
+ // is expand until we reach the radius of the near plane (there can't be more occluders than that)
+ angular_diameter = Math::tan(Math::deg2rad(angular_diameter));
+ } else {
+ angular_diameter = 0.0;
+ }
+
if (light_data.shadow_enabled) {
RS::LightDirectionalShadowMode smode = storage->light_directional_get_shadow_mode(base);
@@ -1775,15 +1785,9 @@ void RasterizerSceneHighEndRD::_setup_lights(RID *p_light_cull_result, int p_lig
light_data.fade_to = -light_data.shadow_split_offsets[3];
light_data.soft_shadow_scale = storage->light_get_param(base, RS::LIGHT_PARAM_SHADOW_BLUR);
+ light_data.softshadow_angle = angular_diameter;
- float softshadow_angle = storage->light_get_param(base, RS::LIGHT_PARAM_SIZE);
- if (softshadow_angle > 0.0) {
- // I know tan(0) is 0, but let's not risk it with numerical precision.
- // technically this will keep expanding until reaching the sun, but all we care
- // is expand until we reach the radius of the near plane (there can't be more occluders than that)
- light_data.softshadow_angle = Math::tan(Math::deg2rad(softshadow_angle));
- } else {
- light_data.softshadow_angle = 0;
+ if (angular_diameter <= 0.0) {
light_data.soft_shadow_scale *= directional_shadow_quality_radius_get(); // Only use quality radius for PCF
}
}
@@ -1806,7 +1810,7 @@ void RasterizerSceneHighEndRD::_setup_lights(RID *p_light_cull_result, int p_lig
sky_light_data.color[2] = light_data.color[2];
sky_light_data.enabled = true;
- sky_light_data.size = light_data.softshadow_angle;
+ sky_light_data.size = angular_diameter;
sky_scene_state.directional_light_count++;
}
diff --git a/servers/rendering/rendering_server_scene.cpp b/servers/rendering/rendering_server_scene.cpp
index 9d141ea570..2c3c2730d5 100644
--- a/servers/rendering/rendering_server_scene.cpp
+++ b/servers/rendering/rendering_server_scene.cpp
@@ -1348,15 +1348,15 @@ _FORCE_INLINE_ static void _light_capture_sample_octree(const RasterizerStorage:
for (int i = 0; i < 2; i++) {
- Vector3 color_x00 = color[i][0].linear_interpolate(color[i][1], pos_fract[i].x);
- Vector3 color_xy0 = color[i][2].linear_interpolate(color[i][3], pos_fract[i].x);
- Vector3 blend_z0 = color_x00.linear_interpolate(color_xy0, pos_fract[i].y);
+ Vector3 color_x00 = color[i][0].lerp(color[i][1], pos_fract[i].x);
+ Vector3 color_xy0 = color[i][2].lerp(color[i][3], pos_fract[i].x);
+ Vector3 blend_z0 = color_x00.lerp(color_xy0, pos_fract[i].y);
- Vector3 color_x0z = color[i][4].linear_interpolate(color[i][5], pos_fract[i].x);
- Vector3 color_xyz = color[i][6].linear_interpolate(color[i][7], pos_fract[i].x);
- Vector3 blend_z1 = color_x0z.linear_interpolate(color_xyz, pos_fract[i].y);
+ Vector3 color_x0z = color[i][4].lerp(color[i][5], pos_fract[i].x);
+ Vector3 color_xyz = color[i][6].lerp(color[i][7], pos_fract[i].x);
+ Vector3 blend_z1 = color_x0z.lerp(color_xyz, pos_fract[i].y);
- color_interp[i] = blend_z0.linear_interpolate(blend_z1, pos_fract[i].z);
+ color_interp[i] = blend_z0.lerp(blend_z1, pos_fract[i].z);
float alpha_x00 = Math::lerp(alpha[i][0], alpha[i][1], pos_fract[i].x);
float alpha_xy0 = Math::lerp(alpha[i][2], alpha[i][3], pos_fract[i].x);
@@ -1369,7 +1369,7 @@ _FORCE_INLINE_ static void _light_capture_sample_octree(const RasterizerStorage:
alpha_interp[i] = Math::lerp(alpha_z0, alpha_z1, pos_fract[i].z);
}
- r_color = color_interp[0].linear_interpolate(color_interp[1], level_filter);
+ r_color = color_interp[0].lerp(color_interp[1], level_filter);
r_alpha = Math::lerp(alpha_interp[0], alpha_interp[1], level_filter);
//print_line("pos: " + p_posf + " level " + rtos(p_level) + " down to " + itos(target_level) + "." + rtos(level_filter) + " color " + r_color + " alpha " + rtos(r_alpha));
@@ -1850,12 +1850,13 @@ bool RenderingServerScene::_light_instance_update_shadow(Instance *p_instance, c
real_t z = i == 0 ? -1 : 1;
Vector<Plane> planes;
- planes.resize(5);
+ planes.resize(6);
planes.write[0] = light_transform.xform(Plane(Vector3(0, 0, z), radius));
planes.write[1] = light_transform.xform(Plane(Vector3(1, 0, z).normalized(), radius));
planes.write[2] = light_transform.xform(Plane(Vector3(-1, 0, z).normalized(), radius));
planes.write[3] = light_transform.xform(Plane(Vector3(0, 1, z).normalized(), radius));
planes.write[4] = light_transform.xform(Plane(Vector3(0, -1, z).normalized(), radius));
+ planes.write[5] = light_transform.xform(Plane(Vector3(0, 0, -z), 0));
int cull_count = p_scenario->octree.cull_convex(planes, instance_shadow_cull_result, MAX_INSTANCE_CULL, RS::INSTANCE_GEOMETRY_MASK);
Plane near_plane(light_transform.origin, light_transform.basis.get_axis(2) * z);
diff --git a/servers/rendering/rendering_server_scene.h b/servers/rendering/rendering_server_scene.h
index db2fbd6707..eb66cea3aa 100644
--- a/servers/rendering/rendering_server_scene.h
+++ b/servers/rendering/rendering_server_scene.h
@@ -82,7 +82,7 @@ public:
Camera() {
visible_layers = 0xFFFFFFFF;
- fov = 70;
+ fov = 75;
type = PERSPECTIVE;
znear = 0.05;
zfar = 100;
diff --git a/servers/rendering_server.cpp b/servers/rendering_server.cpp
index 57a34f24cf..908f05702c 100644
--- a/servers/rendering_server.cpp
+++ b/servers/rendering_server.cpp
@@ -2400,6 +2400,9 @@ RenderingServer::RenderingServer() {
GLOBAL_DEF_RST("rendering/vram_compression/import_etc2", true);
GLOBAL_DEF_RST("rendering/vram_compression/import_pvrtc", false);
+ GLOBAL_DEF("rendering/limits/time/time_rollover_secs", 3600);
+ ProjectSettings::get_singleton()->set_custom_property_info("rendering/limits/time/time_rollover_secs", PropertyInfo(Variant::FLOAT, "rendering/limits/time/time_rollover_secs", PROPERTY_HINT_RANGE, "0,10000,1,or_greater"));
+
GLOBAL_DEF("rendering/quality/directional_shadow/size", 4096);
GLOBAL_DEF("rendering/quality/directional_shadow/size.mobile", 2048);
ProjectSettings::get_singleton()->set_custom_property_info("rendering/quality/directional_shadow/size", PropertyInfo(Variant::INT, "rendering/quality/directional_shadow/size", PROPERTY_HINT_RANGE, "256,16384"));
diff --git a/thirdparty/README.md b/thirdparty/README.md
index 7518f5d0f7..1a3588e0e0 100644
--- a/thirdparty/README.md
+++ b/thirdparty/README.md
@@ -27,7 +27,7 @@ Files extracted from upstream source:
## basis_universal
- Upstream: https://github.com/BinomialLLC/basis_universal
-- Version: git (895ee8e, 2020)
+- Version: git (895ee8ee7e04f22267f8d16d46de04d5a01d63ac, 2020)
- License: Apache 2.0
Files extracted from upstream source:
@@ -40,11 +40,10 @@ Files extracted from upstream source:
## bullet
- Upstream: https://github.com/bulletphysics/bullet3
-- Version: 2.90 (master cd8cf7521cbb8b7808126a6adebd47bb83ea166a)
+- Version: git pre-2.90 (cd8cf7521cbb8b7808126a6adebd47bb83ea166a, 2020)
- License: zlib
Important: Synced with a pre-release version of bullet 2.90 from the master branch.
-Commit hash: cd8cf7521cbb8b7808126a6adebd47bb83ea166a
Files extracted from upstream source:
@@ -55,7 +54,7 @@ Files extracted from upstream source:
## certs
- Upstream: Mozilla, via https://apps.fedoraproject.org/packages/ca-certificates
-- Version: 2018.2.26
+- Version: 2018.2.26 (2018)
- License: MPL 2.0
File extracted from a recent Fedora install:
@@ -67,7 +66,7 @@ as it's generated on the user's system.)
## cvtt
- Upstream: https://github.com/elasota/cvtt
-- Version: 1.0.0-beta4
+- Version: 1.0.0-beta4 (2018)
- License: MIT
Files extracted from upstream source:
@@ -78,7 +77,7 @@ Files extracted from upstream source:
## enet
- Upstream: http://enet.bespin.org
-- Version: 1.3.14 (0eaf48e, 2019)
+- Version: 1.3.15 (224f31101fc60939c02f6bbe8e8fc810a7db306b, 2020)
- License: MIT
Files extracted from upstream source:
@@ -88,21 +87,21 @@ Files extracted from upstream source:
- LICENSE file
Important: enet.h, host.c, protocol.c have been slightly modified
-to be usable by godot socket implementation and allow IPv6.
-Apply the patch in the `patches/` folder when syncing on newer upstream
+to be usable by godot socket implementation and allow IPv6 and DTLS.
+Apply the patches in the `patches/` folder when syncing on newer upstream
commits.
Two files (godot.cpp and enet/godot.h) have been added to provide
enet socket implementation using Godot classes.
It is still possible to build against a system wide ENet but doing so
-will limit it's functionality to IPv4 only.
+will limit its functionality to IPv4 only.
## etc2comp
- Upstream: https://github.com/google/etc2comp
-- Version: git (9cd0f9c, 2017)
+- Version: git (9cd0f9cae0f32338943699bb418107db61bb66f2, 2017)
- License: Apache 2.0
Files extracted from upstream source:
@@ -120,7 +119,7 @@ comments.
### Noto Sans
- Upstream: https://github.com/googlei18n/noto-fonts
-- Version: 1.06
+- Version: 1.06 (2017)
- License: OFL-1.1
Use UI font variant if available, because it has tight vertical metrics and good for UI.
@@ -128,7 +127,7 @@ Use UI font variant if available, because it has tight vertical metrics and good
### Hack Regular
- Upstream: https://github.com/source-foundry/Hack
-- Version: 3.003
+- Version: 3.003 (2018)
- License: MIT + Bitstream Vera License
### DroidSans*.ttf
@@ -141,7 +140,7 @@ Use UI font variant if available, because it has tight vertical metrics and good
## freetype
- Upstream: https://www.freetype.org
-- Version: 2.10.1
+- Version: 2.10.1 (2019)
- License: FreeType License (BSD-like)
Files extracted from upstream source:
@@ -154,7 +153,7 @@ Files extracted from upstream source:
## glad
- Upstream: https://github.com/Dav1dde/glad
-- Version: 0.1.33
+- Version: 0.1.33 (2019)
- License: MIT
The files we package are automatically generated.
@@ -198,7 +197,7 @@ Patches in the `patches` directory should be re-applied after updates.
## libogg
- Upstream: https://www.xiph.org/ogg
-- Version: git (c8fca6b, 2019)
+- Version: git (c8fca6b4a02d695b1ceea39b330d4406001c03ed, 2019)
- License: BSD-3-Clause
Files extracted from upstream source:
@@ -211,7 +210,7 @@ Files extracted from upstream source:
## libpng
- Upstream: http://libpng.org/pub/png/libpng.html
-- Version: 1.6.37
+- Version: 1.6.37 (2019)
- License: libpng/zlib
Files extracted from upstream source:
@@ -226,7 +225,7 @@ Files extracted from upstream source:
## libsimplewebm
- Upstream: https://github.com/zaps166/libsimplewebm
-- Version: git (fe57fd3, 2019)
+- Version: git (fe57fd3cfe6c0af4c6af110b1f84a90cf191d943, 2019)
- License: MIT (main), BSD-3-Clause (libwebm)
This contains libwebm, but the version in use is updated from the one used by libsimplewebm,
@@ -245,7 +244,7 @@ comments.
## libtheora
- Upstream: https://www.theora.org
-- Version: 1.1.1
+- Version: 1.1.1 (2010)
- License: BSD-3-Clause
Files extracted from upstream source:
@@ -261,7 +260,7 @@ on top of the 1.1.1 source (not included in any stable release yet).
## libvorbis
- Upstream: https://www.xiph.org/vorbis
-- Version: 1.3.6
+- Version: 1.3.6 (2018)
- License: BSD-3-Clause
Files extracted from upstream source:
@@ -274,7 +273,7 @@ Files extracted from upstream source:
## libvpx
- Upstream: https://chromium.googlesource.com/webm/libvpx/
-- Version: 1.6.0
+- Version: 1.6.0 (2016)
- License: BSD-3-Clause
Files extracted from upstream source:
@@ -291,7 +290,7 @@ from the Android NDK r18.
## libwebp
- Upstream: https://chromium.googlesource.com/webm/libwebp/
-- Version: 1.1.0
+- Version: 1.1.0 (2020)
- License: BSD-3-Clause
Files extracted from upstream source:
@@ -307,7 +306,7 @@ changes are marked with `// -- GODOT --` comments.
## mbedtls
- Upstream: https://tls.mbed.org/
-- Version: 2.16.6
+- Version: 2.16.6 (2020)
- License: Apache 2.0
File extracted from upstream release tarball (`-apache.tgz` variant):
@@ -327,7 +326,7 @@ File extracted from upstream release tarball (`-apache.tgz` variant):
## miniupnpc
- Upstream: https://github.com/miniupnp/miniupnp/tree/master/miniupnpc
-- Version: git (4436632, 2020)
+- Version: git (44366328661826603982d1e0d7ebb4062c5f2bfc, 2020)
- License: BSD-3-Clause
Files extracted from upstream source:
@@ -343,7 +342,7 @@ The only modified file is miniupnpcstrings.h, which was created for Godot
## minizip
- Upstream: http://www.zlib.net
-- Version: 1.2.11 (zlib contrib)
+- Version: 1.2.11 (zlib contrib, 2017)
- License: zlib
Files extracted from the upstream source:
@@ -363,15 +362,15 @@ Collection of single-file libraries used in Godot components.
- `clipper.{cpp,hpp}`
* Upstream: https://sourceforge.net/projects/polyclipping
- * Version: 6.4.2 + Godot changes (added optional exceptions handling)
+ * Version: 6.4.2 (2017) + Godot changes (added optional exceptions handling)
* License: BSL-1.0
- `cubemap_coeffs.h`
* Upstream: https://research.activision.com/publications/archives/fast-filtering-of-reflection-probes
- File coeffs_const_8.txt
+ File coeffs_const_8.txt (retrieved April 2020)
* License: MIT
- `fastlz.{c,h}`
* Upstream: https://github.com/ariya/FastLZ
- * Version: git (f121734, 2007)
+ * Version: 0.5.0 (4f20f54d46f5a6dd4fae4def134933369b7602d2, 2020)
* License: MIT
- `hq2x.{cpp,h}`
* Upstream: https://github.com/brunexgeek/hqx
@@ -379,7 +378,7 @@ Collection of single-file libraries used in Godot components.
* License: Apache 2.0
- `open-simplex-noise.{c,h}`
* Upstream: https://github.com/smcameron/open-simplex-noise-in-c
- * Version: git (0d555e7, 2015)
+ * Version: git (0d555e7f40527d0870906fe9469a3b1bb4020b7f, 2015) + custom changes
* License: Unlicense
- `pcg.{cpp,h}`
* Upstream: http://www.pcg-random.org
@@ -387,7 +386,7 @@ Collection of single-file libraries used in Godot components.
* License: Apache 2.0
- `smaz.{c,h}`
* Upstream: https://github.com/antirez/smaz
- * Version: git (150e125, 2009)
+ * Version: git (150e125cbae2e8fd20dd332432776ce13395d4d4, 2009)
* License: BSD-3-Clause
* Modifications: use `const char*` instead of `char*` for input string
- `triangulator.{cpp,h}`
@@ -397,10 +396,6 @@ Collection of single-file libraries used in Godot components.
### modules
-- `curl_hostcheck.{c,h}`
- * Upstream: https://curl.haxx.se/
- * Version: ? (2013)
- * License: MIT
- `yuv2rgb.h`
* Upstream: http://wss.co.uk/pinknoise/yuv2rgb/ (to check)
* Version: ?
@@ -410,29 +405,30 @@ Collection of single-file libraries used in Godot components.
- `ifaddrs-android.{cc,h}`
* Upstream: https://chromium.googlesource.com/external/webrtc/stable/talk/+/master/base/ifaddrs-android.h
- * Version: git (5976650, 2013)
+ * Version: git (5976650443d68ccfadf1dea24999ee459dd2819d, 2013)
* License: BSD-3-Clause
### scene
- `easing_equations.cpp`
* Upstream: http://robertpenner.com/easing/ via https://github.com/jesusgollonet/ofpennereasing (modified to fit Godot types)
- * Version: git (af72c14, 2008) + Godot types and style changes
+ * Version: git (af72c147c3a74e7e872aa28c7e2abfcced04fdce, 2008) + Godot types and style changes
* License: BSD-3-Clause
- `mikktspace.{c,h}`
- * Upstream: https://wiki.blender.org/index.php/Dev:Shading/Tangent_Space_Normal_Maps
- * Version: 1.0
+ * Upstream: https://archive.blender.org/wiki/index.php/Dev:Shading/Tangent_Space_Normal_Maps/
+ * Version: 1.0 (2011)
* License: zlib
- `stb_vorbis.c`
* Upstream: https://github.com/nothings/stb
- * Version: 1.17
+ * Version: 1.19
* License: Public Domain (Unlicense) or MIT
+ * Modifications: `f->temp_offset += (sz+3)&~3;` changed to `f->temp_offset += (sz+7)&~7;` (needed until fixed upstream)
## nanosvg
- Upstream: https://github.com/memononen/nanosvg
-- Version: git (25241c5, 2019)
+- Version: git (25241c5a8f8451d41ab1b02ab2d865b01600d949, 2019)
- License: zlib
Files extracted from the upstream source:
@@ -444,7 +440,7 @@ Files extracted from the upstream source:
## opus
- Upstream: https://opus-codec.org
-- Version: 1.1.5 (opus) and 0.8 (opusfile)
+- Version: 1.1.5 (opus) and 0.8 (opusfile) (2017)
- License: BSD-3-Clause
Files extracted from upstream source:
@@ -461,14 +457,13 @@ Files extracted from upstream source:
## pcre2
- Upstream: http://www.pcre.org
-- Version: 10.33
+- Version: 10.34 (2019)
- License: BSD-3-Clause
Files extracted from upstream source:
- Files listed in the file NON-AUTOTOOLS-BUILD steps 1-4
- All .h files in src/ apart from pcre2posix.h
-- src/pcre2_jit_compile.c
- src/pcre2_jit_match.c
- src/pcre2_jit_misc.c
- src/sljit/*
@@ -478,7 +473,7 @@ Files extracted from upstream source:
## pvrtccompressor
- Upstream: https://bitbucket.org/jthlim/pvrtccompressor
-- Version: hg (cf71777, 2015)
+- Version: hg (cf7177748ee0dcdccfe89716dc11a47d2dc81af5, 2015)
- License: BSD-3-Clause
Files extracted from upstream source:
@@ -490,19 +485,19 @@ Files extracted from upstream source:
## recastnavigation
- Upstream: https://github.com/recastnavigation/recastnavigation
-- Version: git (ef3ea40f, 2017)
+- Version: git (57610fa6ef31b39020231906f8c5d40eaa8294ae, 2019)
- License: zlib
Files extracted from upstream source:
-- `Recast/` folder
+- `Recast/` folder without `CMakeLists.txt`
- License.txt
-## Rvo2
+## rvo2
- Upstream: http://gamma.cs.unc.edu/RVO2/
-- Version: 3D - 1.0.1
+- Version: 3D - 1.0.1 (2016)
- License: Apache 2.0
Files extracted from upstream source:
@@ -518,7 +513,7 @@ Godot. Please check the file to know what's new.
## squish
- Upstream: https://sourceforge.net/projects/libsquish
-- Version: 1.15
+- Version: 1.15 (2017)
- License: MIT
Files extracted from upstream source:
@@ -533,7 +528,7 @@ comments and a patch is provided in the squish/ folder.
## tinyexr
- Upstream: https://github.com/syoyo/tinyexr
-- Version: git (656bb61, 2019)
+- Version: git (4dbd05a22f51a2d7462311569b8b0cba0bbe2ac5, 2020)
- License: BSD-3-Clause
Files extracted from upstream source:
@@ -544,7 +539,7 @@ Files extracted from upstream source:
## vhacd
- Upstream: https://github.com/kmammou/v-hacd
-- Version: git (b07958e, 2019)
+- Version: git (b07958e18e01d504e3af80eeaeb9f033226533d7, 2019)
- License: BSD-3-Clause
Files extracted from upstream source:
@@ -561,7 +556,7 @@ folder.
## vulkan
- Upstream: https://github.com/KhronosGroup/Vulkan-Loader
-- Version: sdk-1.2.131.2
+- Version: sdk-1.2.131.2 (2020)
- License: Apache 2.0
Unless there is a specific reason to package a more recent version, please stick
@@ -583,7 +578,7 @@ Includes custom change to disable MSVC pragma, might be upstreamed via:
https://github.com/KhronosGroup/Vulkan-ValidationLayers/pull/1666
`vk_mem_alloc.h` is taken from https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator
-Version: 2.3.0
+Version: 2.3.0 (2019)
Patches in the `patches` directory should be re-applied after updates.
@@ -591,7 +586,7 @@ Patches in the `patches` directory should be re-applied after updates.
## wslay
- Upstream: https://github.com/tatsuhiro-t/wslay
-- Version: 1.1.0
+- Version: 1.1.0 (2018)
- License: MIT
File extracted from upstream release tarball:
@@ -616,7 +611,7 @@ Files extracted from upstream source:
## zlib
- Upstream: http://www.zlib.net
-- Version: 1.2.11
+- Version: 1.2.11 (2017)
- License: zlib
Files extracted from upstream source:
@@ -627,7 +622,7 @@ Files extracted from upstream source:
## zstd
- Upstream: https://github.com/facebook/zstd
-- Version: 1.4.4
+- Version: 1.4.4 (2019)
- License: BSD-3-Clause
Files extracted from upstream source:
diff --git a/thirdparty/enet/LICENSE b/thirdparty/enet/LICENSE
index 78d9dcf613..6906f8eb0b 100644
--- a/thirdparty/enet/LICENSE
+++ b/thirdparty/enet/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2002-2019 Lee Salzman
+Copyright (c) 2002-2020 Lee Salzman
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:
diff --git a/thirdparty/enet/enet/enet.h b/thirdparty/enet/enet/enet.h
index ac7552adb2..3900353c34 100644
--- a/thirdparty/enet/enet/enet.h
+++ b/thirdparty/enet/enet/enet.h
@@ -22,7 +22,7 @@ extern "C"
#define ENET_VERSION_MAJOR 1
#define ENET_VERSION_MINOR 3
-#define ENET_VERSION_PATCH 14
+#define ENET_VERSION_PATCH 15
#define ENET_VERSION_CREATE(major, minor, patch) (((major)<<16) | ((minor)<<8) | (patch))
#define ENET_VERSION_GET_MAJOR(version) (((version)>>16)&0xFF)
#define ENET_VERSION_GET_MINOR(version) (((version)>>8)&0xFF)
@@ -248,6 +248,11 @@ typedef struct _ENetChannel
ENetList incomingUnreliableCommands;
} ENetChannel;
+typedef enum _ENetPeerFlag
+{
+ ENET_PEER_FLAG_NEEDS_DISPATCH = (1 << 0)
+} ENetPeerFlag;
+
/**
* An ENet peer which data packets may be sent or received from.
*
@@ -309,7 +314,9 @@ typedef struct _ENetPeer
ENetList outgoingReliableCommands;
ENetList outgoingUnreliableCommands;
ENetList dispatchedCommands;
- int needsDispatch;
+ enet_uint16 flags;
+ enet_uint8 roundTripTimeRemainder;
+ enet_uint8 roundTripTimeVarianceRemainder;
enet_uint16 incomingUnsequencedGroup;
enet_uint16 outgoingUnsequencedGroup;
enet_uint32 unsequencedWindow [ENET_PEER_UNSEQUENCED_WINDOW_SIZE / 32];
diff --git a/thirdparty/enet/enet/utility.h b/thirdparty/enet/enet/utility.h
index e48a476be3..b04bb7a5b3 100644
--- a/thirdparty/enet/enet/utility.h
+++ b/thirdparty/enet/enet/utility.h
@@ -7,6 +7,7 @@
#define ENET_MAX(x, y) ((x) > (y) ? (x) : (y))
#define ENET_MIN(x, y) ((x) < (y) ? (x) : (y))
+#define ENET_DIFFERENCE(x, y) ((x) < (y) ? (y) - (x) : (x) - (y))
#endif /* __ENET_UTILITY_H__ */
diff --git a/thirdparty/enet/patches/dtls_support.patch b/thirdparty/enet/patches/dtls_support.patch
new file mode 100644
index 0000000000..ce3480a858
--- /dev/null
+++ b/thirdparty/enet/patches/dtls_support.patch
@@ -0,0 +1,13 @@
+diff --git a/thirdparty/enet/enet/enet.h b/thirdparty/enet/enet/enet.h
+index 966e3a465d..ac7552adb2 100644
+--- a/thirdparty/enet/enet/enet.h
++++ b/thirdparty/enet/enet/enet.h
+@@ -578,6 +578,8 @@ ENET_API void enet_host_channel_limit (ENetHost *, size_t);
+ ENET_API void enet_host_bandwidth_limit (ENetHost *, enet_uint32, enet_uint32);
+ extern void enet_host_bandwidth_throttle (ENetHost *);
+ extern enet_uint32 enet_host_random_seed (void);
++ENET_API void enet_host_dtls_server_setup (ENetHost *, void *, void *);
++ENET_API void enet_host_dtls_client_setup (ENetHost *, void *, uint8_t, const char *);
+
+ ENET_API int enet_peer_send (ENetPeer *, enet_uint8, ENetPacket *);
+ ENET_API ENetPacket * enet_peer_receive (ENetPeer *, enet_uint8 * channelID);
diff --git a/thirdparty/enet/peer.c b/thirdparty/enet/peer.c
index e2d0872bd3..1278b85a80 100644
--- a/thirdparty/enet/peer.c
+++ b/thirdparty/enet/peer.c
@@ -66,7 +66,7 @@ enet_peer_throttle (ENetPeer * peer, enet_uint32 rtt)
peer -> packetThrottle = peer -> packetThrottleLimit;
}
else
- if (rtt < peer -> lastRoundTripTime)
+ if (rtt <= peer -> lastRoundTripTime)
{
peer -> packetThrottle += peer -> packetThrottleAcceleration;
@@ -76,7 +76,7 @@ enet_peer_throttle (ENetPeer * peer, enet_uint32 rtt)
return 1;
}
else
- if (rtt > peer -> lastRoundTripTime + 2 * peer -> lastRoundTripTimeVariance)
+ if (rtt >= peer -> lastRoundTripTime + 2 * peer -> lastRoundTripTimeVariance)
{
if (peer -> packetThrottle > peer -> packetThrottleDeceleration)
peer -> packetThrottle -= peer -> packetThrottleDeceleration;
@@ -306,11 +306,11 @@ enet_peer_reset_queues (ENetPeer * peer)
{
ENetChannel * channel;
- if (peer -> needsDispatch)
+ if (peer -> flags & ENET_PEER_FLAG_NEEDS_DISPATCH)
{
enet_list_remove (& peer -> dispatchList);
- peer -> needsDispatch = 0;
+ peer -> flags &= ~ ENET_PEER_FLAG_NEEDS_DISPATCH;
}
while (! enet_list_empty (& peer -> acknowledgements))
@@ -418,6 +418,9 @@ enet_peer_reset (ENetPeer * peer)
peer -> outgoingUnsequencedGroup = 0;
peer -> eventData = 0;
peer -> totalWaitingData = 0;
+ peer -> flags = 0;
+ peer -> roundTripTimeRemainder = 0;
+ peer -> roundTripTimeVarianceRemainder = 0;
memset (peer -> unsequencedWindow, 0, sizeof (peer -> unsequencedWindow));
@@ -724,11 +727,11 @@ enet_peer_dispatch_incoming_unreliable_commands (ENetPeer * peer, ENetChannel *
{
enet_list_move (enet_list_end (& peer -> dispatchedCommands), startCommand, enet_list_previous (currentCommand));
- if (! peer -> needsDispatch)
+ if (! (peer -> flags & ENET_PEER_FLAG_NEEDS_DISPATCH))
{
enet_list_insert (enet_list_end (& peer -> host -> dispatchQueue), & peer -> dispatchList);
- peer -> needsDispatch = 1;
+ peer -> flags |= ENET_PEER_FLAG_NEEDS_DISPATCH;
}
droppedCommand = currentCommand;
@@ -752,11 +755,11 @@ enet_peer_dispatch_incoming_unreliable_commands (ENetPeer * peer, ENetChannel *
{
enet_list_move (enet_list_end (& peer -> dispatchedCommands), startCommand, enet_list_previous (currentCommand));
- if (! peer -> needsDispatch)
+ if (! (peer -> flags & ENET_PEER_FLAG_NEEDS_DISPATCH))
{
enet_list_insert (enet_list_end (& peer -> host -> dispatchQueue), & peer -> dispatchList);
- peer -> needsDispatch = 1;
+ peer -> flags |= ENET_PEER_FLAG_NEEDS_DISPATCH;
}
}
}
@@ -768,11 +771,11 @@ enet_peer_dispatch_incoming_unreliable_commands (ENetPeer * peer, ENetChannel *
{
enet_list_move (enet_list_end (& peer -> dispatchedCommands), startCommand, enet_list_previous (currentCommand));
- if (! peer -> needsDispatch)
+ if (! (peer -> flags & ENET_PEER_FLAG_NEEDS_DISPATCH))
{
enet_list_insert (enet_list_end (& peer -> host -> dispatchQueue), & peer -> dispatchList);
- peer -> needsDispatch = 1;
+ peer -> flags |= ENET_PEER_FLAG_NEEDS_DISPATCH;
}
droppedCommand = currentCommand;
@@ -809,11 +812,11 @@ enet_peer_dispatch_incoming_reliable_commands (ENetPeer * peer, ENetChannel * ch
enet_list_move (enet_list_end (& peer -> dispatchedCommands), enet_list_begin (& channel -> incomingReliableCommands), enet_list_previous (currentCommand));
- if (! peer -> needsDispatch)
+ if (! (peer -> flags & ENET_PEER_FLAG_NEEDS_DISPATCH))
{
enet_list_insert (enet_list_end (& peer -> host -> dispatchQueue), & peer -> dispatchList);
- peer -> needsDispatch = 1;
+ peer -> flags |= ENET_PEER_FLAG_NEEDS_DISPATCH;
}
if (! enet_list_empty (& channel -> incomingUnreliableCommands))
diff --git a/thirdparty/enet/protocol.c b/thirdparty/enet/protocol.c
index 28ad5fc41c..fefc0e6f0a 100644
--- a/thirdparty/enet/protocol.c
+++ b/thirdparty/enet/protocol.c
@@ -48,11 +48,11 @@ enet_protocol_dispatch_state (ENetHost * host, ENetPeer * peer, ENetPeerState st
{
enet_protocol_change_state (host, peer, state);
- if (! peer -> needsDispatch)
+ if (! (peer -> flags & ENET_PEER_FLAG_NEEDS_DISPATCH))
{
enet_list_insert (enet_list_end (& host -> dispatchQueue), & peer -> dispatchList);
- peer -> needsDispatch = 1;
+ peer -> flags |= ENET_PEER_FLAG_NEEDS_DISPATCH;
}
}
@@ -63,7 +63,7 @@ enet_protocol_dispatch_incoming_commands (ENetHost * host, ENetEvent * event)
{
ENetPeer * peer = (ENetPeer *) enet_list_remove (enet_list_begin (& host -> dispatchQueue));
- peer -> needsDispatch = 0;
+ peer -> flags &= ~ ENET_PEER_FLAG_NEEDS_DISPATCH;
switch (peer -> state)
{
@@ -101,7 +101,7 @@ enet_protocol_dispatch_incoming_commands (ENetHost * host, ENetEvent * event)
if (! enet_list_empty (& peer -> dispatchedCommands))
{
- peer -> needsDispatch = 1;
+ peer -> flags |= ENET_PEER_FLAG_NEEDS_DISPATCH;
enet_list_insert (enet_list_end (& host -> dispatchQueue), & peer -> dispatchList);
}
@@ -851,24 +851,29 @@ enet_protocol_handle_acknowledge (ENetHost * host, ENetEvent * event, ENetPeer *
if (ENET_TIME_LESS (host -> serviceTime, receivedSentTime))
return 0;
- peer -> lastReceiveTime = host -> serviceTime;
- peer -> earliestTimeout = 0;
-
roundTripTime = ENET_TIME_DIFFERENCE (host -> serviceTime, receivedSentTime);
+ roundTripTime = ENET_MAX (roundTripTime, 1);
- enet_peer_throttle (peer, roundTripTime);
+ if (peer -> lastReceiveTime > 0)
+ {
+ enet_uint32 accumRoundTripTime = (peer -> roundTripTime << 8) + peer -> roundTripTimeRemainder;
+ enet_uint32 accumRoundTripTimeVariance = (peer -> roundTripTimeVariance << 8) + peer -> roundTripTimeVarianceRemainder;
- peer -> roundTripTimeVariance -= peer -> roundTripTimeVariance / 4;
+ enet_peer_throttle (peer, roundTripTime);
- if (roundTripTime >= peer -> roundTripTime)
- {
- peer -> roundTripTime += (roundTripTime - peer -> roundTripTime) / 8;
- peer -> roundTripTimeVariance += (roundTripTime - peer -> roundTripTime) / 4;
+ roundTripTime <<= 8;
+ accumRoundTripTimeVariance = (accumRoundTripTimeVariance * 3 + ENET_DIFFERENCE (roundTripTime, accumRoundTripTime)) / 4;
+ accumRoundTripTime = (accumRoundTripTime * 7 + roundTripTime) / 8;
+
+ peer -> roundTripTime = accumRoundTripTime >> 8;
+ peer -> roundTripTimeRemainder = accumRoundTripTime & 0xFF;
+ peer -> roundTripTimeVariance = accumRoundTripTimeVariance >> 8;
+ peer -> roundTripTimeVarianceRemainder = accumRoundTripTimeVariance & 0xFF;
}
else
{
- peer -> roundTripTime -= (peer -> roundTripTime - roundTripTime) / 8;
- peer -> roundTripTimeVariance += (peer -> roundTripTime - roundTripTime) / 4;
+ peer -> roundTripTime = roundTripTime;
+ peer -> roundTripTimeVariance = (roundTripTime + 1) / 2;
}
if (peer -> roundTripTime < peer -> lowestRoundTripTime)
@@ -881,12 +886,15 @@ enet_protocol_handle_acknowledge (ENetHost * host, ENetEvent * event, ENetPeer *
ENET_TIME_DIFFERENCE (host -> serviceTime, peer -> packetThrottleEpoch) >= peer -> packetThrottleInterval)
{
peer -> lastRoundTripTime = peer -> lowestRoundTripTime;
- peer -> lastRoundTripTimeVariance = peer -> highestRoundTripTimeVariance;
+ peer -> lastRoundTripTimeVariance = ENET_MAX (peer -> highestRoundTripTimeVariance, 2);
peer -> lowestRoundTripTime = peer -> roundTripTime;
peer -> highestRoundTripTimeVariance = peer -> roundTripTimeVariance;
peer -> packetThrottleEpoch = host -> serviceTime;
}
+ peer -> lastReceiveTime = ENET_MAX (host -> serviceTime, 1);
+ peer -> earliestTimeout = 0;
+
receivedReliableSequenceNumber = ENET_NET_TO_HOST_16 (command -> acknowledge.receivedReliableSequenceNumber);
commandNumber = enet_protocol_remove_sent_reliable_command (peer, receivedReliableSequenceNumber, command -> header.channelID);
@@ -1261,7 +1269,7 @@ enet_protocol_receive_incoming_commands (ENetHost * host, ENetEvent * event)
}
}
- return -1;
+ return 0;
}
static void
@@ -1663,19 +1671,9 @@ enet_protocol_send_outgoing_commands (ENetHost * host, ENetEvent * event, int ch
#ifdef ENET_DEBUG
printf ("peer %u: %f%%+-%f%% packet loss, %u+-%u ms round trip time, %f%% throttle, %u/%u outgoing, %u/%u incoming\n", currentPeer -> incomingPeerID, currentPeer -> packetLoss / (float) ENET_PEER_PACKET_LOSS_SCALE, currentPeer -> packetLossVariance / (float) ENET_PEER_PACKET_LOSS_SCALE, currentPeer -> roundTripTime, currentPeer -> roundTripTimeVariance, currentPeer -> packetThrottle / (float) ENET_PEER_PACKET_THROTTLE_SCALE, enet_list_size (& currentPeer -> outgoingReliableCommands), enet_list_size (& currentPeer -> outgoingUnreliableCommands), currentPeer -> channels != NULL ? enet_list_size (& currentPeer -> channels -> incomingReliableCommands) : 0, currentPeer -> channels != NULL ? enet_list_size (& currentPeer -> channels -> incomingUnreliableCommands) : 0);
#endif
-
- currentPeer -> packetLossVariance -= currentPeer -> packetLossVariance / 4;
- if (packetLoss >= currentPeer -> packetLoss)
- {
- currentPeer -> packetLoss += (packetLoss - currentPeer -> packetLoss) / 8;
- currentPeer -> packetLossVariance += (packetLoss - currentPeer -> packetLoss) / 4;
- }
- else
- {
- currentPeer -> packetLoss -= (currentPeer -> packetLoss - packetLoss) / 8;
- currentPeer -> packetLossVariance += (currentPeer -> packetLoss - packetLoss) / 4;
- }
+ currentPeer -> packetLossVariance = (currentPeer -> packetLossVariance * 3 + ENET_DIFFERENCE (packetLoss, currentPeer -> packetLoss)) / 4;
+ currentPeer -> packetLoss = (currentPeer -> packetLoss * 7 + packetLoss) / 8;
currentPeer -> packetLossEpoch = host -> serviceTime;
currentPeer -> packetsSent = 0;
diff --git a/thirdparty/jpeg-compressor/jpgd.cpp b/thirdparty/jpeg-compressor/jpgd.cpp
index 257d0b7574..baf6ea0484 100644
--- a/thirdparty/jpeg-compressor/jpgd.cpp
+++ b/thirdparty/jpeg-compressor/jpgd.cpp
@@ -37,16 +37,14 @@
#ifndef JPGD_USE_SSE2
- #if defined(__GNUC__)
-
- #if (defined(__x86_64__) || defined(_M_X64))
- #if defined(__SSE2__)
- #define JPGD_USE_SSE2 (1)
- #endif
+ #if defined(__GNUC__)
+ #if defined(__SSE2__)
+ #define JPGD_USE_SSE2 (1)
+ #endif
+ #elif defined(_MSC_VER)
+ #if defined(_M_X64)
+ #define JPGD_USE_SSE2 (1)
#endif
-
- #else
- #define JPGD_USE_SSE2 (1)
#endif
#endif
diff --git a/thirdparty/jpeg-compressor/patches/fix-msvc-sse2-detection.patch b/thirdparty/jpeg-compressor/patches/fix-msvc-sse2-detection.patch
new file mode 100644
index 0000000000..830b03b0c0
--- /dev/null
+++ b/thirdparty/jpeg-compressor/patches/fix-msvc-sse2-detection.patch
@@ -0,0 +1,44 @@
+From ae74fa2fcdef8ec44b925a649f66e8cbefce8315 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?R=C3=A9mi=20Verschelde?= <rverschelde@gmail.com>
+Date: Thu, 7 May 2020 12:14:09 +0200
+Subject: [PATCH] Fix detection of SSE2 with Visual Studio
+
+The previous code assumed that SSE2 is available when building with
+Visual Studio, but that's not accurate on ARM with UWP.
+
+SSE2 could also be enabled on x86 if `_M_IX86_FP == 2`, but it requires
+checking first that it's not actually set to 2 for AVX, AVX2 or AVX512
+(see https://docs.microsoft.com/en-us/cpp/preprocessor/predefined-macros?view=vs-2019),
+so I left it out for this quick fix.
+---
+ jpgd.cpp | 16 +++++++---------
+ 1 file changed, 7 insertions(+), 9 deletions(-)
+
+diff --git a/jpgd.cpp b/jpgd.cpp
+index 91e66ad..db1f3b4 100644
+--- a/jpgd.cpp
++++ b/jpgd.cpp
+@@ -37,16 +37,14 @@
+
+ #ifndef JPGD_USE_SSE2
+
+- #if defined(__GNUC__)
+-
+- #if (defined(__x86_64__) || defined(_M_X64))
+- #if defined(__SSE2__)
+- #define JPGD_USE_SSE2 (1)
+- #endif
++ #if defined(__GNUC__)
++ #if defined(__SSE2__)
++ #define JPGD_USE_SSE2 (1)
++ #endif
++ #elif defined(_MSC_VER)
++ #if defined(_M_X64)
++ #define JPGD_USE_SSE2 (1)
+ #endif
+-
+- #else
+- #define JPGD_USE_SSE2 (1)
+ #endif
+
+ #endif
diff --git a/thirdparty/misc/curl_hostcheck.c b/thirdparty/misc/curl_hostcheck.c
deleted file mode 100644
index feef232619..0000000000
--- a/thirdparty/misc/curl_hostcheck.c
+++ /dev/null
@@ -1,217 +0,0 @@
-/***************************************************************************
- * _ _ ____ _
- * Project ___| | | | _ \| |
- * / __| | | | |_) | |
- * | (__| |_| | _ <| |___
- * \___|\___/|_| \_\_____|
- *
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
- *
- * This software is licensed as described in the file COPYING, which
- * you should have received as part of this distribution. The terms
- * are also available at http://curl.haxx.se/docs/copyright.html.
- *
- * You may opt to use, copy, modify, merge, publish, distribute and/or sell
- * copies of the Software, and permit persons to whom the Software is
- * furnished to do so, under the terms of the COPYING file.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ***************************************************************************/
-
-/* This file is an amalgamation of hostcheck.c and most of rawstr.c
- from cURL. The contents of the COPYING file mentioned above are:
-
-COPYRIGHT AND PERMISSION NOTICE
-
-Copyright (c) 1996 - 2013, Daniel Stenberg, <daniel@haxx.se>.
-
-All rights reserved.
-
-Permission to use, copy, modify, and distribute this software for any purpose
-with or without fee is hereby granted, provided that the above copyright
-notice and this permission notice appear in all copies.
-
-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 OF THIRD PARTY RIGHTS. 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.
-
-Except as contained in this notice, the name of a copyright holder shall not
-be used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization of the copyright holder.
-*/
-
-#include "curl_hostcheck.h"
-#include <string.h>
-
-/* Portable, consistent toupper (remember EBCDIC). Do not use toupper() because
- its behavior is altered by the current locale. */
-static char Curl_raw_toupper(char in)
-{
- switch (in) {
- case 'a':
- return 'A';
- case 'b':
- return 'B';
- case 'c':
- return 'C';
- case 'd':
- return 'D';
- case 'e':
- return 'E';
- case 'f':
- return 'F';
- case 'g':
- return 'G';
- case 'h':
- return 'H';
- case 'i':
- return 'I';
- case 'j':
- return 'J';
- case 'k':
- return 'K';
- case 'l':
- return 'L';
- case 'm':
- return 'M';
- case 'n':
- return 'N';
- case 'o':
- return 'O';
- case 'p':
- return 'P';
- case 'q':
- return 'Q';
- case 'r':
- return 'R';
- case 's':
- return 'S';
- case 't':
- return 'T';
- case 'u':
- return 'U';
- case 'v':
- return 'V';
- case 'w':
- return 'W';
- case 'x':
- return 'X';
- case 'y':
- return 'Y';
- case 'z':
- return 'Z';
- }
- return in;
-}
-
-/*
- * Curl_raw_equal() is for doing "raw" case insensitive strings. This is meant
- * to be locale independent and only compare strings we know are safe for
- * this. See http://daniel.haxx.se/blog/2008/10/15/strcasecmp-in-turkish/ for
- * some further explanation to why this function is necessary.
- *
- * The function is capable of comparing a-z case insensitively even for
- * non-ascii.
- */
-
-static int Curl_raw_equal(const char *first, const char *second)
-{
- while(*first && *second) {
- if(Curl_raw_toupper(*first) != Curl_raw_toupper(*second))
- /* get out of the loop as soon as they don't match */
- break;
- first++;
- second++;
- }
- /* we do the comparison here (possibly again), just to make sure that if the
- loop above is skipped because one of the strings reached zero, we must not
- return this as a successful match */
- return (Curl_raw_toupper(*first) == Curl_raw_toupper(*second));
-}
-
-static int Curl_raw_nequal(const char *first, const char *second, size_t max)
-{
- while(*first && *second && max) {
- if(Curl_raw_toupper(*first) != Curl_raw_toupper(*second)) {
- break;
- }
- max--;
- first++;
- second++;
- }
- if(0 == max)
- return 1; /* they are equal this far */
-
- return Curl_raw_toupper(*first) == Curl_raw_toupper(*second);
-}
-
-/*
- * Match a hostname against a wildcard pattern.
- * E.g.
- * "foo.host.com" matches "*.host.com".
- *
- * We use the matching rule described in RFC6125, section 6.4.3.
- * http://tools.ietf.org/html/rfc6125#section-6.4.3
- */
-
-static int hostmatch(const char *hostname, const char *pattern)
-{
- const char *pattern_label_end, *pattern_wildcard, *hostname_label_end;
- int wildcard_enabled;
- size_t prefixlen, suffixlen;
- pattern_wildcard = strchr(pattern, '*');
- if(pattern_wildcard == NULL)
- return Curl_raw_equal(pattern, hostname) ?
- CURL_HOST_MATCH : CURL_HOST_NOMATCH;
-
- /* We require at least 2 dots in pattern to avoid too wide wildcard
- match. */
- wildcard_enabled = 1;
- pattern_label_end = strchr(pattern, '.');
- if(pattern_label_end == NULL || strchr(pattern_label_end+1, '.') == NULL ||
- pattern_wildcard > pattern_label_end ||
- Curl_raw_nequal(pattern, "xn--", 4)) {
- wildcard_enabled = 0;
- }
- if(!wildcard_enabled)
- return Curl_raw_equal(pattern, hostname) ?
- CURL_HOST_MATCH : CURL_HOST_NOMATCH;
-
- hostname_label_end = strchr(hostname, '.');
- if(hostname_label_end == NULL ||
- !Curl_raw_equal(pattern_label_end, hostname_label_end))
- return CURL_HOST_NOMATCH;
-
- /* The wildcard must match at least one character, so the left-most
- label of the hostname is at least as large as the left-most label
- of the pattern. */
- if(hostname_label_end - hostname < pattern_label_end - pattern)
- return CURL_HOST_NOMATCH;
-
- prefixlen = pattern_wildcard - pattern;
- suffixlen = pattern_label_end - (pattern_wildcard+1);
- return Curl_raw_nequal(pattern, hostname, prefixlen) &&
- Curl_raw_nequal(pattern_wildcard+1, hostname_label_end - suffixlen,
- suffixlen) ?
- CURL_HOST_MATCH : CURL_HOST_NOMATCH;
-}
-
-int Tool_Curl_cert_hostcheck(const char *match_pattern, const char *hostname)
-{
- if(!match_pattern || !*match_pattern ||
- !hostname || !*hostname) /* sanity check */
- return 0;
-
- if(Curl_raw_equal(hostname, match_pattern)) /* trivial case */
- return 1;
-
- if(hostmatch(hostname,match_pattern) == CURL_HOST_MATCH)
- return 1;
- return 0;
-}
diff --git a/thirdparty/misc/curl_hostcheck.h b/thirdparty/misc/curl_hostcheck.h
deleted file mode 100644
index 1b7fbe81e3..0000000000
--- a/thirdparty/misc/curl_hostcheck.h
+++ /dev/null
@@ -1,39 +0,0 @@
-#ifndef HEADER_TOOL_CURL_HOSTCHECK_H
-#define HEADER_TOOL_CURL_HOSTCHECK_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/***************************************************************************
- * _ _ ____ _
- * Project ___| | | | _ \| |
- * / __| | | | |_) | |
- * | (__| |_| | _ <| |___
- * \___|\___/|_| \_\_____|
- *
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
- *
- * This software is licensed as described in the file COPYING, which
- * you should have received as part of this distribution. The terms
- * are also available at http://curl.haxx.se/docs/copyright.html.
- *
- * You may opt to use, copy, modify, merge, publish, distribute and/or sell
- * copies of the Software, and permit persons to whom the Software is
- * furnished to do so, under the terms of the COPYING file.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ***************************************************************************/
-
-#define CURL_HOST_NOMATCH 0
-#define CURL_HOST_MATCH 1
-int Tool_Curl_cert_hostcheck(const char *match_pattern, const char *hostname);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* HEADER_CURL_HOSTCHECK_H */
-
diff --git a/thirdparty/misc/fastlz.c b/thirdparty/misc/fastlz.c
index 508f6ea2ae..b4d2dd3c29 100644
--- a/thirdparty/misc/fastlz.c
+++ b/thirdparty/misc/fastlz.c
@@ -1,9 +1,6 @@
- /*
- FastLZ - lightning-fast lossless compression library
-
- Copyright (C) 2007 Ariya Hidayat (ariya@kde.org)
- Copyright (C) 2006 Ariya Hidayat (ariya@kde.org)
- Copyright (C) 2005 Ariya Hidayat (ariya@kde.org)
+/*
+ FastLZ - Byte-aligned LZ77 compression library
+ Copyright (C) 2005-2020 Ariya Hidayat <ariya.hidayat@gmail.com>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
@@ -24,239 +21,375 @@
THE SOFTWARE.
*/
-#if !defined(FASTLZ_COMPRESSOR) && !defined(FASTLZ_DECOMPRESSOR)
+#include "fastlz.h"
+
+#include <stdint.h>
/*
* Always check for bound when decompressing.
* Generally it is best to leave it defined.
*/
#define FASTLZ_SAFE
+#if defined(FASTLZ_USE_SAFE_DECOMPRESSOR) && (FASTLZ_USE_SAFE_DECOMPRESSOR == 0)
+#undef FASTLZ_SAFE
+#endif
/*
* Give hints to the compiler for branch prediction optimization.
*/
-#if defined(__GNUC__) && (__GNUC__ > 2)
-#define FASTLZ_EXPECT_CONDITIONAL(c) (__builtin_expect((c), 1))
-#define FASTLZ_UNEXPECT_CONDITIONAL(c) (__builtin_expect((c), 0))
+#if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 2))
+#define FASTLZ_LIKELY(c) (__builtin_expect(!!(c), 1))
+#define FASTLZ_UNLIKELY(c) (__builtin_expect(!!(c), 0))
#else
-#define FASTLZ_EXPECT_CONDITIONAL(c) (c)
-#define FASTLZ_UNEXPECT_CONDITIONAL(c) (c)
+#define FASTLZ_LIKELY(c) (c)
+#define FASTLZ_UNLIKELY(c) (c)
#endif
-/*
- * Use inlined functions for supported systems.
- */
-#if defined(__GNUC__) || defined(__DMC__) || defined(__POCC__) || defined(__WATCOMC__) || defined(__SUNPRO_C)
-#define FASTLZ_INLINE inline
-#elif defined(__BORLANDC__) || defined(_MSC_VER) || defined(__LCC__)
-#define FASTLZ_INLINE __inline
-#else
-#define FASTLZ_INLINE
+#if defined(FASTLZ_SAFE)
+#define FASTLZ_BOUND_CHECK(cond) \
+ if (FASTLZ_UNLIKELY(!(cond))) return 0;
+#else
+#define FASTLZ_BOUND_CHECK(cond) \
+ do { \
+ } while (0)
#endif
-/*
- * Prevent accessing more than 8-bit at once, except on x86 architectures.
- */
-#if !defined(FASTLZ_STRICT_ALIGN)
-#define FASTLZ_STRICT_ALIGN
-#if defined(__i386__) || defined(__386) /* GNU C, Sun Studio */
-#undef FASTLZ_STRICT_ALIGN
-#elif defined(__i486__) || defined(__i586__) || defined(__i686__) /* GNU C */
-#undef FASTLZ_STRICT_ALIGN
-#elif defined(_M_IX86) /* Intel, MSVC */
-#undef FASTLZ_STRICT_ALIGN
-#elif defined(__386)
-#undef FASTLZ_STRICT_ALIGN
-#elif defined(_X86_) /* MinGW */
-#undef FASTLZ_STRICT_ALIGN
-#elif defined(__I86__) /* Digital Mars */
-#undef FASTLZ_STRICT_ALIGN
-#endif
-#endif
+#define MAX_COPY 32
+#define MAX_LEN 264 /* 256 + 8 */
+#define MAX_L1_DISTANCE 8192
+#define MAX_L2_DISTANCE 8191
+#define MAX_FARDISTANCE (65535 + MAX_L2_DISTANCE - 1)
+
+#define FASTLZ_READU16(p) ((p)[0] | (p)[1] << 8)
+
+#define HASH_LOG 13
+#define HASH_SIZE (1 << HASH_LOG)
+#define HASH_MASK (HASH_SIZE - 1)
+#define HASH_FUNCTION(v, p) \
+ { \
+ v = FASTLZ_READU16(p); \
+ v ^= FASTLZ_READU16(p + 1) ^ (v >> (16 - HASH_LOG)); \
+ v &= HASH_MASK; \
+ }
-/*
- * FIXME: use preprocessor magic to set this on different platforms!
- */
-typedef unsigned char flzuint8;
-typedef unsigned short flzuint16;
-typedef unsigned int flzuint32;
+int fastlz1_compress(const void* input, int length, void* output) {
+ const uint8_t* ip = (const uint8_t*)input;
+ const uint8_t* ip_bound = ip + length - 2;
+ const uint8_t* ip_limit = ip + length - 12 - 1;
+ uint8_t* op = (uint8_t*)output;
-/* prototypes */
-int fastlz_compress(const void* input, int length, void* output);
-int fastlz_compress_level(int level, const void* input, int length, void* output);
-int fastlz_decompress(const void* input, int length, void* output, int maxout);
+ const uint8_t* htab[HASH_SIZE];
+ uint32_t hval;
-#define MAX_COPY 32
-#define MAX_LEN 264 /* 256 + 8 */
-#define MAX_DISTANCE 8192
+ uint32_t copy;
-#if !defined(FASTLZ_STRICT_ALIGN)
-#define FASTLZ_READU16(p) *((const flzuint16*)(p))
-#else
-#define FASTLZ_READU16(p) ((p)[0] | (p)[1]<<8)
-#endif
+ /* sanity check */
+ if (FASTLZ_UNLIKELY(length < 4)) {
+ if (length) {
+ /* create literal copy only */
+ *op++ = length - 1;
+ ip_bound++;
+ while (ip <= ip_bound) *op++ = *ip++;
+ return length + 1;
+ } else
+ return 0;
+ }
-#define HASH_LOG 13
-#define HASH_SIZE (1<< HASH_LOG)
-#define HASH_MASK (HASH_SIZE-1)
-#define HASH_FUNCTION(v,p) { v = FASTLZ_READU16(p); v ^= FASTLZ_READU16(p+1)^(v>>(16-HASH_LOG));v &= HASH_MASK; }
-
-#undef FASTLZ_LEVEL
-#define FASTLZ_LEVEL 1
-
-#undef FASTLZ_COMPRESSOR
-#undef FASTLZ_DECOMPRESSOR
-#define FASTLZ_COMPRESSOR fastlz1_compress
-#define FASTLZ_DECOMPRESSOR fastlz1_decompress
-static FASTLZ_INLINE int FASTLZ_COMPRESSOR(const void* input, int length, void* output);
-static FASTLZ_INLINE int FASTLZ_DECOMPRESSOR(const void* input, int length, void* output, int maxout);
-#include "fastlz.c"
-
-#undef FASTLZ_LEVEL
-#define FASTLZ_LEVEL 2
-
-#undef MAX_DISTANCE
-#define MAX_DISTANCE 8191
-#define MAX_FARDISTANCE (65535+MAX_DISTANCE-1)
-
-#undef FASTLZ_COMPRESSOR
-#undef FASTLZ_DECOMPRESSOR
-#define FASTLZ_COMPRESSOR fastlz2_compress
-#define FASTLZ_DECOMPRESSOR fastlz2_decompress
-static FASTLZ_INLINE int FASTLZ_COMPRESSOR(const void* input, int length, void* output);
-static FASTLZ_INLINE int FASTLZ_DECOMPRESSOR(const void* input, int length, void* output, int maxout);
-#include "fastlz.c"
-
-int fastlz_compress(const void* input, int length, void* output)
-{
- /* for short block, choose fastlz1 */
- if(length < 65536)
- return fastlz1_compress(input, length, output);
+ /* initializes hash table */
+ for (hval = 0; hval < HASH_SIZE; ++hval) htab[hval] = ip;
- /* else... */
- return fastlz2_compress(input, length, output);
+ /* we start with literal copy */
+ copy = 2;
+ *op++ = MAX_COPY - 1;
+ *op++ = *ip++;
+ *op++ = *ip++;
+
+ /* main loop */
+ while (FASTLZ_LIKELY(ip < ip_limit)) {
+ const uint8_t* ref;
+ uint32_t distance;
+
+ /* minimum match length */
+ uint32_t len = 3;
+
+ /* comparison starting-point */
+ const uint8_t* anchor = ip;
+
+ /* find potential match */
+ HASH_FUNCTION(hval, ip);
+ ref = htab[hval];
+
+ /* update hash table */
+ htab[hval] = anchor;
+
+ /* calculate distance to the match */
+ distance = anchor - ref;
+
+ /* is this a match? check the first 3 bytes */
+ if (distance == 0 || (distance >= MAX_L1_DISTANCE) || *ref++ != *ip++ ||
+ *ref++ != *ip++ || *ref++ != *ip++)
+ goto literal;
+
+ /* last matched byte */
+ ip = anchor + len;
+
+ /* distance is biased */
+ distance--;
+
+ if (!distance) {
+ /* zero distance means a run */
+ uint8_t x = ip[-1];
+ while (ip < ip_bound)
+ if (*ref++ != x)
+ break;
+ else
+ ip++;
+ } else
+ for (;;) {
+ /* safe because the outer check against ip limit */
+ if (*ref++ != *ip++) break;
+ if (*ref++ != *ip++) break;
+ if (*ref++ != *ip++) break;
+ if (*ref++ != *ip++) break;
+ if (*ref++ != *ip++) break;
+ if (*ref++ != *ip++) break;
+ if (*ref++ != *ip++) break;
+ if (*ref++ != *ip++) break;
+ while (ip < ip_bound)
+ if (*ref++ != *ip++) break;
+ break;
+ }
+
+ /* if we have copied something, adjust the copy count */
+ if (copy) /* copy is biased, '0' means 1 byte copy */
+ *(op - copy - 1) = copy - 1;
+ else
+ /* back, to overwrite the copy count */
+ op--;
+
+ /* reset literal counter */
+ copy = 0;
+
+ /* length is biased, '1' means a match of 3 bytes */
+ ip -= 3;
+ len = ip - anchor;
+
+ /* encode the match */
+ if (FASTLZ_UNLIKELY(len > MAX_LEN - 2))
+ while (len > MAX_LEN - 2) {
+ *op++ = (7 << 5) + (distance >> 8);
+ *op++ = MAX_LEN - 2 - 7 - 2;
+ *op++ = (distance & 255);
+ len -= MAX_LEN - 2;
+ }
+
+ if (len < 7) {
+ *op++ = (len << 5) + (distance >> 8);
+ *op++ = (distance & 255);
+ } else {
+ *op++ = (7 << 5) + (distance >> 8);
+ *op++ = len - 7;
+ *op++ = (distance & 255);
+ }
+
+ /* update the hash at match boundary */
+ HASH_FUNCTION(hval, ip);
+ htab[hval] = ip++;
+ HASH_FUNCTION(hval, ip);
+ htab[hval] = ip++;
+
+ /* assuming literal copy */
+ *op++ = MAX_COPY - 1;
+
+ continue;
+
+ literal:
+ *op++ = *anchor++;
+ ip = anchor;
+ copy++;
+ if (FASTLZ_UNLIKELY(copy == MAX_COPY)) {
+ copy = 0;
+ *op++ = MAX_COPY - 1;
+ }
+ }
+
+ /* left-over as literal copy */
+ ip_bound++;
+ while (ip <= ip_bound) {
+ *op++ = *ip++;
+ copy++;
+ if (copy == MAX_COPY) {
+ copy = 0;
+ *op++ = MAX_COPY - 1;
+ }
+ }
+
+ /* if we have copied something, adjust the copy length */
+ if (copy)
+ *(op - copy - 1) = copy - 1;
+ else
+ op--;
+
+ return op - (uint8_t*)output;
}
-int fastlz_decompress(const void* input, int length, void* output, int maxout)
-{
- /* magic identifier for compression level */
- int level = ((*(const flzuint8*)input) >> 5) + 1;
+#if defined(FASTLZ_USE_MEMMOVE) && (FASTLZ_USE_MEMMOVE == 0)
- if(level == 1)
- return fastlz1_decompress(input, length, output, maxout);
- if(level == 2)
- return fastlz2_decompress(input, length, output, maxout);
+static void fastlz_memmove(uint8_t* dest, const uint8_t* src, uint32_t count) {
+ do {
+ *dest++ = *src++;
+ } while (--count);
+}
- /* unknown level, trigger error */
- return 0;
+static void fastlz_memcpy(uint8_t* dest, const uint8_t* src, uint32_t count) {
+ return fastlz_memmove(dest, src, count);
}
-int fastlz_compress_level(int level, const void* input, int length, void* output)
-{
- if(level == 1)
- return fastlz1_compress(input, length, output);
- if(level == 2)
- return fastlz2_compress(input, length, output);
+#else
- return 0;
+#include <string.h>
+
+static void fastlz_memmove(uint8_t* dest, const uint8_t* src, uint32_t count) {
+ if ((count > 4) && (dest >= src + count)) {
+ memmove(dest, src, count);
+ } else {
+ switch (count) {
+ default:
+ do {
+ *dest++ = *src++;
+ } while (--count);
+ break;
+ case 3:
+ *dest++ = *src++;
+ case 2:
+ *dest++ = *src++;
+ case 1:
+ *dest++ = *src++;
+ case 0:
+ break;
+ }
+ }
+}
+
+static void fastlz_memcpy(uint8_t* dest, const uint8_t* src, uint32_t count) {
+ memcpy(dest, src, count);
}
-#else /* !defined(FASTLZ_COMPRESSOR) && !defined(FASTLZ_DECOMPRESSOR) */
+#endif
-static FASTLZ_INLINE int FASTLZ_COMPRESSOR(const void* input, int length, void* output)
-{
- const flzuint8* ip = (const flzuint8*) input;
- const flzuint8* ip_bound = ip + length - 2;
- const flzuint8* ip_limit = ip + length - 12;
- flzuint8* op = (flzuint8*) output;
+int fastlz1_decompress(const void* input, int length, void* output,
+ int maxout) {
+ const uint8_t* ip = (const uint8_t*)input;
+ const uint8_t* ip_limit = ip + length;
+ const uint8_t* ip_bound = ip_limit - 2;
+ uint8_t* op = (uint8_t*)output;
+ uint8_t* op_limit = op + maxout;
+ uint32_t ctrl = (*ip++) & 31;
+
+ while (1) {
+ if (ctrl >= 32) {
+ uint32_t len = (ctrl >> 5) - 1;
+ uint32_t ofs = (ctrl & 31) << 8;
+ const uint8_t* ref = op - ofs - 1;
+ if (len == 7 - 1) {
+ FASTLZ_BOUND_CHECK(ip <= ip_bound);
+ len += *ip++;
+ }
+ ref -= *ip++;
+ len += 3;
+ FASTLZ_BOUND_CHECK(op + len <= op_limit);
+ FASTLZ_BOUND_CHECK(ref >= (uint8_t*)output);
+ fastlz_memmove(op, ref, len);
+ op += len;
+ } else {
+ ctrl++;
+ FASTLZ_BOUND_CHECK(op + ctrl <= op_limit);
+ FASTLZ_BOUND_CHECK(ip + ctrl <= ip_limit);
+ fastlz_memcpy(op, ip, ctrl);
+ ip += ctrl;
+ op += ctrl;
+ }
- const flzuint8* htab[HASH_SIZE];
- const flzuint8** hslot;
- flzuint32 hval;
+ if (FASTLZ_UNLIKELY(ip > ip_bound)) break;
+ ctrl = *ip++;
+ }
+
+ return op - (uint8_t*)output;
+}
- flzuint32 copy;
+int fastlz2_compress(const void* input, int length, void* output) {
+ const uint8_t* ip = (const uint8_t*)input;
+ const uint8_t* ip_bound = ip + length - 2;
+ const uint8_t* ip_limit = ip + length - 12 - 1;
+ uint8_t* op = (uint8_t*)output;
+
+ const uint8_t* htab[HASH_SIZE];
+ uint32_t hval;
+
+ uint32_t copy;
/* sanity check */
- if(FASTLZ_UNEXPECT_CONDITIONAL(length < 4))
- {
- if(length)
- {
+ if (FASTLZ_UNLIKELY(length < 4)) {
+ if (length) {
/* create literal copy only */
- *op++ = length-1;
+ *op++ = length - 1;
ip_bound++;
- while(ip <= ip_bound)
- *op++ = *ip++;
- return length+1;
- }
- else
+ while (ip <= ip_bound) *op++ = *ip++;
+ return length + 1;
+ } else
return 0;
}
/* initializes hash table */
- for (hslot = htab; hslot < htab + HASH_SIZE; hslot++)
- *hslot = ip;
+ for (hval = 0; hval < HASH_SIZE; ++hval) htab[hval] = ip;
/* we start with literal copy */
copy = 2;
- *op++ = MAX_COPY-1;
+ *op++ = MAX_COPY - 1;
*op++ = *ip++;
*op++ = *ip++;
/* main loop */
- while(FASTLZ_EXPECT_CONDITIONAL(ip < ip_limit))
- {
- const flzuint8* ref;
- flzuint32 distance;
+ while (FASTLZ_LIKELY(ip < ip_limit)) {
+ const uint8_t* ref;
+ uint32_t distance;
/* minimum match length */
- flzuint32 len = 3;
+ uint32_t len = 3;
/* comparison starting-point */
- const flzuint8* anchor = ip;
+ const uint8_t* anchor = ip;
/* check for a run */
-#if FASTLZ_LEVEL==2
- if(ip[0] == ip[-1] && FASTLZ_READU16(ip-1)==FASTLZ_READU16(ip+1))
- {
+ if (ip[0] == ip[-1] && ip[0] == ip[1] && ip[1] == ip[2]) {
distance = 1;
ip += 3;
ref = anchor - 1 + 3;
goto match;
}
-#endif
/* find potential match */
- HASH_FUNCTION(hval,ip);
- hslot = htab + hval;
+ HASH_FUNCTION(hval, ip);
ref = htab[hval];
+ /* update hash table */
+ htab[hval] = anchor;
+
/* calculate distance to the match */
distance = anchor - ref;
- /* update hash table */
- *hslot = anchor;
-
/* is this a match? check the first 3 bytes */
- if(distance==0 ||
-#if FASTLZ_LEVEL==1
- (distance >= MAX_DISTANCE) ||
-#else
- (distance >= MAX_FARDISTANCE) ||
-#endif
- *ref++ != *ip++ || *ref++!=*ip++ || *ref++!=*ip++)
+ if (distance == 0 || (distance >= MAX_FARDISTANCE) || *ref++ != *ip++ ||
+ *ref++ != *ip++ || *ref++ != *ip++)
goto literal;
-#if FASTLZ_LEVEL==2
/* far, needs at least 5-byte match */
- if(distance >= MAX_DISTANCE)
- {
- if(*ip++ != *ref++ || *ip++!= *ref++)
- goto literal;
+ if (distance >= MAX_L2_DISTANCE) {
+ if (*ip++ != *ref++ || *ip++ != *ref++) goto literal;
len += 2;
}
-
- match:
-#endif
+
+ match:
/* last matched byte */
ip = anchor + len;
@@ -264,34 +397,33 @@ static FASTLZ_INLINE int FASTLZ_COMPRESSOR(const void* input, int length, void*
/* distance is biased */
distance--;
- if(!distance)
- {
+ if (!distance) {
/* zero distance means a run */
- flzuint8 x = ip[-1];
- while(ip < ip_bound)
- if(*ref++ != x) break; else ip++;
- }
- else
- for(;;)
- {
- /* safe because the outer check against ip limit */
- if(*ref++ != *ip++) break;
- if(*ref++ != *ip++) break;
- if(*ref++ != *ip++) break;
- if(*ref++ != *ip++) break;
- if(*ref++ != *ip++) break;
- if(*ref++ != *ip++) break;
- if(*ref++ != *ip++) break;
- if(*ref++ != *ip++) break;
- while(ip < ip_bound)
- if(*ref++ != *ip++) break;
- break;
- }
+ uint8_t x = ip[-1];
+ while (ip < ip_bound)
+ if (*ref++ != x)
+ break;
+ else
+ ip++;
+ } else
+ for (;;) {
+ /* safe because the outer check against ip limit */
+ if (*ref++ != *ip++) break;
+ if (*ref++ != *ip++) break;
+ if (*ref++ != *ip++) break;
+ if (*ref++ != *ip++) break;
+ if (*ref++ != *ip++) break;
+ if (*ref++ != *ip++) break;
+ if (*ref++ != *ip++) break;
+ if (*ref++ != *ip++) break;
+ while (ip < ip_bound)
+ if (*ref++ != *ip++) break;
+ break;
+ }
/* if we have copied something, adjust the copy count */
- if(copy)
- /* copy is biased, '0' means 1 byte copy */
- *(op-copy-1) = copy-1;
+ if (copy) /* copy is biased, '0' means 1 byte copy */
+ *(op - copy - 1) = copy - 1;
else
/* back, to overwrite the copy count */
op--;
@@ -304,248 +436,156 @@ static FASTLZ_INLINE int FASTLZ_COMPRESSOR(const void* input, int length, void*
len = ip - anchor;
/* encode the match */
-#if FASTLZ_LEVEL==2
- if(distance < MAX_DISTANCE)
- {
- if(len < 7)
- {
+ if (distance < MAX_L2_DISTANCE) {
+ if (len < 7) {
*op++ = (len << 5) + (distance >> 8);
*op++ = (distance & 255);
- }
- else
- {
+ } else {
*op++ = (7 << 5) + (distance >> 8);
- for(len-=7; len >= 255; len-= 255)
- *op++ = 255;
+ for (len -= 7; len >= 255; len -= 255) *op++ = 255;
*op++ = len;
*op++ = (distance & 255);
}
- }
- else
- {
+ } else {
/* far away, but not yet in the another galaxy... */
- if(len < 7)
- {
- distance -= MAX_DISTANCE;
+ if (len < 7) {
+ distance -= MAX_L2_DISTANCE;
*op++ = (len << 5) + 31;
*op++ = 255;
*op++ = distance >> 8;
*op++ = distance & 255;
- }
- else
- {
- distance -= MAX_DISTANCE;
+ } else {
+ distance -= MAX_L2_DISTANCE;
*op++ = (7 << 5) + 31;
- for(len-=7; len >= 255; len-= 255)
- *op++ = 255;
+ for (len -= 7; len >= 255; len -= 255) *op++ = 255;
*op++ = len;
*op++ = 255;
*op++ = distance >> 8;
*op++ = distance & 255;
}
}
-#else
-
- if(FASTLZ_UNEXPECT_CONDITIONAL(len > MAX_LEN-2))
- while(len > MAX_LEN-2)
- {
- *op++ = (7 << 5) + (distance >> 8);
- *op++ = MAX_LEN - 2 - 7 -2;
- *op++ = (distance & 255);
- len -= MAX_LEN-2;
- }
-
- if(len < 7)
- {
- *op++ = (len << 5) + (distance >> 8);
- *op++ = (distance & 255);
- }
- else
- {
- *op++ = (7 << 5) + (distance >> 8);
- *op++ = len - 7;
- *op++ = (distance & 255);
- }
-#endif
/* update the hash at match boundary */
- HASH_FUNCTION(hval,ip);
+ HASH_FUNCTION(hval, ip);
htab[hval] = ip++;
- HASH_FUNCTION(hval,ip);
+ HASH_FUNCTION(hval, ip);
htab[hval] = ip++;
/* assuming literal copy */
- *op++ = MAX_COPY-1;
+ *op++ = MAX_COPY - 1;
continue;
- literal:
- *op++ = *anchor++;
- ip = anchor;
- copy++;
- if(FASTLZ_UNEXPECT_CONDITIONAL(copy == MAX_COPY))
- {
- copy = 0;
- *op++ = MAX_COPY-1;
- }
+ literal:
+ *op++ = *anchor++;
+ ip = anchor;
+ copy++;
+ if (FASTLZ_UNLIKELY(copy == MAX_COPY)) {
+ copy = 0;
+ *op++ = MAX_COPY - 1;
+ }
}
/* left-over as literal copy */
ip_bound++;
- while(ip <= ip_bound)
- {
+ while (ip <= ip_bound) {
*op++ = *ip++;
copy++;
- if(copy == MAX_COPY)
- {
+ if (copy == MAX_COPY) {
copy = 0;
- *op++ = MAX_COPY-1;
+ *op++ = MAX_COPY - 1;
}
}
/* if we have copied something, adjust the copy length */
- if(copy)
- *(op-copy-1) = copy-1;
+ if (copy)
+ *(op - copy - 1) = copy - 1;
else
op--;
-#if FASTLZ_LEVEL==2
/* marker for fastlz2 */
- *(flzuint8*)output |= (1 << 5);
-#endif
+ *(uint8_t*)output |= (1 << 5);
- return op - (flzuint8*)output;
+ return op - (uint8_t*)output;
}
-static FASTLZ_INLINE int FASTLZ_DECOMPRESSOR(const void* input, int length, void* output, int maxout)
-{
- const flzuint8* ip = (const flzuint8*) input;
- const flzuint8* ip_limit = ip + length;
- flzuint8* op = (flzuint8*) output;
- flzuint8* op_limit = op + maxout;
- flzuint32 ctrl = (*ip++) & 31;
- int loop = 1;
-
- do
- {
- const flzuint8* ref = op;
- flzuint32 len = ctrl >> 5;
- flzuint32 ofs = (ctrl & 31) << 8;
-
- if(ctrl >= 32)
- {
-#if FASTLZ_LEVEL==2
- flzuint8 code;
-#endif
- len--;
- ref -= ofs;
- if (len == 7-1)
-#if FASTLZ_LEVEL==1
- len += *ip++;
- ref -= *ip++;
-#else
- do
- {
+int fastlz2_decompress(const void* input, int length, void* output,
+ int maxout) {
+ const uint8_t* ip = (const uint8_t*)input;
+ const uint8_t* ip_limit = ip + length;
+ const uint8_t* ip_bound = ip_limit - 2;
+ uint8_t* op = (uint8_t*)output;
+ uint8_t* op_limit = op + maxout;
+ uint32_t ctrl = (*ip++) & 31;
+
+ while (1) {
+ if (ctrl >= 32) {
+ uint32_t len = (ctrl >> 5) - 1;
+ uint32_t ofs = (ctrl & 31) << 8;
+ const uint8_t* ref = op - ofs - 1;
+
+ uint8_t code;
+ if (len == 7 - 1) do {
+ FASTLZ_BOUND_CHECK(ip <= ip_bound);
code = *ip++;
len += code;
- } while (code==255);
+ } while (code == 255);
code = *ip++;
ref -= code;
+ len += 3;
/* match from 16-bit distance */
- if(FASTLZ_UNEXPECT_CONDITIONAL(code==255))
- if(FASTLZ_EXPECT_CONDITIONAL(ofs==(31 << 8)))
- {
- ofs = (*ip++) << 8;
- ofs += *ip++;
- ref = op - ofs - MAX_DISTANCE;
- }
-#endif
-
-#ifdef FASTLZ_SAFE
- if (FASTLZ_UNEXPECT_CONDITIONAL(op + len + 3 > op_limit))
- return 0;
-
- if (FASTLZ_UNEXPECT_CONDITIONAL(ref-1 < (flzuint8 *)output))
- return 0;
-#endif
-
- if(FASTLZ_EXPECT_CONDITIONAL(ip < ip_limit))
- ctrl = *ip++;
- else
- loop = 0;
-
- if(ref == op)
- {
- /* optimize copy for a run */
- flzuint8 b = ref[-1];
- *op++ = b;
- *op++ = b;
- *op++ = b;
- for(; len; --len)
- *op++ = b;
- }
- else
- {
-#if !defined(FASTLZ_STRICT_ALIGN)
- const flzuint16* p;
- flzuint16* q;
-#endif
- /* copy from reference */
- ref--;
- *op++ = *ref++;
- *op++ = *ref++;
- *op++ = *ref++;
-
-#if !defined(FASTLZ_STRICT_ALIGN)
- /* copy a byte, so that now it's word aligned */
- if(len & 1)
- {
- *op++ = *ref++;
- len--;
+ if (FASTLZ_UNLIKELY(code == 255))
+ if (FASTLZ_LIKELY(ofs == (31 << 8))) {
+ FASTLZ_BOUND_CHECK(ip < ip_bound);
+ ofs = (*ip++) << 8;
+ ofs += *ip++;
+ ref = op - ofs - MAX_L2_DISTANCE - 1;
}
- /* copy 16-bit at once */
- q = (flzuint16*) op;
- op += len;
- p = (const flzuint16*) ref;
- for(len>>=1; len > 4; len-=4)
- {
- *q++ = *p++;
- *q++ = *p++;
- *q++ = *p++;
- *q++ = *p++;
- }
- for(; len; --len)
- *q++ = *p++;
-#else
- for(; len; --len)
- *op++ = *ref++;
-#endif
- }
- }
- else
- {
+ FASTLZ_BOUND_CHECK(op + len <= op_limit);
+ FASTLZ_BOUND_CHECK(ref >= (uint8_t*)output);
+ fastlz_memmove(op, ref, len);
+ op += len;
+ } else {
ctrl++;
-#ifdef FASTLZ_SAFE
- if (FASTLZ_UNEXPECT_CONDITIONAL(op + ctrl > op_limit))
- return 0;
- if (FASTLZ_UNEXPECT_CONDITIONAL(ip + ctrl > ip_limit))
- return 0;
-#endif
-
- *op++ = *ip++;
- for(--ctrl; ctrl; ctrl--)
- *op++ = *ip++;
-
- loop = FASTLZ_EXPECT_CONDITIONAL(ip < ip_limit);
- if(loop)
- ctrl = *ip++;
+ FASTLZ_BOUND_CHECK(op + ctrl <= op_limit);
+ FASTLZ_BOUND_CHECK(ip + ctrl <= ip_limit);
+ fastlz_memcpy(op, ip, ctrl);
+ ip += ctrl;
+ op += ctrl;
}
+
+ if (FASTLZ_UNLIKELY(ip >= ip_limit)) break;
+ ctrl = *ip++;
}
- while(FASTLZ_EXPECT_CONDITIONAL(loop));
- return op - (flzuint8*)output;
+ return op - (uint8_t*)output;
}
-#endif /* !defined(FASTLZ_COMPRESSOR) && !defined(FASTLZ_DECOMPRESSOR) */
+int fastlz_compress(const void* input, int length, void* output) {
+ /* for short block, choose fastlz1 */
+ if (length < 65536) return fastlz1_compress(input, length, output);
+
+ /* else... */
+ return fastlz2_compress(input, length, output);
+}
+
+int fastlz_decompress(const void* input, int length, void* output, int maxout) {
+ /* magic identifier for compression level */
+ int level = ((*(const uint8_t*)input) >> 5) + 1;
+
+ if (level == 1) return fastlz1_decompress(input, length, output, maxout);
+ if (level == 2) return fastlz2_decompress(input, length, output, maxout);
+
+ /* unknown level, trigger error */
+ return 0;
+}
+
+int fastlz_compress_level(int level, const void* input, int length,
+ void* output) {
+ if (level == 1) return fastlz1_compress(input, length, output);
+ if (level == 2) return fastlz2_compress(input, length, output);
+
+ return 0;
+}
diff --git a/thirdparty/misc/fastlz.h b/thirdparty/misc/fastlz.h
index e5ca8dfc02..e53dbfbb56 100644
--- a/thirdparty/misc/fastlz.h
+++ b/thirdparty/misc/fastlz.h
@@ -1,9 +1,6 @@
/*
- FastLZ - lightning-fast lossless compression library
-
- Copyright (C) 2007 Ariya Hidayat (ariya@kde.org)
- Copyright (C) 2006 Ariya Hidayat (ariya@kde.org)
- Copyright (C) 2005 Ariya Hidayat (ariya@kde.org)
+ FastLZ - Byte-aligned LZ77 compression library
+ Copyright (C) 2005-2020 Ariya Hidayat <ariya.hidayat@gmail.com>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
@@ -27,15 +24,15 @@
#ifndef FASTLZ_H
#define FASTLZ_H
-#define FASTLZ_VERSION 0x000100
+#define FASTLZ_VERSION 0x000500
-#define FASTLZ_VERSION_MAJOR 0
-#define FASTLZ_VERSION_MINOR 0
-#define FASTLZ_VERSION_REVISION 0
+#define FASTLZ_VERSION_MAJOR 0
+#define FASTLZ_VERSION_MINOR 5
+#define FASTLZ_VERSION_REVISION 0
-#define FASTLZ_VERSION_STRING "0.1.0"
+#define FASTLZ_VERSION_STRING "0.5.0"
-#if defined (__cplusplus)
+#if defined(__cplusplus)
extern "C" {
#endif
@@ -51,9 +48,18 @@ extern "C" {
length (input buffer size).
The input buffer and the output buffer can not overlap.
+
+ Compression level can be specified in parameter level. At the moment,
+ only level 1 and level 2 are supported.
+ Level 1 is the fastest compression and generally useful for short data.
+ Level 2 is slightly slower but it gives better compression ratio.
+
+ Note that the compressed data, regardless of the level, can always be
+ decompressed using the function fastlz_decompress below.
*/
-int fastlz_compress(const void* input, int length, void* output);
+int fastlz_compress_level(int level, const void* input, int length,
+ void* output);
/**
Decompress a block of compressed data and returns the size of the
@@ -65,35 +71,27 @@ int fastlz_compress(const void* input, int length, void* output);
Decompression is memory safe and guaranteed not to write the output buffer
more than what is specified in maxout.
+
+ Note that the decompression will always work, regardless of the
+ compression level specified in fastlz_compress_level above (when
+ producing the compressed block).
*/
int fastlz_decompress(const void* input, int length, void* output, int maxout);
/**
- Compress a block of data in the input buffer and returns the size of
- compressed block. The size of input buffer is specified by length. The
- minimum input buffer size is 16.
+ DEPRECATED.
- The output buffer must be at least 5% larger than the input buffer
- and can not be smaller than 66 bytes.
-
- If the input is not compressible, the return value might be larger than
- length (input buffer size).
+ This is similar to fastlz_compress_level above, but with the level
+ automatically chosen.
- The input buffer and the output buffer can not overlap.
-
- Compression level can be specified in parameter level. At the moment,
- only level 1 and level 2 are supported.
- Level 1 is the fastest compression and generally useful for short data.
- Level 2 is slightly slower but it gives better compression ratio.
-
- Note that the compressed data, regardless of the level, can always be
- decompressed using the function fastlz_decompress above.
+ This function is deprecated and it will be completely removed in some future
+ version.
*/
-int fastlz_compress_level(int level, const void* input, int length, void* output);
+int fastlz_compress(const void* input, int length, void* output);
-#if defined (__cplusplus)
+#if defined(__cplusplus)
}
#endif
diff --git a/thirdparty/misc/stb_vorbis.c b/thirdparty/misc/stb_vorbis.c
index 4ab8880d5d..b0d79b1724 100644
--- a/thirdparty/misc/stb_vorbis.c
+++ b/thirdparty/misc/stb_vorbis.c
@@ -1,4 +1,4 @@
-// Ogg Vorbis audio decoder - v1.17 - public domain
+// Ogg Vorbis audio decoder - v1.19 - public domain
// http://nothings.org/stb_vorbis/
//
// Original version written by Sean Barrett in 2007.
@@ -26,13 +26,16 @@
// Terje Mathisen Niklas Frykholm Andy Hill
// Casey Muratori John Bolton Gargaj
// Laurent Gomila Marc LeBlanc Ronny Chevalier
-// Bernhard Wodo Evan Balster alxprd@github
+// Bernhard Wodo Evan Balster github:alxprd
// Tom Beaumont Ingo Leitgeb Nicolas Guillemot
// Phillip Bennefall Rohit Thiago Goulart
-// manxorist@github saga musix github:infatum
-// Timur Gagiev Maxwell Koo
+// github:manxorist saga musix github:infatum
+// Timur Gagiev Maxwell Koo Peter Waller
+// github:audinowho Dougall Johnson
//
// Partial history:
+// 1.19 - 2020-02-05 - warnings
+// 1.18 - 2020-02-02 - fix seek bugs; parse header comments; misc warnings etc.
// 1.17 - 2019-07-08 - fix CVE-2019-13217..CVE-2019-13223 (by ForAllSecure)
// 1.16 - 2019-03-04 - fix warnings
// 1.15 - 2019-02-07 - explicit failure if Ogg Skeleton data is found
@@ -130,9 +133,20 @@ typedef struct
int max_frame_size;
} stb_vorbis_info;
+typedef struct
+{
+ char *vendor;
+
+ int comment_list_length;
+ char **comment_list;
+} stb_vorbis_comment;
+
// get general information about the file
extern stb_vorbis_info stb_vorbis_get_info(stb_vorbis *f);
+// get ogg comments
+extern stb_vorbis_comment stb_vorbis_get_comment(stb_vorbis *f);
+
// get the last error detected (clears it, too)
extern int stb_vorbis_get_error(stb_vorbis *f);
@@ -759,6 +773,10 @@ struct stb_vorbis
unsigned int temp_memory_required;
unsigned int setup_temp_memory_required;
+ char *vendor;
+ int comment_list_length;
+ char **comment_list;
+
// input config
#ifndef STB_VORBIS_NO_STDIO
FILE *f;
@@ -774,8 +792,11 @@ struct stb_vorbis
uint8 push_mode;
+ // the page to seek to when seeking to start, may be zero
uint32 first_audio_page_offset;
+ // p_first is the page on which the first audio packet ends
+ // (but not necessarily the page on which it starts)
ProbedPage p_first, p_last;
// memory management
@@ -888,7 +909,7 @@ static int error(vorb *f, enum STBVorbisError e)
#define array_size_required(count,size) (count*(sizeof(void *)+(size)))
#define temp_alloc(f,size) (f->alloc.alloc_buffer ? setup_temp_malloc(f,size) : alloca(size))
-#define temp_free(f,p) 0
+#define temp_free(f,p) (void)0
#define temp_alloc_save(f) ((f)->temp_offset)
#define temp_alloc_restore(f,p) ((f)->temp_offset = (p))
@@ -909,7 +930,7 @@ static void *make_block_array(void *mem, int count, int size)
static void *setup_malloc(vorb *f, int sz)
{
- sz = (sz+3) & ~3;
+ sz = (sz+7) & ~7; // round up to nearest 8 for alignment of future allocs.
f->setup_memory_required += sz;
if (f->alloc.alloc_buffer) {
void *p = (char *) f->alloc.alloc_buffer + f->setup_offset;
@@ -928,7 +949,7 @@ static void setup_free(vorb *f, void *p)
static void *setup_temp_malloc(vorb *f, int sz)
{
- sz = (sz+3) & ~3;
+ sz = (sz+7) & ~7; // round up to nearest 8 for alignment of future allocs.
if (f->alloc.alloc_buffer) {
if (f->temp_offset - sz < f->setup_offset) return NULL;
f->temp_offset -= sz;
@@ -940,7 +961,7 @@ static void *setup_temp_malloc(vorb *f, int sz)
static void setup_temp_free(vorb *f, void *p, int sz)
{
if (f->alloc.alloc_buffer) {
- f->temp_offset += (sz+3)&~3;
+ f->temp_offset += (sz+7)&~7;
return;
}
free(p);
@@ -1404,6 +1425,9 @@ static int capture_pattern(vorb *f)
static int start_page_no_capturepattern(vorb *f)
{
uint32 loc0,loc1,n;
+ if (f->first_decode && !IS_PUSH_MODE(f)) {
+ f->p_first.page_start = stb_vorbis_get_file_offset(f) - 4;
+ }
// stream structure version
if (0 != get8(f)) return error(f, VORBIS_invalid_stream_structure_version);
// header flag
@@ -1440,15 +1464,12 @@ static int start_page_no_capturepattern(vorb *f)
}
if (f->first_decode) {
int i,len;
- ProbedPage p;
len = 0;
for (i=0; i < f->segment_count; ++i)
len += f->segments[i];
len += 27 + f->segment_count;
- p.page_start = f->first_audio_page_offset;
- p.page_end = p.page_start + len;
- p.last_decoded_sample = loc0;
- f->p_first = p;
+ f->p_first.page_end = f->p_first.page_start + len;
+ f->p_first.last_decoded_sample = loc0;
}
f->next_seg = 0;
return TRUE;
@@ -1539,6 +1560,16 @@ static int get8_packet(vorb *f)
return x;
}
+static int get32_packet(vorb *f)
+{
+ uint32 x;
+ x = get8_packet(f);
+ x += get8_packet(f) << 8;
+ x += get8_packet(f) << 16;
+ x += (uint32) get8_packet(f) << 24;
+ return x;
+}
+
static void flush_packet(vorb *f)
{
while (get8_packet_raw(f) != EOP);
@@ -2130,47 +2161,7 @@ static void decode_residue(vorb *f, float *residue_buffers[], int ch, int n, int
++class_set;
#endif
}
- } else if (ch == 1) {
- while (pcount < part_read) {
- int z = r->begin + pcount*r->part_size;
- int c_inter = 0, p_inter = z;
- if (pass == 0) {
- Codebook *c = f->codebooks+r->classbook;
- int q;
- DECODE(q,f,c);
- if (q == EOP) goto done;
- #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE
- part_classdata[0][class_set] = r->classdata[q];
- #else
- for (i=classwords-1; i >= 0; --i) {
- classifications[0][i+pcount] = q % r->classifications;
- q /= r->classifications;
- }
- #endif
- }
- for (i=0; i < classwords && pcount < part_read; ++i, ++pcount) {
- int z = r->begin + pcount*r->part_size;
- #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE
- int c = part_classdata[0][class_set][i];
- #else
- int c = classifications[0][pcount];
- #endif
- int b = r->residue_books[c][pass];
- if (b >= 0) {
- Codebook *book = f->codebooks + b;
- if (!codebook_decode_deinterleave_repeat(f, book, residue_buffers, ch, &c_inter, &p_inter, n, r->part_size))
- goto done;
- } else {
- z += r->part_size;
- c_inter = 0;
- p_inter = z;
- }
- }
- #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE
- ++class_set;
- #endif
- }
- } else {
+ } else if (ch > 2) {
while (pcount < part_read) {
int z = r->begin + pcount*r->part_size;
int c_inter = z % ch, p_inter = z/ch;
@@ -3504,7 +3495,7 @@ static int vorbis_pump_first_frame(stb_vorbis *f)
}
#ifndef STB_VORBIS_NO_PUSHDATA_API
-static int is_whole_packet_present(stb_vorbis *f, int end_page)
+static int is_whole_packet_present(stb_vorbis *f)
{
// make sure that we have the packet available before continuing...
// this requires a full ogg parse, but we know we can fetch from f->stream
@@ -3524,8 +3515,6 @@ static int is_whole_packet_present(stb_vorbis *f, int end_page)
break;
}
// either this continues, or it ends it...
- if (end_page)
- if (s < f->segment_count-1) return error(f, VORBIS_invalid_stream);
if (s == f->segment_count)
s = -1; // set 'crosses page' flag
if (p > f->stream_end) return error(f, VORBIS_need_more_data);
@@ -3558,8 +3547,6 @@ static int is_whole_packet_present(stb_vorbis *f, int end_page)
if (q[s] < 255)
break;
}
- if (end_page)
- if (s < n-1) return error(f, VORBIS_invalid_stream);
if (s == n)
s = -1; // set 'crosses page' flag
if (p > f->stream_end) return error(f, VORBIS_need_more_data);
@@ -3576,6 +3563,7 @@ static int start_decoder(vorb *f)
int longest_floorlist=0;
// first page, first packet
+ f->first_decode = TRUE;
if (!start_page(f)) return FALSE;
// validate page flag
@@ -3633,6 +3621,41 @@ static int start_decoder(vorb *f)
if (!start_page(f)) return FALSE;
if (!start_packet(f)) return FALSE;
+
+ if (!next_segment(f)) return FALSE;
+
+ if (get8_packet(f) != VORBIS_packet_comment) return error(f, VORBIS_invalid_setup);
+ for (i=0; i < 6; ++i) header[i] = get8_packet(f);
+ if (!vorbis_validate(header)) return error(f, VORBIS_invalid_setup);
+ //file vendor
+ len = get32_packet(f);
+ f->vendor = (char*)setup_malloc(f, sizeof(char) * (len+1));
+ for(i=0; i < len; ++i) {
+ f->vendor[i] = get8_packet(f);
+ }
+ f->vendor[len] = (char)'\0';
+ //user comments
+ f->comment_list_length = get32_packet(f);
+ f->comment_list = (char**)setup_malloc(f, sizeof(char*) * (f->comment_list_length));
+
+ for(i=0; i < f->comment_list_length; ++i) {
+ len = get32_packet(f);
+ f->comment_list[i] = (char*)setup_malloc(f, sizeof(char) * (len+1));
+
+ for(j=0; j < len; ++j) {
+ f->comment_list[i][j] = get8_packet(f);
+ }
+ f->comment_list[i][len] = (char)'\0';
+ }
+
+ // framing_flag
+ x = get8_packet(f);
+ if (!(x & 1)) return error(f, VORBIS_invalid_setup);
+
+
+ skip(f, f->bytes_in_seg);
+ f->bytes_in_seg = 0;
+
do {
len = next_segment(f);
skip(f, len);
@@ -3644,7 +3667,7 @@ static int start_decoder(vorb *f)
#ifndef STB_VORBIS_NO_PUSHDATA_API
if (IS_PUSH_MODE(f)) {
- if (!is_whole_packet_present(f, TRUE)) {
+ if (!is_whole_packet_present(f)) {
// convert error in ogg header to write type
if (f->error == VORBIS_invalid_stream)
f->error = VORBIS_invalid_setup;
@@ -3947,7 +3970,7 @@ static int start_decoder(vorb *f)
g->sorted_order[j] = (uint8) p[j].id;
// precompute the neighbors
for (j=2; j < g->values; ++j) {
- int low,hi;
+ int low = 0,hi = 0;
neighbors(g->Xlist, j, &low,&hi);
g->neighbors[j][0] = low;
g->neighbors[j][1] = hi;
@@ -4132,7 +4155,6 @@ static int start_decoder(vorb *f)
f->temp_memory_required = imdct_mem;
}
- f->first_decode = TRUE;
if (f->alloc.alloc_buffer) {
assert(f->temp_offset == f->alloc.alloc_buffer_length_in_bytes);
@@ -4141,7 +4163,17 @@ static int start_decoder(vorb *f)
return error(f, VORBIS_outofmem);
}
- f->first_audio_page_offset = stb_vorbis_get_file_offset(f);
+ // @TODO: stb_vorbis_seek_start expects first_audio_page_offset to point to a page
+ // without PAGEFLAG_continued_packet, so this either points to the first page, or
+ // the page after the end of the headers. It might be cleaner to point to a page
+ // in the middle of the headers, when that's the page where the first audio packet
+ // starts, but we'd have to also correctly skip the end of any continued packet in
+ // stb_vorbis_seek_start.
+ if (f->next_seg == -1) {
+ f->first_audio_page_offset = stb_vorbis_get_file_offset(f);
+ } else {
+ f->first_audio_page_offset = 0;
+ }
return TRUE;
}
@@ -4149,6 +4181,13 @@ static int start_decoder(vorb *f)
static void vorbis_deinit(stb_vorbis *p)
{
int i,j;
+
+ setup_free(p, p->vendor);
+ for (i=0; i < p->comment_list_length; ++i) {
+ setup_free(p, p->comment_list[i]);
+ }
+ setup_free(p, p->comment_list);
+
if (p->residue_config) {
for (i=0; i < p->residue_count; ++i) {
Residue *r = p->residue_config+i;
@@ -4248,6 +4287,15 @@ stb_vorbis_info stb_vorbis_get_info(stb_vorbis *f)
return d;
}
+stb_vorbis_comment stb_vorbis_get_comment(stb_vorbis *f)
+{
+ stb_vorbis_comment d;
+ d.vendor = f->vendor;
+ d.comment_list_length = f->comment_list_length;
+ d.comment_list = f->comment_list;
+ return d;
+}
+
int stb_vorbis_get_error(stb_vorbis *f)
{
int e = f->error;
@@ -4389,7 +4437,7 @@ int stb_vorbis_decode_frame_pushdata(
f->error = VORBIS__no_error;
// check that we have the entire packet in memory
- if (!is_whole_packet_present(f, FALSE)) {
+ if (!is_whole_packet_present(f)) {
*samples = 0;
return 0;
}
@@ -4625,8 +4673,8 @@ static int seek_to_sample_coarse(stb_vorbis *f, uint32 sample_number)
{
ProbedPage left, right, mid;
int i, start_seg_with_known_loc, end_pos, page_start;
- uint32 delta, stream_length, padding;
- double offset, bytes_per_sample;
+ uint32 delta, stream_length, padding, last_sample_limit;
+ double offset = 0.0, bytes_per_sample = 0.0;
int probe = 0;
// find the last page and validate the target sample
@@ -4639,9 +4687,9 @@ static int seek_to_sample_coarse(stb_vorbis *f, uint32 sample_number)
// indicates should be the granule position (give or take one)).
padding = ((f->blocksize_1 - f->blocksize_0) >> 2);
if (sample_number < padding)
- sample_number = 0;
+ last_sample_limit = 0;
else
- sample_number -= padding;
+ last_sample_limit = sample_number - padding;
left = f->p_first;
while (left.last_decoded_sample == ~0U) {
@@ -4654,9 +4702,12 @@ static int seek_to_sample_coarse(stb_vorbis *f, uint32 sample_number)
assert(right.last_decoded_sample != ~0U);
// starting from the start is handled differently
- if (sample_number <= left.last_decoded_sample) {
- if (stb_vorbis_seek_start(f))
+ if (last_sample_limit <= left.last_decoded_sample) {
+ if (stb_vorbis_seek_start(f)) {
+ if (f->current_loc > sample_number)
+ return error(f, VORBIS_seek_failed);
return 1;
+ }
return 0;
}
@@ -4673,10 +4724,10 @@ static int seek_to_sample_coarse(stb_vorbis *f, uint32 sample_number)
// first probe (interpolate)
double data_bytes = right.page_end - left.page_start;
bytes_per_sample = data_bytes / right.last_decoded_sample;
- offset = left.page_start + bytes_per_sample * (sample_number - left.last_decoded_sample);
+ offset = left.page_start + bytes_per_sample * (last_sample_limit - left.last_decoded_sample);
} else {
// second probe (try to bound the other side)
- double error = ((double) sample_number - mid.last_decoded_sample) * bytes_per_sample;
+ double error = ((double) last_sample_limit - mid.last_decoded_sample) * bytes_per_sample;
if (error >= 0 && error < 8000) error = 8000;
if (error < 0 && error > -8000) error = -8000;
offset += error * 2;
@@ -4707,14 +4758,16 @@ static int seek_to_sample_coarse(stb_vorbis *f, uint32 sample_number)
}
// if we've just found the last page again then we're in a tricky file,
- // and we're close enough.
- if (mid.page_start == right.page_start)
- break;
-
- if (sample_number < mid.last_decoded_sample)
- right = mid;
- else
- left = mid;
+ // and we're close enough (if it wasn't an interpolation probe).
+ if (mid.page_start == right.page_start) {
+ if (probe >= 2 || delta <= 65536)
+ break;
+ } else {
+ if (last_sample_limit < mid.last_decoded_sample)
+ right = mid;
+ else
+ left = mid;
+ }
++probe;
}
@@ -4830,8 +4883,8 @@ int stb_vorbis_seek_frame(stb_vorbis *f, unsigned int sample_number)
flush_packet(f);
}
}
- // the next frame will start with the sample
- assert(f->current_loc == sample_number);
+ // the next frame should start with the sample
+ if (f->current_loc != sample_number) return error(f, VORBIS_seek_failed);
return 1;
}
@@ -5173,7 +5226,7 @@ static void convert_samples_short(int buf_c, short **buffer, int b_offset, int d
int stb_vorbis_get_frame_short(stb_vorbis *f, int num_c, short **buffer, int num_samples)
{
- float **output;
+ float **output = NULL;
int len = stb_vorbis_get_frame_float(f, NULL, &output);
if (len > num_samples) len = num_samples;
if (len)
diff --git a/thirdparty/pcre2/src/config.h b/thirdparty/pcre2/src/config.h
index 25d45eeb38..787bb9c999 100644
--- a/thirdparty/pcre2/src/config.h
+++ b/thirdparty/pcre2/src/config.h
@@ -218,7 +218,7 @@ sure both macros are undefined; an emulation function will then be used. */
#define PACKAGE_NAME "PCRE2"
/* Define to the full name and version of this package. */
-#define PACKAGE_STRING "PCRE2 10.33"
+#define PACKAGE_STRING "PCRE2 10.34"
/* Define to the one symbol short name of this package. */
#define PACKAGE_TARNAME "pcre2"
@@ -227,7 +227,7 @@ sure both macros are undefined; an emulation function will then be used. */
#define PACKAGE_URL ""
/* Define to the version of this package. */
-#define PACKAGE_VERSION "10.33"
+#define PACKAGE_VERSION "10.34"
/* The value of PARENS_NEST_LIMIT specifies the maximum depth of nested
parentheses (of any kind) in a pattern. This limits the amount of system
@@ -352,7 +352,7 @@ sure both macros are undefined; an emulation function will then be used. */
#endif
/* Version number of package */
-#define VERSION "10.33"
+#define VERSION "10.34"
/* Define to 1 if on MINIX. */
/* #undef _MINIX */
diff --git a/thirdparty/pcre2/src/pcre2.h b/thirdparty/pcre2/src/pcre2.h
index 102b5d91f1..cb9d61a35b 100644
--- a/thirdparty/pcre2/src/pcre2.h
+++ b/thirdparty/pcre2/src/pcre2.h
@@ -5,7 +5,7 @@
/* This is the public header file for the PCRE library, second API, to be
#included by applications that call PCRE2 functions.
- Copyright (c) 2016-2018 University of Cambridge
+ Copyright (c) 2016-2019 University of Cambridge
-----------------------------------------------------------------------------
Redistribution and use in source and binary forms, with or without
@@ -42,9 +42,9 @@ POSSIBILITY OF SUCH DAMAGE.
/* The current PCRE version information. */
#define PCRE2_MAJOR 10
-#define PCRE2_MINOR 33
+#define PCRE2_MINOR 34
#define PCRE2_PRERELEASE
-#define PCRE2_DATE 2019-04-16
+#define PCRE2_DATE 2019-11-21
/* When an application links to a PCRE DLL in Windows, the symbols that are
imported have to be identified as such. When building PCRE2, the appropriate
@@ -142,6 +142,7 @@ D is inspected during pcre2_dfa_match() execution
#define PCRE2_USE_OFFSET_LIMIT 0x00800000u /* J M D */
#define PCRE2_EXTENDED_MORE 0x01000000u /* C */
#define PCRE2_LITERAL 0x02000000u /* C */
+#define PCRE2_MATCH_INVALID_UTF 0x04000000u /* J M D */
/* An additional compile options word is available in the compile context. */
@@ -305,6 +306,8 @@ pcre2_pattern_convert(). */
#define PCRE2_ERROR_INVALID_HYPHEN_IN_OPTIONS 194
#define PCRE2_ERROR_ALPHA_ASSERTION_UNKNOWN 195
#define PCRE2_ERROR_SCRIPT_RUN_NOT_AVAILABLE 196
+#define PCRE2_ERROR_TOO_MANY_CAPTURES 197
+#define PCRE2_ERROR_CONDITION_ATOMIC_ASSERTION_EXPECTED 198
/* "Expected" matching error codes: no match and partial match. */
@@ -390,6 +393,7 @@ released, the numbers must not be changed. */
#define PCRE2_ERROR_HEAPLIMIT (-63)
#define PCRE2_ERROR_CONVERT_SYNTAX (-64)
#define PCRE2_ERROR_INTERNAL_DUPMATCH (-65)
+#define PCRE2_ERROR_DFA_UINVALID_UTF (-66)
/* Request types for pcre2_pattern_info() */
@@ -580,7 +584,7 @@ PCRE2_EXP_DECL void PCRE2_CALL_CONVENTION \
PCRE2_EXP_DECL int PCRE2_CALL_CONVENTION \
pcre2_set_bsr(pcre2_compile_context *, uint32_t); \
PCRE2_EXP_DECL int PCRE2_CALL_CONVENTION \
- pcre2_set_character_tables(pcre2_compile_context *, const unsigned char *); \
+ pcre2_set_character_tables(pcre2_compile_context *, const uint8_t *); \
PCRE2_EXP_DECL int PCRE2_CALL_CONVENTION \
pcre2_set_compile_extra_options(pcre2_compile_context *, uint32_t); \
PCRE2_EXP_DECL int PCRE2_CALL_CONVENTION \
@@ -675,6 +679,8 @@ PCRE2_EXP_DECL void PCRE2_CALL_CONVENTION \
pcre2_match_data_free(pcre2_match_data *); \
PCRE2_EXP_DECL PCRE2_SPTR PCRE2_CALL_CONVENTION \
pcre2_get_mark(pcre2_match_data *); \
+PCRE2_EXP_DECL PCRE2_SIZE PCRE2_CALL_CONVENTION \
+ pcre2_get_match_data_size(pcre2_match_data *); \
PCRE2_EXP_DECL uint32_t PCRE2_CALL_CONVENTION \
pcre2_get_ovector_count(pcre2_match_data *); \
PCRE2_EXP_DECL PCRE2_SIZE PCRE2_CALL_CONVENTION \
@@ -773,7 +779,8 @@ PCRE2_EXP_DECL int PCRE2_CALL_CONVENTION \
pcre2_get_error_message(int, PCRE2_UCHAR *, PCRE2_SIZE); \
PCRE2_EXP_DECL const uint8_t PCRE2_CALL_CONVENTION \
*pcre2_maketables(pcre2_general_context *); \
-
+PCRE2_EXP_DECL void PCRE2_CALL_CONVENTION \
+ pcre2_maketables_free(pcre2_general_context *, const uint8_t *);
/* Define macros that generate width-specific names from generic versions. The
three-level macro scheme is necessary to get the macros expanded when we want
@@ -838,6 +845,7 @@ pcre2_compile are called by application code. */
#define pcre2_general_context_free PCRE2_SUFFIX(pcre2_general_context_free_)
#define pcre2_get_error_message PCRE2_SUFFIX(pcre2_get_error_message_)
#define pcre2_get_mark PCRE2_SUFFIX(pcre2_get_mark_)
+#define pcre2_get_match_data_size PCRE2_SUFFIX(pcre2_get_match_data_size_)
#define pcre2_get_ovector_pointer PCRE2_SUFFIX(pcre2_get_ovector_pointer_)
#define pcre2_get_ovector_count PCRE2_SUFFIX(pcre2_get_ovector_count_)
#define pcre2_get_startchar PCRE2_SUFFIX(pcre2_get_startchar_)
@@ -848,6 +856,7 @@ pcre2_compile are called by application code. */
#define pcre2_jit_stack_create PCRE2_SUFFIX(pcre2_jit_stack_create_)
#define pcre2_jit_stack_free PCRE2_SUFFIX(pcre2_jit_stack_free_)
#define pcre2_maketables PCRE2_SUFFIX(pcre2_maketables_)
+#define pcre2_maketables_free PCRE2_SUFFIX(pcre2_maketables_free_)
#define pcre2_match PCRE2_SUFFIX(pcre2_match_)
#define pcre2_match_context_copy PCRE2_SUFFIX(pcre2_match_context_copy_)
#define pcre2_match_context_create PCRE2_SUFFIX(pcre2_match_context_create_)
diff --git a/thirdparty/pcre2/src/pcre2_auto_possess.c b/thirdparty/pcre2/src/pcre2_auto_possess.c
index 6d7b7c4a4d..5b95b9b8a8 100644
--- a/thirdparty/pcre2/src/pcre2_auto_possess.c
+++ b/thirdparty/pcre2/src/pcre2_auto_possess.c
@@ -624,6 +624,13 @@ for(;;)
case OP_ASSERTBACK_NOT:
case OP_ONCE:
return !entered_a_group;
+
+ /* Non-atomic assertions - don't possessify last iterator. This needs
+ more thought. */
+
+ case OP_ASSERT_NA:
+ case OP_ASSERTBACK_NA:
+ return FALSE;
}
/* Skip over the bracket and inspect what comes next. */
diff --git a/thirdparty/pcre2/src/pcre2_compile.c b/thirdparty/pcre2/src/pcre2_compile.c
index 068735ae8e..f2e6b6b5bd 100644
--- a/thirdparty/pcre2/src/pcre2_compile.c
+++ b/thirdparty/pcre2/src/pcre2_compile.c
@@ -135,6 +135,9 @@ static BOOL
set_lookbehind_lengths(uint32_t **, int *, int *, parsed_recurse_check *,
compile_block *);
+static int
+ check_lookbehinds(uint32_t *, uint32_t **, parsed_recurse_check *,
+ compile_block *);
/*************************************************
@@ -250,36 +253,41 @@ is present where expected in a conditional group. */
#define META_LOOKBEHIND 0x80250000u /* (?<= */
#define META_LOOKBEHINDNOT 0x80260000u /* (?<! */
+/* These cannot be conditions */
+
+#define META_LOOKAHEAD_NA 0x80270000u /* (*napla: */
+#define META_LOOKBEHIND_NA 0x80280000u /* (*naplb: */
+
/* These must be kept in this order, with consecutive values, and the _ARG
versions of COMMIT, PRUNE, SKIP, and THEN immediately after their non-argument
versions. */
-#define META_MARK 0x80270000u /* (*MARK) */
-#define META_ACCEPT 0x80280000u /* (*ACCEPT) */
-#define META_FAIL 0x80290000u /* (*FAIL) */
-#define META_COMMIT 0x802a0000u /* These */
-#define META_COMMIT_ARG 0x802b0000u /* pairs */
-#define META_PRUNE 0x802c0000u /* must */
-#define META_PRUNE_ARG 0x802d0000u /* be */
-#define META_SKIP 0x802e0000u /* kept */
-#define META_SKIP_ARG 0x802f0000u /* in */
-#define META_THEN 0x80300000u /* this */
-#define META_THEN_ARG 0x80310000u /* order */
+#define META_MARK 0x80290000u /* (*MARK) */
+#define META_ACCEPT 0x802a0000u /* (*ACCEPT) */
+#define META_FAIL 0x802b0000u /* (*FAIL) */
+#define META_COMMIT 0x802c0000u /* These */
+#define META_COMMIT_ARG 0x802d0000u /* pairs */
+#define META_PRUNE 0x802e0000u /* must */
+#define META_PRUNE_ARG 0x802f0000u /* be */
+#define META_SKIP 0x80300000u /* kept */
+#define META_SKIP_ARG 0x80310000u /* in */
+#define META_THEN 0x80320000u /* this */
+#define META_THEN_ARG 0x80330000u /* order */
/* These must be kept in groups of adjacent 3 values, and all together. */
-#define META_ASTERISK 0x80320000u /* * */
-#define META_ASTERISK_PLUS 0x80330000u /* *+ */
-#define META_ASTERISK_QUERY 0x80340000u /* *? */
-#define META_PLUS 0x80350000u /* + */
-#define META_PLUS_PLUS 0x80360000u /* ++ */
-#define META_PLUS_QUERY 0x80370000u /* +? */
-#define META_QUERY 0x80380000u /* ? */
-#define META_QUERY_PLUS 0x80390000u /* ?+ */
-#define META_QUERY_QUERY 0x803a0000u /* ?? */
-#define META_MINMAX 0x803b0000u /* {n,m} repeat */
-#define META_MINMAX_PLUS 0x803c0000u /* {n,m}+ repeat */
-#define META_MINMAX_QUERY 0x803d0000u /* {n,m}? repeat */
+#define META_ASTERISK 0x80340000u /* * */
+#define META_ASTERISK_PLUS 0x80350000u /* *+ */
+#define META_ASTERISK_QUERY 0x80360000u /* *? */
+#define META_PLUS 0x80370000u /* + */
+#define META_PLUS_PLUS 0x80380000u /* ++ */
+#define META_PLUS_QUERY 0x80390000u /* +? */
+#define META_QUERY 0x803a0000u /* ? */
+#define META_QUERY_PLUS 0x803b0000u /* ?+ */
+#define META_QUERY_QUERY 0x803c0000u /* ?? */
+#define META_MINMAX 0x803d0000u /* {n,m} repeat */
+#define META_MINMAX_PLUS 0x803e0000u /* {n,m}+ repeat */
+#define META_MINMAX_QUERY 0x803f0000u /* {n,m}? repeat */
#define META_FIRST_QUANTIFIER META_ASTERISK
#define META_LAST_QUANTIFIER META_MINMAX_QUERY
@@ -335,6 +343,8 @@ static unsigned char meta_extra_lengths[] = {
0, /* META_LOOKAHEADNOT */
SIZEOFFSET, /* META_LOOKBEHIND */
SIZEOFFSET, /* META_LOOKBEHINDNOT */
+ 0, /* META_LOOKAHEAD_NA */
+ SIZEOFFSET, /* META_LOOKBEHIND_NA */
1, /* META_MARK - plus the string length */
0, /* META_ACCEPT */
0, /* META_FAIL */
@@ -634,10 +644,14 @@ typedef struct alasitem {
static const char alasnames[] =
STRING_pla0
STRING_plb0
+ STRING_napla0
+ STRING_naplb0
STRING_nla0
STRING_nlb0
STRING_positive_lookahead0
STRING_positive_lookbehind0
+ STRING_non_atomic_positive_lookahead0
+ STRING_non_atomic_positive_lookbehind0
STRING_negative_lookahead0
STRING_negative_lookbehind0
STRING_atomic0
@@ -649,10 +663,14 @@ static const char alasnames[] =
static const alasitem alasmeta[] = {
{ 3, META_LOOKAHEAD },
{ 3, META_LOOKBEHIND },
+ { 5, META_LOOKAHEAD_NA },
+ { 5, META_LOOKBEHIND_NA },
{ 3, META_LOOKAHEADNOT },
{ 3, META_LOOKBEHINDNOT },
{ 18, META_LOOKAHEAD },
{ 19, META_LOOKBEHIND },
+ { 29, META_LOOKAHEAD_NA },
+ { 30, META_LOOKBEHIND_NA },
{ 18, META_LOOKAHEADNOT },
{ 19, META_LOOKBEHINDNOT },
{ 6, META_ATOMIC },
@@ -746,8 +764,8 @@ are allowed. */
#define PUBLIC_LITERAL_COMPILE_OPTIONS \
(PCRE2_ANCHORED|PCRE2_AUTO_CALLOUT|PCRE2_CASELESS|PCRE2_ENDANCHORED| \
- PCRE2_FIRSTLINE|PCRE2_LITERAL|PCRE2_NO_START_OPTIMIZE| \
- PCRE2_NO_UTF_CHECK|PCRE2_USE_OFFSET_LIMIT|PCRE2_UTF)
+ PCRE2_FIRSTLINE|PCRE2_LITERAL|PCRE2_MATCH_INVALID_UTF| \
+ PCRE2_NO_START_OPTIMIZE|PCRE2_NO_UTF_CHECK|PCRE2_USE_OFFSET_LIMIT|PCRE2_UTF)
#define PUBLIC_COMPILE_OPTIONS \
(PUBLIC_LITERAL_COMPILE_OPTIONS| \
@@ -781,7 +799,7 @@ enum { ERR0 = COMPILE_ERROR_BASE,
ERR61, ERR62, ERR63, ERR64, ERR65, ERR66, ERR67, ERR68, ERR69, ERR70,
ERR71, ERR72, ERR73, ERR74, ERR75, ERR76, ERR77, ERR78, ERR79, ERR80,
ERR81, ERR82, ERR83, ERR84, ERR85, ERR86, ERR87, ERR88, ERR89, ERR90,
- ERR91, ERR92, ERR93, ERR94, ERR95, ERR96 };
+ ERR91, ERR92, ERR93, ERR94, ERR95, ERR96, ERR97, ERR98 };
/* This is a table of start-of-pattern options such as (*UTF) and settings such
as (*LIMIT_MATCH=nnnn) and (*CRLF). For completeness and backward
@@ -1012,6 +1030,7 @@ for (;;)
case META_NOCAPTURE: fprintf(stderr, "META (?:"); break;
case META_LOOKAHEAD: fprintf(stderr, "META (?="); break;
case META_LOOKAHEADNOT: fprintf(stderr, "META (?!"); break;
+ case META_LOOKAHEAD_NA: fprintf(stderr, "META (*napla:"); break;
case META_SCRIPT_RUN: fprintf(stderr, "META (*sr:"); break;
case META_KET: fprintf(stderr, "META )"); break;
case META_ALT: fprintf(stderr, "META | %d", meta_arg); break;
@@ -1043,6 +1062,12 @@ for (;;)
fprintf(stderr, "%zd", offset);
break;
+ case META_LOOKBEHIND_NA:
+ fprintf(stderr, "META (*naplb: %d offset=", meta_arg);
+ GETOFFSET(offset, pptr);
+ fprintf(stderr, "%zd", offset);
+ break;
+
case META_LOOKBEHINDNOT:
fprintf(stderr, "META (?<! %d offset=", meta_arg);
GETOFFSET(offset, pptr);
@@ -1419,9 +1444,6 @@ the result is "not a repeat quantifier". */
EXIT:
if (yield || *errorcodeptr != 0) *ptrptr = p;
return yield;
-
-
-
}
@@ -2450,8 +2472,9 @@ must be last. */
enum { RANGE_NO, RANGE_STARTED, RANGE_OK_ESCAPED, RANGE_OK_LITERAL };
-/* Only in 32-bit mode can there be literals > META_END. A macros encapsulates
-the storing of literal values in the parsed pattern. */
+/* Only in 32-bit mode can there be literals > META_END. A macro encapsulates
+the storing of literal values in the main parsed pattern, where they can always
+be quantified. */
#if PCRE2_CODE_UNIT_WIDTH == 32
#define PARSED_LITERAL(c, p) \
@@ -2474,6 +2497,7 @@ uint32_t delimiter;
uint32_t namelen;
uint32_t class_range_state;
uint32_t *verblengthptr = NULL; /* Value avoids compiler warning */
+uint32_t *verbstartptr = NULL;
uint32_t *previous_callout = NULL;
uint32_t *parsed_pattern = cb->parsed_pattern;
uint32_t *parsed_pattern_end = cb->parsed_pattern_end;
@@ -2600,10 +2624,20 @@ while (ptr < ptrend)
errorcode = ERR28;
goto FAILED;
}
- if (!inverbname && after_manual_callout-- <= 0)
- parsed_pattern = manage_callouts(thisptr, &previous_callout,
- auto_callout, parsed_pattern, cb);
- PARSED_LITERAL(c, parsed_pattern);
+ if (inverbname)
+ { /* Don't use PARSED_LITERAL() because it */
+#if PCRE2_CODE_UNIT_WIDTH == 32 /* sets okquantifier. */
+ if (c >= META_END) *parsed_pattern++ = META_BIGVALUE;
+#endif
+ *parsed_pattern++ = c;
+ }
+ else
+ {
+ if (after_manual_callout-- <= 0)
+ parsed_pattern = manage_callouts(thisptr, &previous_callout,
+ auto_callout, parsed_pattern, cb);
+ PARSED_LITERAL(c, parsed_pattern);
+ }
meta_quantifier = 0;
}
continue; /* Next character */
@@ -2640,13 +2674,15 @@ while (ptr < ptrend)
switch(c)
{
- default:
- PARSED_LITERAL(c, parsed_pattern);
+ default: /* Don't use PARSED_LITERAL() because it */
+#if PCRE2_CODE_UNIT_WIDTH == 32 /* sets okquantifier. */
+ if (c >= META_END) *parsed_pattern++ = META_BIGVALUE;
+#endif
+ *parsed_pattern++ = c;
break;
case CHAR_RIGHT_PARENTHESIS:
inverbname = FALSE;
- okquantifier = FALSE; /* Was probably set by literals */
/* This is the length in characters */
verbnamelength = (PCRE2_SIZE)(parsed_pattern - verblengthptr - 1);
/* But the limit on the length is in code units */
@@ -2680,8 +2716,11 @@ while (ptr < ptrend)
switch(escape)
{
- case 0:
- PARSED_LITERAL(c, parsed_pattern);
+ case 0: /* Don't use PARSED_LITERAL() because it */
+#if PCRE2_CODE_UNIT_WIDTH == 32 /* sets okquantifier. */
+ if (c >= META_END) *parsed_pattern++ = META_BIGVALUE;
+#endif
+ *parsed_pattern++ = c;
break;
case ESC_Q:
@@ -3135,6 +3174,21 @@ while (ptr < ptrend)
goto FAILED_BACK;
}
+ /* Most (*VERB)s are not allowed to be quantified, but an ungreedy
+ quantifier can be useful for (*ACCEPT) - meaning "succeed on backtrack", a
+ sort of negated (*COMMIT). We therefore allow (*ACCEPT) to be quantified by
+ wrapping it in non-capturing brackets, but we have to allow for a preceding
+ (*MARK) for when (*ACCEPT) has an argument. */
+
+ if (parsed_pattern[-1] == META_ACCEPT)
+ {
+ uint32_t *p;
+ for (p = parsed_pattern - 1; p >= verbstartptr; p--) p[1] = p[0];
+ *verbstartptr = META_NOCAPTURE;
+ parsed_pattern[1] = META_KET;
+ parsed_pattern += 2;
+ }
+
/* Now we can put the quantifier into the parsed pattern vector. At this
stage, we have only the basic quantifier. The check for a following + or ?
modifier happens at the top of the loop, after any intervening comments
@@ -3581,6 +3635,8 @@ while (ptr < ptrend)
if (c == CHAR_RIGHT_SQUARE_BRACKET && !inescq) break;
} /* End of class-processing loop */
+ /* -] at the end of a class is a literal '-' */
+
if (class_range_state == RANGE_STARTED)
{
parsed_pattern[-1] = CHAR_MINUS;
@@ -3611,6 +3667,11 @@ while (ptr < ptrend)
nest_depth++;
if ((options & PCRE2_NO_AUTO_CAPTURE) == 0)
{
+ if (cb->bracount >= MAX_GROUP_NUMBER)
+ {
+ errorcode = ERR97;
+ goto FAILED;
+ }
cb->bracount++;
*parsed_pattern++ = META_CAPTURE | cb->bracount;
}
@@ -3658,19 +3719,20 @@ while (ptr < ptrend)
goto FAILED;
}
- /* Check for expecting an assertion condition. If so, only lookaround
- assertions are valid. */
+ /* Check for expecting an assertion condition. If so, only atomic
+ lookaround assertions are valid. */
meta = alasmeta[i].meta;
if (prev_expect_cond_assert > 0 &&
(meta < META_LOOKAHEAD || meta > META_LOOKBEHINDNOT))
{
- errorcode = ERR28; /* Assertion expected */
+ errorcode = (meta == META_LOOKAHEAD_NA || meta == META_LOOKBEHIND_NA)?
+ ERR98 : ERR28; /* (Atomic) assertion expected */
goto FAILED;
}
- /* The lookaround alphabetic synonyms can be almost entirely handled by
- jumping to the code that handles the traditional symbolic forms. */
+ /* The lookaround alphabetic synonyms can mostly be handled by jumping
+ to the code that handles the traditional symbolic forms. */
switch(meta)
{
@@ -3684,11 +3746,17 @@ while (ptr < ptrend)
case META_LOOKAHEAD:
goto POSITIVE_LOOK_AHEAD;
+ case META_LOOKAHEAD_NA:
+ *parsed_pattern++ = meta;
+ ptr++;
+ goto POST_ASSERTION;
+
case META_LOOKAHEADNOT:
goto NEGATIVE_LOOK_AHEAD;
case META_LOOKBEHIND:
case META_LOOKBEHINDNOT:
+ case META_LOOKBEHIND_NA:
*parsed_pattern++ = meta;
ptr--;
goto POST_LOOKBEHIND;
@@ -3770,6 +3838,12 @@ while (ptr < ptrend)
goto FAILED;
}
+ /* Remember where this verb, possibly with a preceding (*MARK), starts,
+ for handling quantified (*ACCEPT). */
+
+ verbstartptr = parsed_pattern;
+ okquantifier = (verbs[i].meta == META_ACCEPT);
+
/* It appears that Perl allows any characters whatsoever, other than a
closing parenthesis, to appear in arguments ("names"), so we no longer
insist on letters, digits, and underscores. Perl does not, however, do
@@ -4386,7 +4460,7 @@ while (ptr < ptrend)
*parsed_pattern++ = (ptr[1] == CHAR_EQUALS_SIGN)?
META_LOOKBEHIND : META_LOOKBEHINDNOT;
- POST_LOOKBEHIND: /* Come from (*plb: and (*nlb: */
+ POST_LOOKBEHIND: /* Come from (*plb: (*naplb: and (*nlb: */
*has_lookbehind = TRUE;
offset = (PCRE2_SIZE)(ptr - cb->start_pattern - 2);
PUTOFFSET(offset, parsed_pattern);
@@ -4435,6 +4509,11 @@ while (ptr < ptrend)
/* We have a name for this capturing group. It is also assigned a number,
which is its primary means of identification. */
+ if (cb->bracount >= MAX_GROUP_NUMBER)
+ {
+ errorcode = ERR97;
+ goto FAILED;
+ }
cb->bracount++;
*parsed_pattern++ = META_CAPTURE | cb->bracount;
nest_depth++;
@@ -4661,6 +4740,7 @@ for (;;)
case OP_ASSERT_NOT:
case OP_ASSERTBACK:
case OP_ASSERTBACK_NOT:
+ case OP_ASSERTBACK_NA:
if (!skipassert) return code;
do code += GET(code, 1); while (*code == OP_ALT);
code += PRIV(OP_lengths)[*code];
@@ -5221,8 +5301,10 @@ PCRE2_UCHAR *tempcode;
PCRE2_UCHAR *previous = NULL;
PCRE2_UCHAR op_previous;
BOOL groupsetfirstcu = FALSE;
+BOOL had_accept = FALSE;
BOOL matched_char = FALSE;
BOOL previous_matched_char = FALSE;
+BOOL reset_caseful = FALSE;
const uint8_t *cbits = cb->cbits;
uint8_t classbits[32];
@@ -5355,7 +5437,7 @@ for (;; pptr++)
if (meta < META_ASTERISK || meta > META_MINMAX_QUERY)
{
previous = code;
- if (matched_char) okreturn = 1;
+ if (matched_char && !had_accept) okreturn = 1;
}
previous_matched_char = matched_char;
@@ -5499,7 +5581,45 @@ for (;; pptr++)
} /* End of 1-char optimization */
/* Handle character classes that contain more than just one literal
- character. */
+ character. If there are exactly two characters in a positive class, see if
+ they are case partners. This can be optimized to generate a caseless single
+ character match (which also sets first/required code units if relevant). */
+
+ if (meta == META_CLASS && pptr[1] < META_END && pptr[2] < META_END &&
+ pptr[3] == META_CLASS_END)
+ {
+ uint32_t c = pptr[1];
+
+#ifdef SUPPORT_UNICODE
+ if (UCD_CASESET(c) == 0)
+#endif
+ {
+ uint32_t d;
+
+#ifdef SUPPORT_UNICODE
+ if (utf && c > 127) d = UCD_OTHERCASE(c); else
+#endif
+ {
+#if PCRE2_CODE_UNIT_WIDTH != 8
+ if (c > 255) d = c; else
+#endif
+ d = TABLE_GET(c, cb->fcc, c);
+ }
+
+ if (c != d && pptr[2] == d)
+ {
+ pptr += 3; /* Move on to class end */
+ meta = c;
+ if ((options & PCRE2_CASELESS) == 0)
+ {
+ reset_caseful = TRUE;
+ options |= PCRE2_CASELESS;
+ req_caseopt = REQ_CASELESS;
+ }
+ goto CLASS_CASELESS_CHAR;
+ }
+ }
+ }
/* If a non-extended class contains a negative special such as \S, we need
to flip the negation flag at the end, so that support for characters > 255
@@ -5994,7 +6114,7 @@ for (;; pptr++)
workspace overflow. Do not set firstcu after *ACCEPT. */
case META_ACCEPT:
- cb->had_accept = TRUE;
+ cb->had_accept = had_accept = TRUE;
for (oc = cb->open_caps;
oc != NULL && oc->assert_depth >= cb->assert_depth;
oc = oc->next)
@@ -6252,6 +6372,11 @@ for (;; pptr++)
cb->assert_depth += 1;
goto GROUP_PROCESS;
+ case META_LOOKAHEAD_NA:
+ bravalue = OP_ASSERT_NA;
+ cb->assert_depth += 1;
+ goto GROUP_PROCESS;
+
/* Optimize (?!) to (*FAIL) unless it is quantified - which is a weird
thing to do, but Perl allows all assertions to be quantified, and when
they contain capturing parentheses there may be a potential use for
@@ -6283,6 +6408,11 @@ for (;; pptr++)
cb->assert_depth += 1;
goto GROUP_PROCESS;
+ case META_LOOKBEHIND_NA:
+ bravalue = OP_ASSERTBACK_NA;
+ cb->assert_depth += 1;
+ goto GROUP_PROCESS;
+
case META_ATOMIC:
bravalue = OP_ONCE;
goto GROUP_PROCESS_NOTE_EMPTY;
@@ -6341,7 +6471,7 @@ for (;; pptr++)
/* If we've just compiled an assertion, pop the assert depth. */
- if (bravalue >= OP_ASSERT && bravalue <= OP_ASSERTBACK_NOT)
+ if (bravalue >= OP_ASSERT && bravalue <= OP_ASSERTBACK_NA)
cb->assert_depth -= 1;
/* At the end of compiling, code is still pointing to the start of the
@@ -6491,8 +6621,8 @@ for (;; pptr++)
we must only take the reqcu when the group also set a firstcu. Otherwise,
in that example, 'X' ends up set for both. */
- else if (bravalue == OP_ASSERT && subreqcuflags >= 0 &&
- subfirstcuflags >= 0)
+ else if ((bravalue == OP_ASSERT || bravalue == OP_ASSERT_NA) &&
+ subreqcuflags >= 0 && subfirstcuflags >= 0)
{
reqcu = subreqcu;
reqcuflags = subreqcuflags;
@@ -6713,10 +6843,6 @@ for (;; pptr++)
reqvary = (repeat_min == repeat_max)? 0 : REQ_VARY;
op_type = 0;
- /* If the repeat is {1} we can ignore it. */
-
- if (repeat_max == 1 && repeat_min == 1) goto END_REPEAT;
-
/* Adjust first and required code units for a zero repeat. */
if (repeat_min == 0)
@@ -6759,7 +6885,10 @@ for (;; pptr++)
tempcode = previous;
op_previous = *previous;
- /* Now handle repetition for the different types of item. */
+ /* Now handle repetition for the different types of item. If the repeat
+ minimum and the repeat maximum are both 1, we can ignore the quantifier for
+ non-parenthesized items, as they have only one alternative. For anything in
+ parentheses, we must not ignore if {1} is possessive. */
switch (op_previous)
{
@@ -6773,6 +6902,7 @@ for (;; pptr++)
case OP_CHARI:
case OP_NOT:
case OP_NOTI:
+ if (repeat_max == 1 && repeat_min == 1) goto END_REPEAT;
op_type = chartypeoffset[op_previous - OP_CHAR];
/* Deal with UTF characters that take up more than one code unit. */
@@ -6819,6 +6949,7 @@ for (;; pptr++)
code = previous;
goto END_REPEAT;
}
+ if (repeat_max == 1 && repeat_min == 1) goto END_REPEAT;
if (repeat_min == 0 && repeat_max == REPEAT_UNLIMITED)
*code++ = OP_CRSTAR + repeat_type;
@@ -6853,6 +6984,8 @@ for (;; pptr++)
repetition. */
case OP_RECURSE:
+ if (repeat_max == 1 && repeat_min == 1 && !possessive_quantifier)
+ goto END_REPEAT;
/* Generate unwrapped repeats for a non-zero minimum, except when the
minimum is 1 and the maximum unlimited, because that can be handled with
@@ -6923,8 +7056,10 @@ for (;; pptr++)
case OP_ASSERT:
case OP_ASSERT_NOT:
+ case OP_ASSERT_NA:
case OP_ASSERTBACK:
case OP_ASSERTBACK_NOT:
+ case OP_ASSERTBACK_NA:
case OP_ONCE:
case OP_SCRIPT_RUN:
case OP_BRA:
@@ -6935,6 +7070,9 @@ for (;; pptr++)
PCRE2_UCHAR *bralink = NULL;
PCRE2_UCHAR *brazeroptr = NULL;
+ if (repeat_max == 1 && repeat_min == 1 && !possessive_quantifier)
+ goto END_REPEAT;
+
/* Repeating a DEFINE group (or any group where the condition is always
FALSE and there is only one branch) is pointless, but Perl allows the
syntax, so we just ignore the repeat. */
@@ -7151,11 +7289,12 @@ for (;; pptr++)
and SCRIPT_RUN groups at runtime, but in a different way.]
Then, if the quantifier was possessive and the bracket is not a
- conditional, we convert the BRA code to the POS form, and the KET code to
- KETRPOS. (It turns out to be convenient at runtime to detect this kind of
- subpattern at both the start and at the end.) The use of special opcodes
- makes it possible to reduce greatly the stack usage in pcre2_match(). If
- the group is preceded by OP_BRAZERO, convert this to OP_BRAPOSZERO.
+ conditional, we convert the BRA code to the POS form, and the KET code
+ to KETRPOS. (It turns out to be convenient at runtime to detect this
+ kind of subpattern at both the start and at the end.) The use of
+ special opcodes makes it possible to reduce greatly the stack usage in
+ pcre2_match(). If the group is preceded by OP_BRAZERO, convert this to
+ OP_BRAPOSZERO.
Then, if the minimum number of matches is 1 or 0, cancel the possessive
flag so that the default action below, of wrapping everything inside
@@ -7256,6 +7395,8 @@ for (;; pptr++)
int prop_type, prop_value;
PCRE2_UCHAR *oldcode;
+ if (repeat_max == 1 && repeat_min == 1) goto END_REPEAT;
+
op_type = OP_TYPESTAR - OP_STAR; /* Use type opcodes */
mclength = 0; /* Not a character */
@@ -7718,9 +7859,15 @@ for (;; pptr++)
}
#endif
- /* Caseful matches, or not one of the multicase characters. Get the
- character's code units into mcbuffer, with the length in mclength. When not
- in UTF mode, the length is always 1. */
+ /* Caseful matches, or caseless and not one of the multicase characters. We
+ come here by goto in the case of a positive class that contains only
+ case-partners of a character with just two cases; matched_char has already
+ been set TRUE and options fudged if necessary. */
+
+ CLASS_CASELESS_CHAR:
+
+ /* Get the character's code units into mcbuffer, with the length in
+ mclength. When not in UTF mode, the length is always 1. */
#ifdef SUPPORT_UNICODE
if (utf) mclength = PRIV(ord2utf)(meta, mcbuffer); else
@@ -7752,8 +7899,9 @@ for (;; pptr++)
zeroreqcu = reqcu;
zeroreqcuflags = reqcuflags;
- /* If the character is more than one code unit long, we can set firstcu
- only if it is not to be matched caselessly. */
+ /* If the character is more than one code unit long, we can set a single
+ firstcu only if it is not to be matched caselessly. Multiple possible
+ starting code units may be picked up later in the studying code. */
if (mclength == 1 || req_caseopt == 0)
{
@@ -7783,7 +7931,17 @@ for (;; pptr++)
reqcuflags = req_caseopt | cb->req_varyopt;
}
}
- break; /* End default meta handling */
+
+ /* If caselessness was temporarily instated, reset it. */
+
+ if (reset_caseful)
+ {
+ options &= ~PCRE2_CASELESS;
+ req_caseopt = 0;
+ reset_caseful = FALSE;
+ }
+
+ break; /* End literal character handling */
} /* End of big switch */
} /* End of big loop */
@@ -7874,7 +8032,10 @@ length = 2 + 2*LINK_SIZE + skipunits;
/* Remember if this is a lookbehind assertion, and if it is, save its length
and skip over the pattern offset. */
-lookbehind = *code == OP_ASSERTBACK || *code == OP_ASSERTBACK_NOT;
+lookbehind = *code == OP_ASSERTBACK ||
+ *code == OP_ASSERTBACK_NOT ||
+ *code == OP_ASSERTBACK_NA;
+
if (lookbehind)
{
lookbehindlength = META_DATA(pptr[-1]);
@@ -7948,7 +8109,7 @@ for (;;)
/* If this is not the first branch, the first char and reqcu have to
match the values from all the previous branches, except that if the
previous value for reqcu didn't have REQ_VARY set, it can still match,
- and we set REQ_VARY for the regex. */
+ and we set REQ_VARY for the group from this branch's value. */
else
{
@@ -7987,7 +8148,7 @@ for (;;)
else
{
reqcu = branchreqcu;
- reqcuflags |= branchreqcuflags; /* To "or" REQ_VARY */
+ reqcuflags |= branchreqcuflags; /* To "or" REQ_VARY if present */
}
}
}
@@ -8167,7 +8328,7 @@ do {
/* Positive forward assertion */
- else if (op == OP_ASSERT)
+ else if (op == OP_ASSERT || op == OP_ASSERT_NA)
{
if (!is_anchored(scode, bracket_map, cb, atomcount, TRUE)) return FALSE;
}
@@ -8305,7 +8466,7 @@ do {
/* Positive forward assertions */
- else if (op == OP_ASSERT)
+ else if (op == OP_ASSERT || op == OP_ASSERT_NA)
{
if (!is_startline(scode, bracket_map, cb, atomcount, TRUE))
return FALSE;
@@ -8547,9 +8708,11 @@ do {
case OP_CBRAPOS:
case OP_SCBRAPOS:
case OP_ASSERT:
+ case OP_ASSERT_NA:
case OP_ONCE:
case OP_SCRIPT_RUN:
- d = find_firstassertedcu(scode, &dflags, inassert + ((op==OP_ASSERT)?1:0));
+ d = find_firstassertedcu(scode, &dflags, inassert +
+ ((op == OP_ASSERT || op == OP_ASSERT_NA)?1:0));
if (dflags < 0)
return 0;
if (cflags < 0) { c = d; cflags = dflags; }
@@ -8578,6 +8741,19 @@ do {
case OP_MINPLUSI:
case OP_POSPLUSI:
if (inassert == 0) return 0;
+
+ /* If the character is more than one code unit long, we cannot set its
+ first code unit when matching caselessly. Later scanning may pick up
+ multiple code units. */
+
+#ifdef SUPPORT_UNICODE
+#if PCRE2_CODE_UNIT_WIDTH == 8
+ if (scode[1] >= 0x80) return 0;
+#elif PCRE2_CODE_UNIT_WIDTH == 16
+ if (scode[1] >= 0xd800 && scode[1] <= 0xdfff) return 0;
+#endif
+#endif
+
if (cflags < 0) { c = scode[1]; cflags = REQ_CASELESS; }
else if (c != scode[1]) return 0;
break;
@@ -8745,8 +8921,10 @@ for (;; pptr++)
case META_COND_VERSION:
case META_LOOKAHEAD:
case META_LOOKAHEADNOT:
+ case META_LOOKAHEAD_NA:
case META_LOOKBEHIND:
case META_LOOKBEHINDNOT:
+ case META_LOOKBEHIND_NA:
case META_NOCAPTURE:
case META_SCRIPT_RUN:
nestlevel++;
@@ -8798,7 +8976,7 @@ Returns: the group length or a negative number
static int
get_grouplength(uint32_t **pptrptr, BOOL isinline, int *errcodeptr, int *lcptr,
- int group, parsed_recurse_check *recurses, compile_block *cb)
+ int group, parsed_recurse_check *recurses, compile_block *cb)
{
int branchlength;
int grouplength = -1;
@@ -8847,8 +9025,7 @@ return -1;
*************************************************/
/* Return a fixed length for a branch in a lookbehind, giving an error if the
-length is not fixed. If any lookbehinds are encountered on the way, they get
-their length set. On entry, *pptrptr points to the first element inside the
+length is not fixed. On entry, *pptrptr points to the first element inside the
branch. On exit it is set to point to the ALT or KET.
Arguments:
@@ -8978,15 +9155,16 @@ for (;; pptr++)
}
break;
- /* Lookaheads can be ignored, but we must start the skip inside the group
- so that it isn't treated as a group within the branch. */
+ /* Lookaheads do not contribute to the length of this branch, but they may
+ contain lookbehinds within them whose lengths need to be set. */
case META_LOOKAHEAD:
case META_LOOKAHEADNOT:
- pptr = parsed_skip(pptr + 1, PSKIP_KET);
- if (pptr == NULL) goto PARSED_SKIP_FAILED;
+ case META_LOOKAHEAD_NA:
+ *errcodeptr = check_lookbehinds(pptr + 1, &pptr, recurses, cb);
+ if (*errcodeptr != 0) return -1;
- /* Also ignore any qualifiers that follow a lookahead assertion. */
+ /* Ignore any qualifiers that follow a lookahead assertion. */
switch (pptr[1])
{
@@ -9013,10 +9191,12 @@ for (;; pptr++)
}
break;
- /* Lookbehinds can be ignored, but must themselves be checked. */
+ /* A nested lookbehind does not contribute any length to this lookbehind,
+ but must itself be checked and have its lengths set. */
case META_LOOKBEHIND:
case META_LOOKBEHINDNOT:
+ case META_LOOKBEHIND_NA:
if (!set_lookbehind_lengths(&pptr, errcodeptr, lcptr, recurses, cb))
return -1;
break;
@@ -9178,8 +9358,26 @@ for (;; pptr++)
case META_MINMAX_QUERY:
if (pptr[1] == pptr[2])
{
- if (pptr[1] == 0) branchlength -= lastitemlength;
- else itemlength = (pptr[1] - 1) * lastitemlength;
+ switch(pptr[1])
+ {
+ case 0:
+ branchlength -= lastitemlength;
+ break;
+
+ case 1:
+ itemlength = 0;
+ break;
+
+ default: /* Check for integer overflow */
+ if (lastitemlength != 0 && /* Should not occur, but just in case */
+ INT_MAX/lastitemlength < pptr[1] - 1)
+ {
+ *errcodeptr = ERR87; /* Integer overflow; lookbehind too big */
+ return -1;
+ }
+ itemlength = (pptr[1] - 1) * lastitemlength;
+ break;
+ }
pptr += 2;
break;
}
@@ -9193,24 +9391,23 @@ for (;; pptr++)
return -1;
}
- /* Add the item length to the branchlength, and save it for use if the next
- thing is a quantifier. */
-
- branchlength += itemlength;
- lastitemlength = itemlength;
-
- /* Ensure that the length does not overflow the limit. */
+ /* Add the item length to the branchlength, checking for integer overflow and
+ for the branch length exceeding the limit. */
- if (branchlength > LOOKBEHIND_MAX)
+ if (INT_MAX - branchlength < (int)itemlength ||
+ (branchlength += itemlength) > LOOKBEHIND_MAX)
{
*errcodeptr = ERR87;
return -1;
}
+
+ /* Save this item length for use if the next item is a quantifier. */
+
+ lastitemlength = itemlength;
}
EXIT:
*pptrptr = pptr;
-if (branchlength > cb->max_lookbehind) cb->max_lookbehind = branchlength;
return branchlength;
PARSED_SKIP_FAILED:
@@ -9229,6 +9426,11 @@ branches. An error occurs if any branch does not have a fixed length that is
less than the maximum (65535). On exit, the pointer must be left on the final
ket.
+The function also maintains the max_lookbehind value. Any lookbehind branch
+that contains a nested lookbehind may actually look further back than the
+length of the branch. The additional amount is passed back from
+get_branchlength() as an "extra" value.
+
Arguments:
pptrptr pointer to pointer in the parsed pattern
errcodeptr pointer to error code
@@ -9262,6 +9464,7 @@ do
if (cb->erroroffset == PCRE2_UNSET) cb->erroroffset = offset;
return FALSE;
}
+ if (branchlength > cb->max_lookbehind) cb->max_lookbehind = branchlength;
*bptr |= branchlength; /* branchlength never more than 65535 */
bptr = *pptrptr;
}
@@ -9282,20 +9485,30 @@ set_lookbehind_lengths() for each one. At the start, the errorcode is zero and
the error offset is marked unset. The enables the functions above not to
override settings from deeper nestings.
-Arguments cb points to the compile block
-Returns: 0 on success, or an errorcode (cb->erroroffset will be set)
+This function is called recursively from get_branchlength() for lookaheads in
+order to process any lookbehinds that they may contain. It stops when it hits a
+non-nested closing parenthesis in this case, returning a pointer to it.
+
+Arguments
+ pptr points to where to start (start of pattern or start of lookahead)
+ retptr if not NULL, return the ket pointer here
+ recurses chain of recurse_check to catch mutual recursion
+ cb points to the compile block
+
+Returns: 0 on success, or an errorcode (cb->erroroffset will be set)
*/
static int
-check_lookbehinds(compile_block *cb)
+check_lookbehinds(uint32_t *pptr, uint32_t **retptr,
+ parsed_recurse_check *recurses, compile_block *cb)
{
-uint32_t *pptr;
int errorcode = 0;
int loopcount = 0;
+int nestlevel = 0;
cb->erroroffset = PCRE2_UNSET;
-for (pptr = cb->parsed_pattern; *pptr != META_END; pptr++)
+for (; *pptr != META_END; pptr++)
{
if (*pptr < META_END) continue; /* Literal */
@@ -9309,14 +9522,31 @@ for (pptr = cb->parsed_pattern; *pptr != META_END; pptr++)
pptr += 1;
break;
+ case META_KET:
+ if (--nestlevel < 0)
+ {
+ if (retptr != NULL) *retptr = pptr;
+ return 0;
+ }
+ break;
+
+ case META_ATOMIC:
+ case META_CAPTURE:
+ case META_COND_ASSERT:
+ case META_LOOKAHEAD:
+ case META_LOOKAHEADNOT:
+ case META_LOOKAHEAD_NA:
+ case META_NOCAPTURE:
+ case META_SCRIPT_RUN:
+ nestlevel++;
+ break;
+
case META_ACCEPT:
case META_ALT:
case META_ASTERISK:
case META_ASTERISK_PLUS:
case META_ASTERISK_QUERY:
- case META_ATOMIC:
case META_BACKREF:
- case META_CAPTURE:
case META_CIRCUMFLEX:
case META_CLASS:
case META_CLASS_EMPTY:
@@ -9324,14 +9554,9 @@ for (pptr = cb->parsed_pattern; *pptr != META_END; pptr++)
case META_CLASS_END:
case META_CLASS_NOT:
case META_COMMIT:
- case META_COND_ASSERT:
case META_DOLLAR:
case META_DOT:
case META_FAIL:
- case META_KET:
- case META_LOOKAHEAD:
- case META_LOOKAHEADNOT:
- case META_NOCAPTURE:
case META_PLUS:
case META_PLUS_PLUS:
case META_PLUS_QUERY:
@@ -9341,7 +9566,6 @@ for (pptr = cb->parsed_pattern; *pptr != META_END; pptr++)
case META_QUERY_QUERY:
case META_RANGE_ESCAPED:
case META_RANGE_LITERAL:
- case META_SCRIPT_RUN:
case META_SKIP:
case META_THEN:
break;
@@ -9351,13 +9575,22 @@ for (pptr = cb->parsed_pattern; *pptr != META_END; pptr++)
break;
case META_BACKREF_BYNAME:
+ case META_RECURSE_BYNAME:
+ pptr += 1 + SIZEOFFSET;
+ break;
+
case META_COND_DEFINE:
case META_COND_NAME:
case META_COND_NUMBER:
case META_COND_RNAME:
case META_COND_RNUMBER:
- case META_RECURSE_BYNAME:
pptr += 1 + SIZEOFFSET;
+ nestlevel++;
+ break;
+
+ case META_COND_VERSION:
+ pptr += 3;
+ nestlevel++;
break;
case META_CALLOUT_STRING:
@@ -9378,7 +9611,6 @@ for (pptr = cb->parsed_pattern; *pptr != META_END; pptr++)
break;
case META_CALLOUT_NUMBER:
- case META_COND_VERSION:
pptr += 3;
break;
@@ -9392,7 +9624,8 @@ for (pptr = cb->parsed_pattern; *pptr != META_END; pptr++)
case META_LOOKBEHIND:
case META_LOOKBEHINDNOT:
- if (!set_lookbehind_lengths(&pptr, &errorcode, &loopcount, NULL, cb))
+ case META_LOOKBEHIND_NA:
+ if (!set_lookbehind_lengths(&pptr, &errorcode, &loopcount, recurses, cb))
return errorcode;
break;
}
@@ -9494,6 +9727,10 @@ if (pattern == NULL)
if (ccontext == NULL)
ccontext = (pcre2_compile_context *)(&PRIV(default_compile_context));
+/* PCRE2_MATCH_INVALID_UTF implies UTF */
+
+if ((options & PCRE2_MATCH_INVALID_UTF) != 0) options |= PCRE2_UTF;
+
/* Check that all undefined public option bits are zero. */
if ((options & ~PUBLIC_COMPILE_OPTIONS) != 0 ||
@@ -9672,7 +9909,7 @@ if ((options & PCRE2_LITERAL) == 0)
ptr += skipatstart;
-/* Can't support UTF or UCP unless PCRE2 has been compiled with UTF support. */
+/* Can't support UTF or UCP if PCRE2 was built without Unicode support. */
#ifndef SUPPORT_UNICODE
if ((cb.external_options & (PCRE2_UTF|PCRE2_UCP)) != 0)
@@ -9842,7 +10079,7 @@ lengths. */
if (has_lookbehind)
{
- errorcode = check_lookbehinds(&cb);
+ errorcode = check_lookbehinds(cb.parsed_pattern, NULL, NULL, &cb);
if (errorcode != 0) goto HAD_CB_ERROR;
}
@@ -9990,8 +10227,9 @@ re->max_lookbehind = cb.max_lookbehind;
if (cb.had_accept)
{
- reqcu = 0; /* Must disable after (*ACCEPT) */
+ reqcu = 0; /* Must disable after (*ACCEPT) */
reqcuflags = REQ_NONE;
+ re->flags |= PCRE2_HASACCEPT; /* Disables minimum length */
}
/* Fill in the final opcode and check for disastrous overflow. If no overflow,
@@ -10112,6 +10350,8 @@ unit. */
if ((re->overall_options & PCRE2_NO_START_OPTIMIZE) == 0)
{
+ int minminlength = 0; /* For minimal minlength from first/required CU */
+
/* If we do not have a first code unit, see if there is one that is asserted
(these are not saved during the compile because they can cause conflicts with
actual literals that follow). */
@@ -10119,12 +10359,14 @@ if ((re->overall_options & PCRE2_NO_START_OPTIMIZE) == 0)
if (firstcuflags < 0)
firstcu = find_firstassertedcu(codestart, &firstcuflags, 0);
- /* Save the data for a first code unit. */
+ /* Save the data for a first code unit. The existence of one means the
+ minimum length must be at least 1. */
if (firstcuflags >= 0)
{
re->first_codeunit = firstcu;
re->flags |= PCRE2_FIRSTSET;
+ minminlength++;
/* Handle caseless first code units. */
@@ -10158,39 +10400,72 @@ if ((re->overall_options & PCRE2_NO_START_OPTIMIZE) == 0)
is_startline(codestart, 0, &cb, 0, FALSE))
re->flags |= PCRE2_STARTLINE;
- /* Handle the "required code unit", if one is set. In the case of an anchored
- pattern, do this only if it follows a variable length item in the pattern. */
+ /* Handle the "required code unit", if one is set. In the UTF case we can
+ increment the minimum minimum length only if we are sure this really is a
+ different character and not a non-starting code unit of the first character,
+ because the minimum length count is in characters, not code units. */
- if (reqcuflags >= 0 &&
- ((re->overall_options & PCRE2_ANCHORED) == 0 ||
- (reqcuflags & REQ_VARY) != 0))
+ if (reqcuflags >= 0)
{
- re->last_codeunit = reqcu;
- re->flags |= PCRE2_LASTSET;
+#if PCRE2_CODE_UNIT_WIDTH == 16
+ if ((re->overall_options & PCRE2_UTF) == 0 || /* Not UTF */
+ firstcuflags < 0 || /* First not set */
+ (firstcu & 0xf800) != 0xd800 || /* First not surrogate */
+ (reqcu & 0xfc00) != 0xdc00) /* Req not low surrogate */
+#elif PCRE2_CODE_UNIT_WIDTH == 8
+ if ((re->overall_options & PCRE2_UTF) == 0 || /* Not UTF */
+ firstcuflags < 0 || /* First not set */
+ (firstcu & 0x80) == 0 || /* First is ASCII */
+ (reqcu & 0x80) == 0) /* Req is ASCII */
+#endif
+ {
+ minminlength++;
+ }
- /* Handle caseless required code units as for first code units (above). */
+ /* In the case of an anchored pattern, set up the value only if it follows
+ a variable length item in the pattern. */
- if ((reqcuflags & REQ_CASELESS) != 0)
+ if ((re->overall_options & PCRE2_ANCHORED) == 0 ||
+ (reqcuflags & REQ_VARY) != 0)
{
- if (reqcu < 128 || (!utf && reqcu < 255))
+ re->last_codeunit = reqcu;
+ re->flags |= PCRE2_LASTSET;
+
+ /* Handle caseless required code units as for first code units (above). */
+
+ if ((reqcuflags & REQ_CASELESS) != 0)
{
- if (cb.fcc[reqcu] != reqcu) re->flags |= PCRE2_LASTCASELESS;
- }
+ if (reqcu < 128 || (!utf && reqcu < 255))
+ {
+ if (cb.fcc[reqcu] != reqcu) re->flags |= PCRE2_LASTCASELESS;
+ }
#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 8
- else if (reqcu <= MAX_UTF_CODE_POINT && UCD_OTHERCASE(reqcu) != reqcu)
- re->flags |= PCRE2_LASTCASELESS;
+ else if (reqcu <= MAX_UTF_CODE_POINT && UCD_OTHERCASE(reqcu) != reqcu)
+ re->flags |= PCRE2_LASTCASELESS;
#endif
+ }
}
}
- /* Finally, study the compiled pattern to set up information such as a bitmap
- of starting code units and a minimum matching length. */
+ /* Study the compiled pattern to set up information such as a bitmap of
+ starting code units and a minimum matching length. */
if (PRIV(study)(re) != 0)
{
errorcode = ERR31;
goto HAD_CB_ERROR;
}
+
+ /* If study() set a bitmap of starting code units, it implies a minimum
+ length of at least one. */
+
+ if ((re->flags & PCRE2_FIRSTMAPSET) != 0 && minminlength == 0)
+ minminlength = 1;
+
+ /* If the minimum length set (or not set) by study() is less than the minimum
+ implied by required code units, override it. */
+
+ if (re->minlength < minminlength) re->minlength = minminlength;
} /* End of start-of-match optimizations. */
/* Control ends up here in all cases. When running under valgrind, make a
diff --git a/thirdparty/pcre2/src/pcre2_context.c b/thirdparty/pcre2/src/pcre2_context.c
index 9c2886a6d0..f904a494a0 100644
--- a/thirdparty/pcre2/src/pcre2_context.c
+++ b/thirdparty/pcre2/src/pcre2_context.c
@@ -323,7 +323,7 @@ data. */
PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
pcre2_set_character_tables(pcre2_compile_context *ccontext,
- const unsigned char *tables)
+ const uint8_t *tables)
{
ccontext->tables = tables;
return 0;
diff --git a/thirdparty/pcre2/src/pcre2_dfa_match.c b/thirdparty/pcre2/src/pcre2_dfa_match.c
index bbf3e21064..7d8ffe8a3e 100644
--- a/thirdparty/pcre2/src/pcre2_dfa_match.c
+++ b/thirdparty/pcre2/src/pcre2_dfa_match.c
@@ -173,6 +173,8 @@ static const uint8_t coptable[] = {
0, /* Assert not */
0, /* Assert behind */
0, /* Assert behind not */
+ 0, /* NA assert */
+ 0, /* NA assert behind */
0, /* ONCE */
0, /* SCRIPT_RUN */
0, 0, 0, 0, 0, /* BRA, BRAPOS, CBRA, CBRAPOS, COND */
@@ -248,6 +250,8 @@ static const uint8_t poptable[] = {
0, /* Assert not */
0, /* Assert behind */
0, /* Assert behind not */
+ 0, /* NA assert */
+ 0, /* NA assert behind */
0, /* ONCE */
0, /* SCRIPT_RUN */
0, 0, 0, 0, 0, /* BRA, BRAPOS, CBRA, CBRAPOS, COND */
@@ -962,7 +966,7 @@ for (;;)
if (ptr >= end_subject)
{
if ((mb->moptions & PCRE2_PARTIAL_HARD) != 0)
- could_continue = TRUE;
+ return PCRE2_ERROR_PARTIAL;
else { ADD_ACTIVE(state_offset + 1, 0); }
}
break;
@@ -1011,10 +1015,12 @@ for (;;)
/*-----------------------------------------------------------------*/
case OP_EODN:
- if (clen == 0 && (mb->moptions & PCRE2_PARTIAL_HARD) != 0)
- could_continue = TRUE;
- else if (clen == 0 || (IS_NEWLINE(ptr) && ptr == end_subject - mb->nllen))
- { ADD_ACTIVE(state_offset + 1, 0); }
+ if (clen == 0 || (IS_NEWLINE(ptr) && ptr == end_subject - mb->nllen))
+ {
+ if ((mb->moptions & PCRE2_PARTIAL_HARD) != 0)
+ return PCRE2_ERROR_PARTIAL;
+ ADD_ACTIVE(state_offset + 1, 0);
+ }
break;
/*-----------------------------------------------------------------*/
@@ -3152,8 +3158,8 @@ for (;;)
/* We have finished the processing at the current subject character. If no
new states have been set for the next character, we have found all the
- matches that we are going to find. If we are at the top level and partial
- matching has been requested, check for appropriate conditions.
+ matches that we are going to find. If partial matching has been requested,
+ check for appropriate conditions.
The "forced_ fail" variable counts the number of (*F) encountered for the
character. If it is equal to the original active_count (saved in
@@ -3165,22 +3171,24 @@ for (;;)
if (new_count <= 0)
{
- if (rlevel == 1 && /* Top level, and */
- could_continue && /* Some could go on, and */
+ if (could_continue && /* Some could go on, and */
forced_fail != workspace[1] && /* Not all forced fail & */
( /* either... */
(mb->moptions & PCRE2_PARTIAL_HARD) != 0 /* Hard partial */
|| /* or... */
((mb->moptions & PCRE2_PARTIAL_SOFT) != 0 && /* Soft partial and */
- match_count < 0) /* no matches */
+ match_count < 0) /* no matches */
) && /* And... */
(
- partial_newline || /* Either partial NL */
- ( /* or ... */
- ptr >= end_subject && /* End of subject and */
- ptr > mb->start_used_ptr) /* Inspected non-empty string */
+ partial_newline || /* Either partial NL */
+ ( /* or ... */
+ ptr >= end_subject && /* End of subject and */
+ ( /* either */
+ ptr > mb->start_used_ptr || /* Inspected non-empty string */
+ mb->allowemptypartial /* or pattern has lookbehind */
+ ) /* or could match empty */
)
- )
+ ))
match_count = PCRE2_ERROR_PARTIAL;
break; /* Exit from loop along the subject string */
}
@@ -3246,6 +3254,11 @@ BOOL utf, anchored, startline, firstline;
BOOL has_first_cu = FALSE;
BOOL has_req_cu = FALSE;
+#if PCRE2_CODE_UNIT_WIDTH == 8
+BOOL memchr_not_found_first_cu = FALSE;
+BOOL memchr_not_found_first_cu2 = FALSE;
+#endif
+
PCRE2_UCHAR first_cu = 0;
PCRE2_UCHAR first_cu2 = 0;
PCRE2_UCHAR req_cu = 0;
@@ -3295,6 +3308,11 @@ if ((options & (PCRE2_PARTIAL_HARD|PCRE2_PARTIAL_SOFT)) != 0 &&
((re->overall_options | options) & PCRE2_ENDANCHORED) != 0)
return PCRE2_ERROR_BADOPTION;
+/* Invalid UTF support is not available for DFA matching. */
+
+if ((re->overall_options & PCRE2_MATCH_INVALID_UTF) != 0)
+ return PCRE2_ERROR_DFA_UINVALID_UTF;
+
/* Check that the first field in the block is the magic number. If it is not,
return with PCRE2_ERROR_BADMAGIC. */
@@ -3404,6 +3422,8 @@ mb->tables = re->tables;
mb->start_subject = subject;
mb->end_subject = end_subject;
mb->start_offset = start_offset;
+mb->allowemptypartial = (re->max_lookbehind > 0) ||
+ (re->flags & PCRE2_MATCH_EMPTY) != 0;
mb->moptions = options;
mb->poptions = re->overall_options;
mb->match_call_count = 0;
@@ -3619,7 +3639,10 @@ for (;;)
/* Not anchored. Advance to a unique first code unit if there is one. In
8-bit mode, the use of memchr() gives a big speed up, even though we have
to call it twice in caseless mode, in order to find the earliest occurrence
- of the character in either of its cases. */
+ of the character in either of its cases. If a call to memchr() that
+ searches the rest of the subject fails to find one case, remember that in
+ order not to keep on repeating the search. This can make a huge difference
+ when the strings are very long and only one case is present. */
else
{
@@ -3633,11 +3656,29 @@ for (;;)
(smc = UCHAR21TEST(start_match)) != first_cu &&
smc != first_cu2)
start_match++;
+
#else /* 8-bit code units */
- PCRE2_SPTR pp1 =
- memchr(start_match, first_cu, end_subject-start_match);
- PCRE2_SPTR pp2 =
- memchr(start_match, first_cu2, end_subject-start_match);
+ PCRE2_SPTR pp1 = NULL;
+ PCRE2_SPTR pp2 = NULL;
+ PCRE2_SIZE cu2size = end_subject - start_match;
+
+ if (!memchr_not_found_first_cu)
+ {
+ pp1 = memchr(start_match, first_cu, end_subject - start_match);
+ if (pp1 == NULL) memchr_not_found_first_cu = TRUE;
+ else cu2size = pp1 - start_match;
+ }
+
+ /* If pp1 is not NULL, we have arranged to search only as far as pp1,
+ to see if the other case is earlier, so we can set "not found" only
+ when both searches have returned NULL. */
+
+ if (!memchr_not_found_first_cu2)
+ {
+ pp2 = memchr(start_match, first_cu2, cu2size);
+ memchr_not_found_first_cu2 = (pp2 == NULL && pp1 == NULL);
+ }
+
if (pp1 == NULL)
start_match = (pp2 == NULL)? end_subject : pp2;
else
@@ -3653,7 +3694,7 @@ for (;;)
while (start_match < end_subject && UCHAR21TEST(start_match) !=
first_cu)
start_match++;
-#else
+#else /* 8-bit code units */
start_match = memchr(start_match, first_cu, end_subject - start_match);
if (start_match == NULL) start_match = end_subject;
#endif
@@ -3740,6 +3781,8 @@ for (;;)
if ((mb->moptions & (PCRE2_PARTIAL_HARD|PCRE2_PARTIAL_SOFT)) == 0)
{
+ PCRE2_SPTR p;
+
/* The minimum matching length is a lower bound; no actual string of that
length may actually match the pattern. Although the value is, strictly,
in characters, we treat it as code units to avoid spending too much time
@@ -3753,37 +3796,63 @@ for (;;)
point. This optimization can save a huge amount of backtracking in
patterns with nested unlimited repeats that aren't going to match.
Writing separate code for cased/caseless versions makes it go faster, as
- does using an autoincrement and backing off on a match.
+ does using an autoincrement and backing off on a match. As in the case of
+ the first code unit, using memchr() in the 8-bit library gives a big
+ speed up. Unlike the first_cu check above, we do not need to call
+ memchr() twice in the caseless case because we only need to check for the
+ presence of the character in either case, not find the first occurrence.
+
+ The search can be skipped if the code unit was found later than the
+ current starting point in a previous iteration of the bumpalong loop.
HOWEVER: when the subject string is very, very long, searching to its end
can take a long time, and give bad performance on quite ordinary
patterns. This showed up when somebody was matching something like
/^\d+C/ on a 32-megabyte string... so we don't do this when the string is
- sufficiently long. */
+ sufficiently long, but it's worth searching a lot more for unanchored
+ patterns. */
- if (has_req_cu && end_subject - start_match < REQ_CU_MAX)
+ p = start_match + (has_first_cu? 1:0);
+ if (has_req_cu && p > req_cu_ptr)
{
- PCRE2_SPTR p = start_match + (has_first_cu? 1:0);
-
- /* We don't need to repeat the search if we haven't yet reached the
- place we found it at last time. */
+ PCRE2_SIZE check_length = end_subject - start_match;
- if (p > req_cu_ptr)
+ if (check_length < REQ_CU_MAX ||
+ (!anchored && check_length < REQ_CU_MAX * 1000))
{
- if (req_cu != req_cu2)
+ if (req_cu != req_cu2) /* Caseless */
{
+#if PCRE2_CODE_UNIT_WIDTH != 8
while (p < end_subject)
{
uint32_t pp = UCHAR21INCTEST(p);
if (pp == req_cu || pp == req_cu2) { p--; break; }
}
+#else /* 8-bit code units */
+ PCRE2_SPTR pp = p;
+ p = memchr(pp, req_cu, end_subject - pp);
+ if (p == NULL)
+ {
+ p = memchr(pp, req_cu2, end_subject - pp);
+ if (p == NULL) p = end_subject;
+ }
+#endif /* PCRE2_CODE_UNIT_WIDTH != 8 */
}
+
+ /* The caseful case */
+
else
{
+#if PCRE2_CODE_UNIT_WIDTH != 8
while (p < end_subject)
{
if (UCHAR21INCTEST(p) == req_cu) { p--; break; }
}
+
+#else /* 8-bit code units */
+ p = memchr(p, req_cu, end_subject - p);
+ if (p == NULL) p = end_subject;
+#endif
}
/* If we can't find the required code unit, break the matching loop,
diff --git a/thirdparty/pcre2/src/pcre2_error.c b/thirdparty/pcre2/src/pcre2_error.c
index 1d02cf14a3..c61648cb7f 100644
--- a/thirdparty/pcre2/src/pcre2_error.c
+++ b/thirdparty/pcre2/src/pcre2_error.c
@@ -184,6 +184,8 @@ static const unsigned char compile_error_texts[] =
/* 95 */
"(*alpha_assertion) not recognized\0"
"script runs require Unicode support, which this version of PCRE2 does not have\0"
+ "too many capturing groups (maximum 65535)\0"
+ "atomic assertion expected after (?( or (?(?C)\0"
;
/* Match-time and UTF error texts are in the same format. */
@@ -268,6 +270,7 @@ static const unsigned char match_error_texts[] =
"invalid syntax\0"
/* 65 */
"internal error - duplicate substitution match\0"
+ "PCRE2_MATCH_INVALID_UTF is not supported for DFA matching\0"
;
diff --git a/thirdparty/pcre2/src/pcre2_internal.h b/thirdparty/pcre2/src/pcre2_internal.h
index 814d91bddb..fe8ffe5c80 100644
--- a/thirdparty/pcre2/src/pcre2_internal.h
+++ b/thirdparty/pcre2/src/pcre2_internal.h
@@ -517,6 +517,7 @@ bytes in a code unit in that mode. */
#define PCRE2_HASBKPORX 0x00100000 /* contains \P, \p, or \X */
#define PCRE2_DUPCAPUSED 0x00200000 /* contains (?| */
#define PCRE2_HASBKC 0x00400000 /* contains \C */
+#define PCRE2_HASACCEPT 0x00800000 /* contains (*ACCEPT) */
#define PCRE2_MODE_MASK (PCRE2_MODE8 | PCRE2_MODE16 | PCRE2_MODE32)
@@ -535,13 +536,14 @@ enum { PCRE2_MATCHEDBY_INTERPRETER, /* pcre2_match() */
#define MAGIC_NUMBER 0x50435245UL /* 'PCRE' */
/* The maximum remaining length of subject we are prepared to search for a
-req_unit match. In 8-bit mode, memchr() is used and is much faster than the
-search loop that has to be used in 16-bit and 32-bit modes. */
+req_unit match from an anchored pattern. In 8-bit mode, memchr() is used and is
+much faster than the search loop that has to be used in 16-bit and 32-bit
+modes. */
#if PCRE2_CODE_UNIT_WIDTH == 8
-#define REQ_CU_MAX 2000
+#define REQ_CU_MAX 5000
#else
-#define REQ_CU_MAX 1000
+#define REQ_CU_MAX 2000
#endif
/* Offsets for the bitmap tables in the cbits set of tables. Each table
@@ -881,12 +883,16 @@ a positive value. */
#define STRING_atomic0 "atomic\0"
#define STRING_pla0 "pla\0"
#define STRING_plb0 "plb\0"
+#define STRING_napla0 "napla\0"
+#define STRING_naplb0 "naplb\0"
#define STRING_nla0 "nla\0"
#define STRING_nlb0 "nlb\0"
#define STRING_sr0 "sr\0"
#define STRING_asr0 "asr\0"
#define STRING_positive_lookahead0 "positive_lookahead\0"
#define STRING_positive_lookbehind0 "positive_lookbehind\0"
+#define STRING_non_atomic_positive_lookahead0 "non_atomic_positive_lookahead\0"
+#define STRING_non_atomic_positive_lookbehind0 "non_atomic_positive_lookbehind\0"
#define STRING_negative_lookahead0 "negative_lookahead\0"
#define STRING_negative_lookbehind0 "negative_lookbehind\0"
#define STRING_script_run0 "script_run\0"
@@ -1171,12 +1177,16 @@ only. */
#define STRING_atomic0 STR_a STR_t STR_o STR_m STR_i STR_c "\0"
#define STRING_pla0 STR_p STR_l STR_a "\0"
#define STRING_plb0 STR_p STR_l STR_b "\0"
+#define STRING_napla0 STR_n STR_a STR_p STR_l STR_a "\0"
+#define STRING_naplb0 STR_n STR_a STR_p STR_l STR_b "\0"
#define STRING_nla0 STR_n STR_l STR_a "\0"
#define STRING_nlb0 STR_n STR_l STR_b "\0"
#define STRING_sr0 STR_s STR_r "\0"
#define STRING_asr0 STR_a STR_s STR_r "\0"
#define STRING_positive_lookahead0 STR_p STR_o STR_s STR_i STR_t STR_i STR_v STR_e STR_UNDERSCORE STR_l STR_o STR_o STR_k STR_a STR_h STR_e STR_a STR_d "\0"
#define STRING_positive_lookbehind0 STR_p STR_o STR_s STR_i STR_t STR_i STR_v STR_e STR_UNDERSCORE STR_l STR_o STR_o STR_k STR_b STR_e STR_h STR_i STR_n STR_d "\0"
+#define STRING_non_atomic_positive_lookahead0 STR_n STR_o STR_n STR_UNDERSCORE STR_a STR_t STR_o STR_m STR_i STR_c STR_UNDERSCORE STR_p STR_o STR_s STR_i STR_t STR_i STR_v STR_e STR_UNDERSCORE STR_l STR_o STR_o STR_k STR_a STR_h STR_e STR_a STR_d "\0"
+#define STRING_non_atomic_positive_lookbehind0 STR_n STR_o STR_n STR_UNDERSCORE STR_a STR_t STR_o STR_m STR_i STR_c STR_UNDERSCORE STR_p STR_o STR_s STR_i STR_t STR_i STR_v STR_e STR_UNDERSCORE STR_l STR_o STR_o STR_k STR_b STR_e STR_h STR_i STR_n STR_d "\0"
#define STRING_negative_lookahead0 STR_n STR_e STR_g STR_a STR_t STR_i STR_v STR_e STR_UNDERSCORE STR_l STR_o STR_o STR_k STR_a STR_h STR_e STR_a STR_d "\0"
#define STRING_negative_lookbehind0 STR_n STR_e STR_g STR_a STR_t STR_i STR_v STR_e STR_UNDERSCORE STR_l STR_o STR_o STR_k STR_b STR_e STR_h STR_i STR_n STR_d "\0"
#define STRING_script_run0 STR_s STR_c STR_r STR_i STR_p STR_t STR_UNDERSCORE STR_r STR_u STR_n "\0"
@@ -1301,7 +1311,7 @@ enum { ESC_A = 1, ESC_G, ESC_K, ESC_B, ESC_b, ESC_D, ESC_d, ESC_S, ESC_s,
Starting from 1 (i.e. after OP_END), the values up to OP_EOD must correspond in
order to the list of escapes immediately above. Furthermore, values up to
OP_DOLLM must not be changed without adjusting the table called autoposstab in
-pcre2_auto_possess.c
+pcre2_auto_possess.c.
Whenever this list is updated, the two macro definitions that follow must be
updated to match. The possessification table called "opcode_possessify" in
@@ -1499,80 +1509,81 @@ enum {
OP_KETRMIN, /* 123 order. They are for groups the repeat for ever. */
OP_KETRPOS, /* 124 Possessive unlimited repeat. */
- /* The assertions must come before BRA, CBRA, ONCE, and COND, and the four
- asserts must remain in order. */
+ /* The assertions must come before BRA, CBRA, ONCE, and COND. */
OP_REVERSE, /* 125 Move pointer back - used in lookbehind assertions */
OP_ASSERT, /* 126 Positive lookahead */
OP_ASSERT_NOT, /* 127 Negative lookahead */
OP_ASSERTBACK, /* 128 Positive lookbehind */
OP_ASSERTBACK_NOT, /* 129 Negative lookbehind */
+ OP_ASSERT_NA, /* 130 Positive non-atomic lookahead */
+ OP_ASSERTBACK_NA, /* 131 Positive non-atomic lookbehind */
/* ONCE, SCRIPT_RUN, BRA, BRAPOS, CBRA, CBRAPOS, and COND must come
immediately after the assertions, with ONCE first, as there's a test for >=
ONCE for a subpattern that isn't an assertion. The POS versions must
immediately follow the non-POS versions in each case. */
- OP_ONCE, /* 130 Atomic group, contains captures */
- OP_SCRIPT_RUN, /* 131 Non-capture, but check characters' scripts */
- OP_BRA, /* 132 Start of non-capturing bracket */
- OP_BRAPOS, /* 133 Ditto, with unlimited, possessive repeat */
- OP_CBRA, /* 134 Start of capturing bracket */
- OP_CBRAPOS, /* 135 Ditto, with unlimited, possessive repeat */
- OP_COND, /* 136 Conditional group */
+ OP_ONCE, /* 132 Atomic group, contains captures */
+ OP_SCRIPT_RUN, /* 133 Non-capture, but check characters' scripts */
+ OP_BRA, /* 134 Start of non-capturing bracket */
+ OP_BRAPOS, /* 135 Ditto, with unlimited, possessive repeat */
+ OP_CBRA, /* 136 Start of capturing bracket */
+ OP_CBRAPOS, /* 137 Ditto, with unlimited, possessive repeat */
+ OP_COND, /* 138 Conditional group */
/* These five must follow the previous five, in the same order. There's a
check for >= SBRA to distinguish the two sets. */
- OP_SBRA, /* 137 Start of non-capturing bracket, check empty */
- OP_SBRAPOS, /* 138 Ditto, with unlimited, possessive repeat */
- OP_SCBRA, /* 139 Start of capturing bracket, check empty */
- OP_SCBRAPOS, /* 140 Ditto, with unlimited, possessive repeat */
- OP_SCOND, /* 141 Conditional group, check empty */
+ OP_SBRA, /* 139 Start of non-capturing bracket, check empty */
+ OP_SBRAPOS, /* 149 Ditto, with unlimited, possessive repeat */
+ OP_SCBRA, /* 141 Start of capturing bracket, check empty */
+ OP_SCBRAPOS, /* 142 Ditto, with unlimited, possessive repeat */
+ OP_SCOND, /* 143 Conditional group, check empty */
/* The next two pairs must (respectively) be kept together. */
- OP_CREF, /* 142 Used to hold a capture number as condition */
- OP_DNCREF, /* 143 Used to point to duplicate names as a condition */
- OP_RREF, /* 144 Used to hold a recursion number as condition */
- OP_DNRREF, /* 145 Used to point to duplicate names as a condition */
- OP_FALSE, /* 146 Always false (used by DEFINE and VERSION) */
- OP_TRUE, /* 147 Always true (used by VERSION) */
+ OP_CREF, /* 144 Used to hold a capture number as condition */
+ OP_DNCREF, /* 145 Used to point to duplicate names as a condition */
+ OP_RREF, /* 146 Used to hold a recursion number as condition */
+ OP_DNRREF, /* 147 Used to point to duplicate names as a condition */
+ OP_FALSE, /* 148 Always false (used by DEFINE and VERSION) */
+ OP_TRUE, /* 149 Always true (used by VERSION) */
- OP_BRAZERO, /* 148 These two must remain together and in this */
- OP_BRAMINZERO, /* 149 order. */
- OP_BRAPOSZERO, /* 150 */
+ OP_BRAZERO, /* 150 These two must remain together and in this */
+ OP_BRAMINZERO, /* 151 order. */
+ OP_BRAPOSZERO, /* 152 */
/* These are backtracking control verbs */
- OP_MARK, /* 151 always has an argument */
- OP_PRUNE, /* 152 */
- OP_PRUNE_ARG, /* 153 same, but with argument */
- OP_SKIP, /* 154 */
- OP_SKIP_ARG, /* 155 same, but with argument */
- OP_THEN, /* 156 */
- OP_THEN_ARG, /* 157 same, but with argument */
- OP_COMMIT, /* 158 */
- OP_COMMIT_ARG, /* 159 same, but with argument */
+ OP_MARK, /* 153 always has an argument */
+ OP_PRUNE, /* 154 */
+ OP_PRUNE_ARG, /* 155 same, but with argument */
+ OP_SKIP, /* 156 */
+ OP_SKIP_ARG, /* 157 same, but with argument */
+ OP_THEN, /* 158 */
+ OP_THEN_ARG, /* 159 same, but with argument */
+ OP_COMMIT, /* 160 */
+ OP_COMMIT_ARG, /* 161 same, but with argument */
/* These are forced failure and success verbs. FAIL and ACCEPT do accept an
argument, but these cases can be compiled as, for example, (*MARK:X)(*FAIL)
without the need for a special opcode. */
- OP_FAIL, /* 160 */
- OP_ACCEPT, /* 161 */
- OP_ASSERT_ACCEPT, /* 162 Used inside assertions */
- OP_CLOSE, /* 163 Used before OP_ACCEPT to close open captures */
+ OP_FAIL, /* 162 */
+ OP_ACCEPT, /* 163 */
+ OP_ASSERT_ACCEPT, /* 164 Used inside assertions */
+ OP_CLOSE, /* 165 Used before OP_ACCEPT to close open captures */
/* This is used to skip a subpattern with a {0} quantifier */
- OP_SKIPZERO, /* 164 */
+ OP_SKIPZERO, /* 166 */
/* This is used to identify a DEFINE group during compilation so that it can
be checked for having only one branch. It is changed to OP_FALSE before
compilation finishes. */
- OP_DEFINE, /* 165 */
+ OP_DEFINE, /* 167 */
/* This is not an opcode, but is used to check that tables indexed by opcode
are the correct length, in order to catch updating errors - there have been
@@ -1585,7 +1596,7 @@ enum {
/* *** NOTE NOTE NOTE *** Whenever the list above is updated, the two macro
definitions that follow must also be updated to match. There are also tables
called "opcode_possessify" in pcre2_compile.c and "coptable" and "poptable" in
-pcre2_dfa_exec.c that must be updated. */
+pcre2_dfa_match.c that must be updated. */
/* This macro defines textual names for all the opcodes. These are used only
@@ -1618,7 +1629,9 @@ some cases doesn't actually use these names at all). */
"class", "nclass", "xclass", "Ref", "Refi", "DnRef", "DnRefi", \
"Recurse", "Callout", "CalloutStr", \
"Alt", "Ket", "KetRmax", "KetRmin", "KetRpos", \
- "Reverse", "Assert", "Assert not", "AssertB", "AssertB not", \
+ "Reverse", "Assert", "Assert not", \
+ "Assert back", "Assert back not", \
+ "Non-atomic assert", "Non-atomic assert back", \
"Once", \
"Script run", \
"Bra", "BraPos", "CBra", "CBraPos", \
@@ -1703,6 +1716,8 @@ in UTF-8 mode. The code that uses this table must know about such things. */
1+LINK_SIZE, /* Assert not */ \
1+LINK_SIZE, /* Assert behind */ \
1+LINK_SIZE, /* Assert behind not */ \
+ 1+LINK_SIZE, /* NA Assert */ \
+ 1+LINK_SIZE, /* NA Assert behind */ \
1+LINK_SIZE, /* ONCE */ \
1+LINK_SIZE, /* SCRIPT_RUN */ \
1+LINK_SIZE, /* BRA */ \
diff --git a/thirdparty/pcre2/src/pcre2_intmodedep.h b/thirdparty/pcre2/src/pcre2_intmodedep.h
index bf3a235984..ea3b3ec698 100644
--- a/thirdparty/pcre2/src/pcre2_intmodedep.h
+++ b/thirdparty/pcre2/src/pcre2_intmodedep.h
@@ -205,19 +205,19 @@ whether its argument, which is assumed to be one code unit, is less than 256.
The CHMAX_255 macro does not assume one code unit. The maximum length of a MARK
name must fit in one code unit; currently it is set to 255 or 65535. The
TABLE_GET macro is used to access elements of tables containing exactly 256
-items. When code points can be greater than 255, a check is needed before
-accessing these tables. */
+items. Its argument is a code unit. When code points can be greater than 255, a
+check is needed before accessing these tables. */
#if PCRE2_CODE_UNIT_WIDTH == 8
#define MAX_255(c) TRUE
#define MAX_MARK ((1u << 8) - 1)
+#define TABLE_GET(c, table, default) ((table)[c])
#ifdef SUPPORT_UNICODE
#define SUPPORT_WIDE_CHARS
#define CHMAX_255(c) ((c) <= 255u)
#else
#define CHMAX_255(c) TRUE
#endif /* SUPPORT_UNICODE */
-#define TABLE_GET(c, table, default) ((table)[c])
#else /* Code units are 16 or 32 bits */
#define CHMAX_255(c) ((c) <= 255u)
@@ -228,7 +228,6 @@ accessing these tables. */
#endif
-
/* ----------------- Character-handling macros ----------------- */
/* There is a proposed future special "UTF-21" mode, in which only the lowest
@@ -854,6 +853,7 @@ typedef struct match_block {
uint32_t match_call_count; /* Number of times a new frame is created */
BOOL hitend; /* Hit the end of the subject at some point */
BOOL hasthen; /* Pattern contains (*THEN) */
+ BOOL allowemptypartial; /* Allow empty hard partial */
const uint8_t *lcc; /* Points to lower casing table */
const uint8_t *fcc; /* Points to case-flipping table */
const uint8_t *ctypes; /* Points to table of type maps */
@@ -866,6 +866,7 @@ typedef struct match_block {
PCRE2_SPTR name_table; /* Table of group names */
PCRE2_SPTR start_code; /* For use when recursing */
PCRE2_SPTR start_subject; /* Start of the subject string */
+ PCRE2_SPTR check_subject; /* Where UTF-checked from */
PCRE2_SPTR end_subject; /* End of the subject string */
PCRE2_SPTR end_match_ptr; /* Subject position at end match */
PCRE2_SPTR start_used_ptr; /* Earliest consulted character */
@@ -908,6 +909,7 @@ typedef struct dfa_match_block {
uint32_t poptions; /* Pattern options */
uint32_t nltype; /* Newline type */
uint32_t nllen; /* Newline string length */
+ BOOL allowemptypartial; /* Allow empty hard partial */
PCRE2_UCHAR nl[4]; /* Newline string when fixed */
uint16_t bsr_convention; /* \R interpretation */
pcre2_callout_block *cb; /* Points to a callout block */
diff --git a/thirdparty/pcre2/src/pcre2_jit_compile.c b/thirdparty/pcre2/src/pcre2_jit_compile.c
index 1f21bfb6ad..f564127c2a 100644
--- a/thirdparty/pcre2/src/pcre2_jit_compile.c
+++ b/thirdparty/pcre2/src/pcre2_jit_compile.c
@@ -6,8 +6,9 @@
and semantics are as close as possible to those of the Perl 5 language.
Written by Philip Hazel
+ This module by Zoltan Herczeg
Original API code Copyright (c) 1997-2012 University of Cambridge
- New API code Copyright (c) 2016-2018 University of Cambridge
+ New API code Copyright (c) 2016-2019 University of Cambridge
-----------------------------------------------------------------------------
Redistribution and use in source and binary forms, with or without
@@ -212,12 +213,6 @@ typedef struct stub_list {
struct stub_list *next;
} stub_list;
-typedef struct label_addr_list {
- struct sljit_label *label;
- sljit_uw *update_addr;
- struct label_addr_list *next;
-} label_addr_list;
-
enum frame_types {
no_frame = -1,
no_stack = -2
@@ -271,6 +266,8 @@ typedef struct bracket_backtrack {
assert_backtrack *assert;
/* For OP_ONCE. Less than 0 if not needed. */
int framesize;
+ /* For brackets with >3 alternatives. */
+ struct sljit_put_label *matching_put_label;
} u;
/* Points to our private memory word on the stack. */
int private_data_ptr;
@@ -416,6 +413,8 @@ typedef struct compiler_common {
sljit_sw lcc;
/* Mode can be PCRE2_JIT_COMPLETE and others. */
int mode;
+ /* TRUE, when empty match is accepted for partial matching. */
+ BOOL allow_empty_partial;
/* TRUE, when minlength is greater than 0. */
BOOL might_be_empty;
/* \K is found in the pattern. */
@@ -454,7 +453,6 @@ typedef struct compiler_common {
struct sljit_label *accept_label;
struct sljit_label *ff_newline_shortcut;
stub_list *stubs;
- label_addr_list *label_addrs;
recurse_entry *entries;
recurse_entry *currententry;
jump_list *partialmatch;
@@ -563,6 +561,12 @@ typedef struct compare_context {
#define ARGUMENTS SLJIT_S4
#define RETURN_ADDR SLJIT_R4
+#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
+#define HAS_VIRTUAL_REGISTERS 1
+#else
+#define HAS_VIRTUAL_REGISTERS 0
+#endif
+
/* Local space layout. */
/* These two locals can be used by the current opcode. */
#define LOCALS0 (0 * sizeof(sljit_sw))
@@ -696,11 +700,12 @@ the start pointers when the end of the capturing group has not yet reached. */
#define GETCHARBACK_INVALID(c, ptr, start, invalid_action) \
{ \
- if (ptr[-1] <= 0x7f) \
- c = *ptr--; \
+ c = ptr[-1]; \
+ if (c <= 0x7f) \
+ ptr--; \
else if (ptr - 1 > start && ptr[-1] >= 0x80 && ptr[-1] < 0xc0) \
{ \
- c = ptr[-1] - 0x80; \
+ c -= 0x80; \
\
if (ptr[-2] >= 0xc2 && ptr[-2] <= 0xdf) \
{ \
@@ -775,11 +780,12 @@ the start pointers when the end of the capturing group has not yet reached. */
#define GETCHARBACK_INVALID(c, ptr, start, invalid_action) \
{ \
- if (ptr[-1] < 0xd800 || ptr[-1] >= 0xe000) \
- c = *ptr--; \
- else if (ptr[-1] >= 0xdc00 && ptr - 1 > start && ptr[-2] >= 0xd800 && ptr[-2] < 0xdc00) \
+ c = ptr[-1]; \
+ if (c < 0xd800 || c >= 0xe000) \
+ ptr--; \
+ else if (c >= 0xdc00 && ptr - 1 > start && ptr[-2] >= 0xd800 && ptr[-2] < 0xdc00) \
{ \
- c = (((ptr[-2] - 0xd800) << 10) | (ptr[-1] - 0xdc00)) + 0x10000; \
+ c = (((ptr[-2] - 0xd800) << 10) | (c - 0xdc00)) + 0x10000; \
ptr -= 2; \
} \
else \
@@ -793,7 +799,7 @@ the start pointers when the end of the capturing group has not yet reached. */
#define GETCHARINC_INVALID(c, ptr, end, invalid_action) \
{ \
- if (ptr[0] < 0x110000) \
+ if (ptr[0] < 0xd800 || (ptr[0] >= 0xe000 && ptr[0] < 0x110000)) \
c = *ptr++; \
else \
{ \
@@ -801,6 +807,17 @@ the start pointers when the end of the capturing group has not yet reached. */
} \
}
+#define GETCHARBACK_INVALID(c, ptr, start, invalid_action) \
+ { \
+ c = ptr[-1]; \
+ if (ptr[-1] < 0xd800 || (ptr[-1] >= 0xe000 && ptr[-1] < 0x110000)) \
+ ptr--; \
+ else \
+ { \
+ invalid_action; \
+ } \
+ }
+
#endif /* PCRE2_CODE_UNIT_WIDTH == [8|16|32] */
#endif /* SUPPORT_UNICODE */
@@ -1033,8 +1050,8 @@ switch(*cc)
return cc + 1 + 2 + cc[1];
default:
- /* All opcodes are supported now! */
- SLJIT_UNREACHABLE();
+ /* Unsupported opcodes: OP_ASSERT_NA and OP_ASSERTBACK_NA */
+ /* SLJIT_UNREACHABLE(); */
return NULL;
}
}
@@ -2371,14 +2388,14 @@ if (base_reg != TMP2)
else
{
status.saved_tmp_regs[1] = RETURN_ADDR;
- if (sljit_get_register_index(RETURN_ADDR) == -1)
+ if (HAS_VIRTUAL_REGISTERS)
status.tmp_regs[1] = STR_PTR;
else
status.tmp_regs[1] = RETURN_ADDR;
}
status.saved_tmp_regs[2] = TMP3;
-if (sljit_get_register_index(TMP3) == -1)
+if (HAS_VIRTUAL_REGISTERS)
status.tmp_regs[2] = STR_END;
else
status.tmp_regs[2] = TMP3;
@@ -2829,20 +2846,6 @@ while (list_item)
common->stubs = NULL;
}
-static void add_label_addr(compiler_common *common, sljit_uw *update_addr)
-{
-DEFINE_COMPILER;
-label_addr_list *label_addr;
-
-label_addr = sljit_alloc_memory(compiler, sizeof(label_addr_list));
-if (label_addr == NULL)
- return;
-label_addr->label = LABEL();
-label_addr->update_addr = update_addr;
-label_addr->next = common->label_addrs;
-common->label_addrs = label_addr;
-}
-
static SLJIT_INLINE void count_match(compiler_common *common)
{
DEFINE_COMPILER;
@@ -2985,12 +2988,18 @@ else
}
}
-OP1(SLJIT_MOV, STACK_TOP, 0, ARGUMENTS, 0);
+if (!HAS_VIRTUAL_REGISTERS)
+ OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, stack));
+else
+ OP1(SLJIT_MOV, STACK_TOP, 0, ARGUMENTS, 0);
+
if (common->mark_ptr != 0)
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->mark_ptr, SLJIT_IMM, 0);
if (common->control_head_ptr != 0)
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_IMM, 0);
-OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(STACK_TOP), SLJIT_OFFSETOF(jit_arguments, stack));
+if (HAS_VIRTUAL_REGISTERS)
+ OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(STACK_TOP), SLJIT_OFFSETOF(jit_arguments, stack));
+
OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->start_ptr);
OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(STACK_TOP), SLJIT_OFFSETOF(struct sljit_stack, end));
}
@@ -3029,21 +3038,36 @@ BOOL has_pre;
OP1(SLJIT_MOV, SLJIT_S2, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(1));
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(1), STR_PTR, 0);
-OP1(SLJIT_MOV, SLJIT_R0, 0, ARGUMENTS, 0);
-OP1(SLJIT_MOV, SLJIT_S0, 0, SLJIT_MEM1(SLJIT_SP), common->start_ptr);
-if (common->mark_ptr != 0)
- OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_SP), common->mark_ptr);
-OP1(SLJIT_MOV_U32, SLJIT_R1, 0, SLJIT_MEM1(SLJIT_R0), SLJIT_OFFSETOF(jit_arguments, oveccount));
-OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), SLJIT_OFFSETOF(jit_arguments, startchar_ptr), SLJIT_S0, 0);
-if (common->mark_ptr != 0)
- OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), SLJIT_OFFSETOF(jit_arguments, mark_ptr), SLJIT_R2, 0);
-OP2(SLJIT_ADD, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_R0), SLJIT_OFFSETOF(jit_arguments, match_data),
- SLJIT_IMM, SLJIT_OFFSETOF(pcre2_match_data, ovector) - sizeof(PCRE2_SIZE));
+if (HAS_VIRTUAL_REGISTERS)
+ {
+ OP1(SLJIT_MOV, SLJIT_R0, 0, ARGUMENTS, 0);
+ OP1(SLJIT_MOV, SLJIT_S0, 0, SLJIT_MEM1(SLJIT_SP), common->start_ptr);
+ if (common->mark_ptr != 0)
+ OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_SP), common->mark_ptr);
+ OP1(SLJIT_MOV_U32, SLJIT_R1, 0, SLJIT_MEM1(SLJIT_R0), SLJIT_OFFSETOF(jit_arguments, oveccount));
+ OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), SLJIT_OFFSETOF(jit_arguments, startchar_ptr), SLJIT_S0, 0);
+ if (common->mark_ptr != 0)
+ OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), SLJIT_OFFSETOF(jit_arguments, mark_ptr), SLJIT_R2, 0);
+ OP2(SLJIT_ADD, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_R0), SLJIT_OFFSETOF(jit_arguments, match_data),
+ SLJIT_IMM, SLJIT_OFFSETOF(pcre2_match_data, ovector) - sizeof(PCRE2_SIZE));
+ }
+else
+ {
+ OP1(SLJIT_MOV, SLJIT_S0, 0, SLJIT_MEM1(SLJIT_SP), common->start_ptr);
+ OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, match_data));
+ if (common->mark_ptr != 0)
+ OP1(SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_SP), common->mark_ptr);
+ OP1(SLJIT_MOV_U32, SLJIT_R1, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, oveccount));
+ OP1(SLJIT_MOV, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, startchar_ptr), SLJIT_S0, 0);
+ if (common->mark_ptr != 0)
+ OP1(SLJIT_MOV, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, mark_ptr), SLJIT_R0, 0);
+ OP2(SLJIT_ADD, SLJIT_R2, 0, SLJIT_R2, 0, SLJIT_IMM, SLJIT_OFFSETOF(pcre2_match_data, ovector) - sizeof(PCRE2_SIZE));
+ }
has_pre = sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_SUPP | SLJIT_MEM_PRE, SLJIT_S1, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw)) == SLJIT_SUCCESS;
GET_LOCAL_BASE(SLJIT_S0, 0, OVECTOR_START - (has_pre ? sizeof(sljit_sw) : 0));
-OP1(SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_R0), SLJIT_OFFSETOF(jit_arguments, begin));
+OP1(SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM1(HAS_VIRTUAL_REGISTERS ? SLJIT_R0 : ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, begin));
loop = LABEL();
@@ -3105,20 +3129,22 @@ static SLJIT_INLINE void return_with_partial_match(compiler_common *common, stru
{
DEFINE_COMPILER;
sljit_s32 mov_opcode;
+sljit_s32 arguments_reg = !HAS_VIRTUAL_REGISTERS ? ARGUMENTS : SLJIT_R1;
SLJIT_COMPILE_ASSERT(STR_END == SLJIT_S0, str_end_must_be_saved_reg0);
SLJIT_ASSERT(common->start_used_ptr != 0 && common->start_ptr != 0
&& (common->mode == PCRE2_JIT_PARTIAL_SOFT ? common->hit_start != 0 : common->hit_start == 0));
-OP1(SLJIT_MOV, SLJIT_R1, 0, ARGUMENTS, 0);
+if (arguments_reg != ARGUMENTS)
+ OP1(SLJIT_MOV, arguments_reg, 0, ARGUMENTS, 0);
OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_SP),
common->mode == PCRE2_JIT_PARTIAL_SOFT ? common->hit_start : common->start_ptr);
OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, PCRE2_ERROR_PARTIAL);
/* Store match begin and end. */
-OP1(SLJIT_MOV, SLJIT_S1, 0, SLJIT_MEM1(SLJIT_R1), SLJIT_OFFSETOF(jit_arguments, begin));
-OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), SLJIT_OFFSETOF(jit_arguments, startchar_ptr), SLJIT_R2, 0);
-OP1(SLJIT_MOV, SLJIT_R1, 0, SLJIT_MEM1(SLJIT_R1), SLJIT_OFFSETOF(jit_arguments, match_data));
+OP1(SLJIT_MOV, SLJIT_S1, 0, SLJIT_MEM1(arguments_reg), SLJIT_OFFSETOF(jit_arguments, begin));
+OP1(SLJIT_MOV, SLJIT_MEM1(arguments_reg), SLJIT_OFFSETOF(jit_arguments, startchar_ptr), SLJIT_R2, 0);
+OP1(SLJIT_MOV, SLJIT_R1, 0, SLJIT_MEM1(arguments_reg), SLJIT_OFFSETOF(jit_arguments, match_data));
mov_opcode = (sizeof(PCRE2_SIZE) == 4) ? SLJIT_MOV_U32 : SLJIT_MOV;
@@ -3279,7 +3305,7 @@ SLJIT_ASSERT(!force || common->mode != PCRE2_JIT_COMPLETE);
if (common->mode == PCRE2_JIT_COMPLETE)
return;
-if (!force)
+if (!force && !common->allow_empty_partial)
jump = CMP(SLJIT_GREATER_EQUAL, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, STR_PTR, 0);
else if (common->mode == PCRE2_JIT_PARTIAL_SOFT)
jump = CMP(SLJIT_EQUAL, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, SLJIT_IMM, -1);
@@ -3341,7 +3367,11 @@ if (common->mode == PCRE2_JIT_COMPLETE)
/* Partial matching mode. */
jump = CMP(SLJIT_LESS, STR_PTR, 0, STR_END, 0);
-add_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, STR_PTR, 0));
+if (!common->allow_empty_partial)
+ add_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, STR_PTR, 0));
+else if (common->mode == PCRE2_JIT_PARTIAL_SOFT)
+ add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, SLJIT_IMM, -1));
+
if (common->mode == PCRE2_JIT_PARTIAL_SOFT)
{
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->hit_start, SLJIT_IMM, 0);
@@ -3357,6 +3387,35 @@ else
JUMPHERE(jump);
}
+static void process_partial_match(compiler_common *common)
+{
+DEFINE_COMPILER;
+struct sljit_jump *jump;
+
+/* Partial matching mode. */
+if (common->mode == PCRE2_JIT_PARTIAL_SOFT)
+ {
+ jump = CMP(SLJIT_GREATER_EQUAL, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, STR_PTR, 0);
+ OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->hit_start, SLJIT_IMM, 0);
+ JUMPHERE(jump);
+ }
+else if (common->mode == PCRE2_JIT_PARTIAL_HARD)
+ {
+ if (common->partialmatchlabel != NULL)
+ CMPTO(SLJIT_LESS, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, STR_PTR, 0, common->partialmatchlabel);
+ else
+ add_jump(compiler, &common->partialmatch, CMP(SLJIT_LESS, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, STR_PTR, 0));
+ }
+}
+
+static void detect_partial_match_to(compiler_common *common, struct sljit_label *label)
+{
+DEFINE_COMPILER;
+
+CMPTO(SLJIT_LESS, STR_PTR, 0, STR_END, 0, label);
+process_partial_match(common);
+}
+
static void peek_char(compiler_common *common, sljit_u32 max, sljit_s32 dst, sljit_sw dstw, jump_list **backtracks)
{
/* Reads the character into TMP1, keeps STR_PTR.
@@ -3420,12 +3479,21 @@ if (common->utf)
#elif PCRE2_CODE_UNIT_WIDTH == 32
if (common->invalid_utf)
{
+ if (max < 0xd800) return;
+
if (backtracks != NULL)
+ {
+ OP2(SLJIT_SUB, TMP2, 0, TMP1, 0, SLJIT_IMM, 0xd800);
add_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0x110000));
+ add_jump(compiler, backtracks, CMP(SLJIT_LESS, TMP2, 0, SLJIT_IMM, 0xe000 - 0xd800));
+ }
else
{
+ OP2(SLJIT_SUB, TMP2, 0, TMP1, 0, SLJIT_IMM, 0xd800);
OP2(SLJIT_SUB | SLJIT_SET_GREATER_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x110000);
CMOV(SLJIT_GREATER_EQUAL, TMP1, SLJIT_IMM, INVALID_UTF_CHAR);
+ OP2(SLJIT_SUB | SLJIT_SET_LESS, SLJIT_UNUSED, 0, TMP2, 0, SLJIT_IMM, 0xe000 - 0xd800);
+ CMOV(SLJIT_LESS, TMP1, SLJIT_IMM, INVALID_UTF_CHAR);
}
}
#endif /* PCRE2_CODE_UNIT_WIDTH == [8|16|32] */
@@ -3490,8 +3558,12 @@ if (common->utf)
JUMPHERE(jump);
}
#elif PCRE2_CODE_UNIT_WIDTH == 32
- if (common->invalid_utf)
- add_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0x110000));
+if (common->invalid_utf)
+ {
+ OP2(SLJIT_SUB, TMP2, 0, TMP1, 0, SLJIT_IMM, 0xd800);
+ add_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0x110000));
+ add_jump(compiler, backtracks, CMP(SLJIT_LESS, TMP2, 0, SLJIT_IMM, 0xe000 - 0xd800));
+ }
#endif /* PCRE2_CODE_UNIT_WIDTH == [8|16|32] */
#endif /* SUPPORT_UNICODE */
}
@@ -3653,7 +3725,7 @@ if (common->utf)
/* Skip low surrogate if necessary. */
OP2(SLJIT_SUB, TMP2, 0, TMP1, 0, SLJIT_IMM, 0xd800);
- if (sljit_has_cpu_feature(SLJIT_HAS_CMOV) && sljit_get_register_index(RETURN_ADDR) >= 0)
+ if (sljit_has_cpu_feature(SLJIT_HAS_CMOV) && !HAS_VIRTUAL_REGISTERS)
{
if (options & READ_CHAR_UPDATE_STR_PTR)
OP2(SLJIT_ADD, RETURN_ADDR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
@@ -3677,11 +3749,18 @@ if (common->utf)
if (common->invalid_utf)
{
if (backtracks != NULL)
+ {
+ OP2(SLJIT_SUB, TMP2, 0, TMP1, 0, SLJIT_IMM, 0xd800);
add_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0x110000));
+ add_jump(compiler, backtracks, CMP(SLJIT_LESS, TMP2, 0, SLJIT_IMM, 0xe000 - 0xd800));
+ }
else
{
+ OP2(SLJIT_SUB, TMP2, 0, TMP1, 0, SLJIT_IMM, 0xd800);
OP2(SLJIT_SUB | SLJIT_SET_GREATER_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x110000);
CMOV(SLJIT_GREATER_EQUAL, TMP1, SLJIT_IMM, INVALID_UTF_CHAR);
+ OP2(SLJIT_SUB | SLJIT_SET_LESS, SLJIT_UNUSED, 0, TMP2, 0, SLJIT_IMM, 0xe000 - 0xd800);
+ CMOV(SLJIT_LESS, TMP1, SLJIT_IMM, INVALID_UTF_CHAR);
}
}
#endif /* PCRE2_CODE_UNIT_WIDTH == [8|16|32] */
@@ -3832,7 +3911,7 @@ if (common->utf && negated)
{
OP2(SLJIT_SUB, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xd800);
- if (sljit_has_cpu_feature(SLJIT_HAS_CMOV) && sljit_get_register_index(RETURN_ADDR) >= 0)
+ if (sljit_has_cpu_feature(SLJIT_HAS_CMOV) && !HAS_VIRTUAL_REGISTERS)
{
OP2(SLJIT_ADD, RETURN_ADDR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
OP2(SLJIT_SUB | SLJIT_SET_LESS, SLJIT_UNUSED, 0, TMP2, 0, SLJIT_IMM, 0x400);
@@ -3865,9 +3944,9 @@ if (common->utf && negated)
static void move_back(compiler_common *common, jump_list **backtracks, BOOL must_be_valid)
{
-/* Goes one character back. TMP2 must contain the start of
-the subject buffer. Affects STR_PTR and TMP1. Does not modify
-STR_PTR for invalid character sequences. */
+/* Goes one character back. Affects STR_PTR and TMP1. If must_be_valid is TRUE,
+TMP2 is not used. Otherwise TMP2 must contain the start of the subject buffer,
+and it is destroyed. Does not modify STR_PTR for invalid character sequences. */
DEFINE_COMPILER;
SLJIT_UNUSED_ARG(backtracks);
@@ -4407,7 +4486,7 @@ sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
static void do_utfpeakcharback(compiler_common *common)
{
-/* Peak a character back. */
+/* Peak a character back. Does not modify STR_PTR. */
DEFINE_COMPILER;
struct sljit_jump *jump[2];
@@ -4444,7 +4523,7 @@ sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
static void do_utfpeakcharback_invalid(compiler_common *common)
{
-/* Peak a character back. */
+/* Peak a character back. Does not modify STR_PTR. */
DEFINE_COMPILER;
sljit_s32 i;
sljit_s32 has_cmov = sljit_has_cpu_feature(SLJIT_HAS_CMOV);
@@ -4672,7 +4751,7 @@ sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
static void do_utfpeakcharback_invalid(compiler_common *common)
{
-/* Peak a character back. */
+/* Peak a character back. Does not modify STR_PTR. */
DEFINE_COMPILER;
struct sljit_jump *jump;
struct sljit_jump *exit_invalid[3];
@@ -4786,18 +4865,12 @@ OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, TMP2, 0);
OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, (sljit_sw)PRIV(ucd_stage2));
OP1(SLJIT_MOV_U16, TMP2, 0, SLJIT_MEM2(TMP2, TMP1), 1);
-// PH hacking
-//fprintf(stderr, "~~A\n");
- OP2(SLJIT_SHL, TMP1, 0, TMP2, 0, SLJIT_IMM, 2);
- OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 3);
- OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, TMP1, 0);
- OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, chartype));
-
+/* TMP2 is multiplied by 12. Same as (TMP2 << 2) + ((TMP2 << 2) << 1). */
OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, chartype));
+OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 2);
+OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, TMP2, 0);
+OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM2(TMP1, TMP2), 1);
- OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM2(TMP1, TMP2), 0);
-
-// OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM2(TMP1, TMP2), 3);
sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
}
@@ -4866,15 +4939,27 @@ else if ((overall_options & PCRE2_USE_OFFSET_LIMIT) != 0)
/* Check whether offset limit is set and valid. */
SLJIT_ASSERT(common->match_end_ptr != 0);
- OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);
- OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, offset_limit));
+ if (HAS_VIRTUAL_REGISTERS)
+ {
+ OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);
+ OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, offset_limit));
+ }
+ else
+ OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, offset_limit));
+
OP1(SLJIT_MOV, TMP2, 0, STR_END, 0);
end = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, (sljit_sw) PCRE2_UNSET);
- OP1(SLJIT_MOV, TMP2, 0, ARGUMENTS, 0);
+ if (HAS_VIRTUAL_REGISTERS)
+ OP1(SLJIT_MOV, TMP2, 0, ARGUMENTS, 0);
+ else
+ OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, begin));
+
#if PCRE2_CODE_UNIT_WIDTH == 16 || PCRE2_CODE_UNIT_WIDTH == 32
OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, UCHAR_SHIFT);
#endif /* PCRE2_CODE_UNIT_WIDTH == [16|32] */
- OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, begin));
+ if (HAS_VIRTUAL_REGISTERS)
+ OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, begin));
+
OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, TMP1, 0);
end2 = CMP(SLJIT_LESS_EQUAL, TMP2, 0, STR_END, 0);
OP1(SLJIT_MOV, TMP2, 0, STR_END, 0);
@@ -5434,699 +5519,56 @@ CMPTO(SLJIT_EQUAL, reg, 0, SLJIT_IMM, 0xdc00, label);
}
#endif
-#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) && !(defined SUPPORT_VALGRIND)
+#include "pcre2_jit_simd_inc.h"
-#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
-static struct sljit_jump *jump_if_utf_char_start(struct sljit_compiler *compiler, sljit_s32 reg)
-{
-#if PCRE2_CODE_UNIT_WIDTH == 8
-OP2(SLJIT_AND, reg, 0, reg, 0, SLJIT_IMM, 0xc0);
-return CMP(SLJIT_NOT_EQUAL, reg, 0, SLJIT_IMM, 0x80);
-#elif PCRE2_CODE_UNIT_WIDTH == 16
-OP2(SLJIT_AND, reg, 0, reg, 0, SLJIT_IMM, 0xfc00);
-return CMP(SLJIT_NOT_EQUAL, reg, 0, SLJIT_IMM, 0xdc00);
-#else
-#error "Unknown code width"
-#endif
-}
-#endif
-
-static sljit_s32 character_to_int32(PCRE2_UCHAR chr)
-{
-sljit_u32 value = chr;
-#if PCRE2_CODE_UNIT_WIDTH == 8
-#define SSE2_COMPARE_TYPE_INDEX 0
-return (sljit_s32)((value << 24) | (value << 16) | (value << 8) | value);
-#elif PCRE2_CODE_UNIT_WIDTH == 16
-#define SSE2_COMPARE_TYPE_INDEX 1
-return (sljit_s32)((value << 16) | value);
-#elif PCRE2_CODE_UNIT_WIDTH == 32
-#define SSE2_COMPARE_TYPE_INDEX 2
-return (sljit_s32)(value);
-#else
-#error "Unsupported unit width"
-#endif
-}
+#ifdef JIT_HAS_FAST_FORWARD_CHAR_PAIR_SIMD
-static void load_from_mem_sse2(struct sljit_compiler *compiler, sljit_s32 dst_xmm_reg, sljit_s32 src_general_reg)
+static BOOL check_fast_forward_char_pair_simd(compiler_common *common, fast_forward_char_data *chars, int max)
{
-#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
-sljit_u8 instruction[5];
-#else
-sljit_u8 instruction[4];
-#endif
-
-SLJIT_ASSERT(dst_xmm_reg < 8);
-
-/* MOVDQA xmm1, xmm2/m128 */
-#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
-if (src_general_reg < 8)
- {
- instruction[0] = 0x66;
- instruction[1] = 0x0f;
- instruction[2] = 0x6f;
- instruction[3] = (dst_xmm_reg << 3) | src_general_reg;
- sljit_emit_op_custom(compiler, instruction, 4);
- }
-else
- {
- instruction[0] = 0x66;
- instruction[1] = 0x41;
- instruction[2] = 0x0f;
- instruction[3] = 0x6f;
- instruction[4] = (dst_xmm_reg << 3) | (src_general_reg & 0x7);
- sljit_emit_op_custom(compiler, instruction, 4);
- }
-#else
-instruction[0] = 0x66;
-instruction[1] = 0x0f;
-instruction[2] = 0x6f;
-instruction[3] = (dst_xmm_reg << 3) | src_general_reg;
-sljit_emit_op_custom(compiler, instruction, 4);
-#endif
-}
-
-static void fast_forward_char_pair_sse2_compare(struct sljit_compiler *compiler, PCRE2_UCHAR char1, PCRE2_UCHAR char2,
- sljit_u32 bit, sljit_s32 dst_ind, sljit_s32 cmp1_ind, sljit_s32 cmp2_ind, sljit_s32 tmp_ind)
-{
-sljit_u8 instruction[4];
-instruction[0] = 0x66;
-instruction[1] = 0x0f;
-
-if (char1 == char2 || bit != 0)
- {
- if (bit != 0)
- {
- /* POR xmm1, xmm2/m128 */
- /* instruction[0] = 0x66; */
- /* instruction[1] = 0x0f; */
- instruction[2] = 0xeb;
- instruction[3] = 0xc0 | (dst_ind << 3) | cmp2_ind;
- sljit_emit_op_custom(compiler, instruction, 4);
- }
-
- /* PCMPEQB/W/D xmm1, xmm2/m128 */
- /* instruction[0] = 0x66; */
- /* instruction[1] = 0x0f; */
- instruction[2] = 0x74 + SSE2_COMPARE_TYPE_INDEX;
- instruction[3] = 0xc0 | (dst_ind << 3) | cmp1_ind;
- sljit_emit_op_custom(compiler, instruction, 4);
- }
-else
- {
- /* MOVDQA xmm1, xmm2/m128 */
- /* instruction[0] = 0x66; */
- /* instruction[1] = 0x0f; */
- instruction[2] = 0x6f;
- instruction[3] = 0xc0 | (tmp_ind << 3) | dst_ind;
- sljit_emit_op_custom(compiler, instruction, 4);
-
- /* PCMPEQB/W/D xmm1, xmm2/m128 */
- /* instruction[0] = 0x66; */
- /* instruction[1] = 0x0f; */
- instruction[2] = 0x74 + SSE2_COMPARE_TYPE_INDEX;
- instruction[3] = 0xc0 | (dst_ind << 3) | cmp1_ind;
- sljit_emit_op_custom(compiler, instruction, 4);
-
- instruction[3] = 0xc0 | (tmp_ind << 3) | cmp2_ind;
- sljit_emit_op_custom(compiler, instruction, 4);
-
- /* POR xmm1, xmm2/m128 */
- /* instruction[0] = 0x66; */
- /* instruction[1] = 0x0f; */
- instruction[2] = 0xeb;
- instruction[3] = 0xc0 | (dst_ind << 3) | tmp_ind;
- sljit_emit_op_custom(compiler, instruction, 4);
- }
-}
-
-static void fast_forward_first_char2_sse2(compiler_common *common, PCRE2_UCHAR char1, PCRE2_UCHAR char2, sljit_s32 offset)
-{
-DEFINE_COMPILER;
-struct sljit_label *start;
-#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
-struct sljit_label *restart;
-#endif
-struct sljit_jump *quit;
-struct sljit_jump *partial_quit[2];
-sljit_u8 instruction[8];
-sljit_s32 tmp1_ind = sljit_get_register_index(TMP1);
-sljit_s32 str_ptr_ind = sljit_get_register_index(STR_PTR);
-sljit_s32 data_ind = 0;
-sljit_s32 tmp_ind = 1;
-sljit_s32 cmp1_ind = 2;
-sljit_s32 cmp2_ind = 3;
-sljit_u32 bit = 0;
-
-SLJIT_UNUSED_ARG(offset);
-
-if (char1 != char2)
- {
- bit = char1 ^ char2;
- if (!is_powerof2(bit))
- bit = 0;
- }
-
-partial_quit[0] = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0);
-if (common->mode == PCRE2_JIT_COMPLETE)
- add_jump(compiler, &common->failed_match, partial_quit[0]);
-
-/* First part (unaligned start) */
-
-OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, character_to_int32(char1 | bit));
-
-SLJIT_ASSERT(tmp1_ind < 8);
-
-/* MOVD xmm, r/m32 */
-instruction[0] = 0x66;
-instruction[1] = 0x0f;
-instruction[2] = 0x6e;
-instruction[3] = 0xc0 | (cmp1_ind << 3) | tmp1_ind;
-sljit_emit_op_custom(compiler, instruction, 4);
-
-if (char1 != char2)
- {
- OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, character_to_int32(bit != 0 ? bit : char2));
-
- /* MOVD xmm, r/m32 */
- instruction[3] = 0xc0 | (cmp2_ind << 3) | tmp1_ind;
- sljit_emit_op_custom(compiler, instruction, 4);
- }
-
-OP1(SLJIT_MOV, TMP2, 0, STR_PTR, 0);
-
-/* PSHUFD xmm1, xmm2/m128, imm8 */
-/* instruction[0] = 0x66; */
-/* instruction[1] = 0x0f; */
-instruction[2] = 0x70;
-instruction[3] = 0xc0 | (cmp1_ind << 3) | 2;
-instruction[4] = 0;
-sljit_emit_op_custom(compiler, instruction, 5);
-
-if (char1 != char2)
- {
- /* PSHUFD xmm1, xmm2/m128, imm8 */
- instruction[3] = 0xc0 | (cmp2_ind << 3) | 3;
- sljit_emit_op_custom(compiler, instruction, 5);
- }
-
-#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
-restart = LABEL();
-#endif
-OP2(SLJIT_AND, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, ~0xf);
-OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xf);
-
-load_from_mem_sse2(compiler, data_ind, str_ptr_ind);
-fast_forward_char_pair_sse2_compare(compiler, char1, char2, bit, data_ind, cmp1_ind, cmp2_ind, tmp_ind);
-
-/* PMOVMSKB reg, xmm */
-/* instruction[0] = 0x66; */
-/* instruction[1] = 0x0f; */
-instruction[2] = 0xd7;
-instruction[3] = 0xc0 | (tmp1_ind << 3) | 0;
-sljit_emit_op_custom(compiler, instruction, 4);
-
-OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP2, 0);
-OP2(SLJIT_LSHR, TMP1, 0, TMP1, 0, TMP2, 0);
-
-/* BSF r32, r/m32 */
-instruction[0] = 0x0f;
-instruction[1] = 0xbc;
-instruction[2] = 0xc0 | (tmp1_ind << 3) | tmp1_ind;
-sljit_emit_op_custom(compiler, instruction, 3);
-sljit_set_current_flags(compiler, SLJIT_SET_Z);
-
-quit = JUMP(SLJIT_NOT_ZERO);
-
-OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, TMP2, 0);
-
-start = LABEL();
-OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, 16);
-
-partial_quit[1] = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0);
-if (common->mode == PCRE2_JIT_COMPLETE)
- add_jump(compiler, &common->failed_match, partial_quit[1]);
-
-/* Second part (aligned) */
-
-load_from_mem_sse2(compiler, 0, str_ptr_ind);
-fast_forward_char_pair_sse2_compare(compiler, char1, char2, bit, data_ind, cmp1_ind, cmp2_ind, tmp_ind);
-
-/* PMOVMSKB reg, xmm */
-instruction[0] = 0x66;
-instruction[1] = 0x0f;
-instruction[2] = 0xd7;
-instruction[3] = 0xc0 | (tmp1_ind << 3) | 0;
-sljit_emit_op_custom(compiler, instruction, 4);
-
-/* BSF r32, r/m32 */
-instruction[0] = 0x0f;
-instruction[1] = 0xbc;
-instruction[2] = 0xc0 | (tmp1_ind << 3) | tmp1_ind;
-sljit_emit_op_custom(compiler, instruction, 3);
-sljit_set_current_flags(compiler, SLJIT_SET_Z);
-
-JUMPTO(SLJIT_ZERO, start);
-
-JUMPHERE(quit);
-OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0);
-
-if (common->mode != PCRE2_JIT_COMPLETE)
- {
- JUMPHERE(partial_quit[0]);
- JUMPHERE(partial_quit[1]);
- OP2(SLJIT_SUB | SLJIT_SET_GREATER, SLJIT_UNUSED, 0, STR_PTR, 0, STR_END, 0);
- CMOV(SLJIT_GREATER, STR_PTR, STR_END, 0);
- }
-else
- add_jump(compiler, &common->failed_match, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0));
-
-#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
-if (common->utf && offset > 0)
- {
- SLJIT_ASSERT(common->mode == PCRE2_JIT_COMPLETE);
-
- OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-offset));
-
- quit = jump_if_utf_char_start(compiler, TMP1);
-
- OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
- add_jump(compiler, &common->failed_match, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0));
- OP1(SLJIT_MOV, TMP2, 0, STR_PTR, 0);
- JUMPTO(SLJIT_JUMP, restart);
-
- JUMPHERE(quit);
- }
-#endif
-}
-
-#ifndef _WIN64
-
-static SLJIT_INLINE sljit_u32 max_fast_forward_char_pair_sse2_offset(void)
-{
-#if PCRE2_CODE_UNIT_WIDTH == 8
-return 15;
-#elif PCRE2_CODE_UNIT_WIDTH == 16
-return 7;
-#elif PCRE2_CODE_UNIT_WIDTH == 32
-return 3;
-#else
-#error "Unsupported unit width"
-#endif
-}
-
-static void fast_forward_char_pair_sse2(compiler_common *common, sljit_s32 offs1,
- PCRE2_UCHAR char1a, PCRE2_UCHAR char1b, sljit_s32 offs2, PCRE2_UCHAR char2a, PCRE2_UCHAR char2b)
-{
-DEFINE_COMPILER;
-sljit_u32 bit1 = 0;
-sljit_u32 bit2 = 0;
-sljit_u32 diff = IN_UCHARS(offs1 - offs2);
-sljit_s32 tmp1_ind = sljit_get_register_index(TMP1);
-sljit_s32 tmp2_ind = sljit_get_register_index(TMP2);
-sljit_s32 str_ptr_ind = sljit_get_register_index(STR_PTR);
-sljit_s32 data1_ind = 0;
-sljit_s32 data2_ind = 1;
-sljit_s32 tmp_ind = 2;
-sljit_s32 cmp1a_ind = 3;
-sljit_s32 cmp1b_ind = 4;
-sljit_s32 cmp2a_ind = 5;
-sljit_s32 cmp2b_ind = 6;
-struct sljit_label *start;
-#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
-struct sljit_label *restart;
-#endif
-struct sljit_jump *jump[2];
-
-sljit_u8 instruction[8];
-
-SLJIT_ASSERT(common->mode == PCRE2_JIT_COMPLETE && offs1 > offs2);
-SLJIT_ASSERT(diff <= IN_UCHARS(max_fast_forward_char_pair_sse2_offset()));
-SLJIT_ASSERT(tmp1_ind < 8 && tmp2_ind == 1);
-
-/* Initialize. */
-if (common->match_end_ptr != 0)
- {
- OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr);
- OP1(SLJIT_MOV, TMP3, 0, STR_END, 0);
- OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(offs1 + 1));
-
- OP2(SLJIT_SUB | SLJIT_SET_LESS, SLJIT_UNUSED, 0, TMP1, 0, STR_END, 0);
- CMOV(SLJIT_LESS, STR_END, TMP1, 0);
- }
-
-OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(offs1));
-add_jump(compiler, &common->failed_match, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0));
-
-/* MOVD xmm, r/m32 */
-instruction[0] = 0x66;
-instruction[1] = 0x0f;
-instruction[2] = 0x6e;
-
-if (char1a == char1b)
- OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, character_to_int32(char1a));
-else
- {
- bit1 = char1a ^ char1b;
- if (is_powerof2(bit1))
- {
- OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, character_to_int32(char1a | bit1));
- OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, character_to_int32(bit1));
- }
- else
- {
- bit1 = 0;
- OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, character_to_int32(char1a));
- OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, character_to_int32(char1b));
- }
- }
-
-instruction[3] = 0xc0 | (cmp1a_ind << 3) | tmp1_ind;
-sljit_emit_op_custom(compiler, instruction, 4);
-
-if (char1a != char1b)
- {
- instruction[3] = 0xc0 | (cmp1b_ind << 3) | tmp2_ind;
- sljit_emit_op_custom(compiler, instruction, 4);
- }
-
-if (char2a == char2b)
- OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, character_to_int32(char2a));
-else
- {
- bit2 = char2a ^ char2b;
- if (is_powerof2(bit2))
- {
- OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, character_to_int32(char2a | bit2));
- OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, character_to_int32(bit2));
- }
- else
- {
- bit2 = 0;
- OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, character_to_int32(char2a));
- OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, character_to_int32(char2b));
- }
- }
-
-instruction[3] = 0xc0 | (cmp2a_ind << 3) | tmp1_ind;
-sljit_emit_op_custom(compiler, instruction, 4);
-
-if (char2a != char2b)
- {
- instruction[3] = 0xc0 | (cmp2b_ind << 3) | tmp2_ind;
- sljit_emit_op_custom(compiler, instruction, 4);
- }
-
-/* PSHUFD xmm1, xmm2/m128, imm8 */
-/* instruction[0] = 0x66; */
-/* instruction[1] = 0x0f; */
-instruction[2] = 0x70;
-instruction[4] = 0;
-
-instruction[3] = 0xc0 | (cmp1a_ind << 3) | cmp1a_ind;
-sljit_emit_op_custom(compiler, instruction, 5);
-
-if (char1a != char1b)
- {
- instruction[3] = 0xc0 | (cmp1b_ind << 3) | cmp1b_ind;
- sljit_emit_op_custom(compiler, instruction, 5);
- }
-
-instruction[3] = 0xc0 | (cmp2a_ind << 3) | cmp2a_ind;
-sljit_emit_op_custom(compiler, instruction, 5);
-
-if (char2a != char2b)
- {
- instruction[3] = 0xc0 | (cmp2b_ind << 3) | cmp2b_ind;
- sljit_emit_op_custom(compiler, instruction, 5);
- }
-
-#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
-restart = LABEL();
-#endif
-
-OP2(SLJIT_SUB, TMP1, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(offs1 - offs2));
-OP1(SLJIT_MOV, TMP2, 0, STR_PTR, 0);
-OP2(SLJIT_AND, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, ~0xf);
-OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, ~0xf);
-
-load_from_mem_sse2(compiler, data1_ind, str_ptr_ind);
-
-jump[0] = CMP(SLJIT_EQUAL, STR_PTR, 0, TMP1, 0);
-
-load_from_mem_sse2(compiler, data2_ind, tmp1_ind);
-
-/* MOVDQA xmm1, xmm2/m128 */
-/* instruction[0] = 0x66; */
-/* instruction[1] = 0x0f; */
-instruction[2] = 0x6f;
-instruction[3] = 0xc0 | (tmp_ind << 3) | data1_ind;
-sljit_emit_op_custom(compiler, instruction, 4);
-
-/* PSLLDQ xmm1, xmm2/m128, imm8 */
-/* instruction[0] = 0x66; */
-/* instruction[1] = 0x0f; */
-instruction[2] = 0x73;
-instruction[3] = 0xc0 | (7 << 3) | tmp_ind;
-instruction[4] = diff;
-sljit_emit_op_custom(compiler, instruction, 5);
-
-/* PSRLDQ xmm1, xmm2/m128, imm8 */
-/* instruction[0] = 0x66; */
-/* instruction[1] = 0x0f; */
-/* instruction[2] = 0x73; */
-instruction[3] = 0xc0 | (3 << 3) | data2_ind;
-instruction[4] = 16 - diff;
-sljit_emit_op_custom(compiler, instruction, 5);
-
-/* POR xmm1, xmm2/m128 */
-/* instruction[0] = 0x66; */
-/* instruction[1] = 0x0f; */
-instruction[2] = 0xeb;
-instruction[3] = 0xc0 | (data2_ind << 3) | tmp_ind;
-sljit_emit_op_custom(compiler, instruction, 4);
-
-jump[1] = JUMP(SLJIT_JUMP);
-
-JUMPHERE(jump[0]);
-
-/* MOVDQA xmm1, xmm2/m128 */
-/* instruction[0] = 0x66; */
-/* instruction[1] = 0x0f; */
-instruction[2] = 0x6f;
-instruction[3] = 0xc0 | (data2_ind << 3) | data1_ind;
-sljit_emit_op_custom(compiler, instruction, 4);
-
-/* PSLLDQ xmm1, xmm2/m128, imm8 */
-/* instruction[0] = 0x66; */
-/* instruction[1] = 0x0f; */
-instruction[2] = 0x73;
-instruction[3] = 0xc0 | (7 << 3) | data2_ind;
-instruction[4] = diff;
-sljit_emit_op_custom(compiler, instruction, 5);
-
-JUMPHERE(jump[1]);
-
-OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xf);
-
-fast_forward_char_pair_sse2_compare(compiler, char2a, char2b, bit2, data2_ind, cmp2a_ind, cmp2b_ind, tmp_ind);
-fast_forward_char_pair_sse2_compare(compiler, char1a, char1b, bit1, data1_ind, cmp1a_ind, cmp1b_ind, tmp_ind);
-
-/* PAND xmm1, xmm2/m128 */
-/* instruction[0] = 0x66; */
-/* instruction[1] = 0x0f; */
-instruction[2] = 0xdb;
-instruction[3] = 0xc0 | (data1_ind << 3) | data2_ind;
-sljit_emit_op_custom(compiler, instruction, 4);
-
-/* PMOVMSKB reg, xmm */
-/* instruction[0] = 0x66; */
-/* instruction[1] = 0x0f; */
-instruction[2] = 0xd7;
-instruction[3] = 0xc0 | (tmp1_ind << 3) | 0;
-sljit_emit_op_custom(compiler, instruction, 4);
-
-/* Ignore matches before the first STR_PTR. */
-OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP2, 0);
-OP2(SLJIT_LSHR, TMP1, 0, TMP1, 0, TMP2, 0);
-
-/* BSF r32, r/m32 */
-instruction[0] = 0x0f;
-instruction[1] = 0xbc;
-instruction[2] = 0xc0 | (tmp1_ind << 3) | tmp1_ind;
-sljit_emit_op_custom(compiler, instruction, 3);
-sljit_set_current_flags(compiler, SLJIT_SET_Z);
-
-jump[0] = JUMP(SLJIT_NOT_ZERO);
-
-OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, TMP2, 0);
-
-/* Main loop. */
-instruction[0] = 0x66;
-instruction[1] = 0x0f;
-
-start = LABEL();
-
-load_from_mem_sse2(compiler, data2_ind, str_ptr_ind);
-
-OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, 16);
-add_jump(compiler, &common->failed_match, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0));
-
-load_from_mem_sse2(compiler, data1_ind, str_ptr_ind);
-
-/* PSRLDQ xmm1, xmm2/m128, imm8 */
-/* instruction[0] = 0x66; */
-/* instruction[1] = 0x0f; */
-instruction[2] = 0x73;
-instruction[3] = 0xc0 | (3 << 3) | data2_ind;
-instruction[4] = 16 - diff;
-sljit_emit_op_custom(compiler, instruction, 5);
-
-/* MOVDQA xmm1, xmm2/m128 */
-/* instruction[0] = 0x66; */
-/* instruction[1] = 0x0f; */
-instruction[2] = 0x6f;
-instruction[3] = 0xc0 | (tmp_ind << 3) | data1_ind;
-sljit_emit_op_custom(compiler, instruction, 4);
-
-/* PSLLDQ xmm1, xmm2/m128, imm8 */
-/* instruction[0] = 0x66; */
-/* instruction[1] = 0x0f; */
-instruction[2] = 0x73;
-instruction[3] = 0xc0 | (7 << 3) | tmp_ind;
-instruction[4] = diff;
-sljit_emit_op_custom(compiler, instruction, 5);
-
-/* POR xmm1, xmm2/m128 */
-/* instruction[0] = 0x66; */
-/* instruction[1] = 0x0f; */
-instruction[2] = 0xeb;
-instruction[3] = 0xc0 | (data2_ind << 3) | tmp_ind;
-sljit_emit_op_custom(compiler, instruction, 4);
-
-fast_forward_char_pair_sse2_compare(compiler, char1a, char1b, bit1, data1_ind, cmp1a_ind, cmp1b_ind, tmp_ind);
-fast_forward_char_pair_sse2_compare(compiler, char2a, char2b, bit2, data2_ind, cmp2a_ind, cmp2b_ind, tmp_ind);
-
-/* PAND xmm1, xmm2/m128 */
-/* instruction[0] = 0x66; */
-/* instruction[1] = 0x0f; */
-instruction[2] = 0xdb;
-instruction[3] = 0xc0 | (data1_ind << 3) | data2_ind;
-sljit_emit_op_custom(compiler, instruction, 4);
-
-/* PMOVMSKB reg, xmm */
-/* instruction[0] = 0x66; */
-/* instruction[1] = 0x0f; */
-instruction[2] = 0xd7;
-instruction[3] = 0xc0 | (tmp1_ind << 3) | 0;
-sljit_emit_op_custom(compiler, instruction, 4);
-
-/* BSF r32, r/m32 */
-instruction[0] = 0x0f;
-instruction[1] = 0xbc;
-instruction[2] = 0xc0 | (tmp1_ind << 3) | tmp1_ind;
-sljit_emit_op_custom(compiler, instruction, 3);
-sljit_set_current_flags(compiler, SLJIT_SET_Z);
-
-JUMPTO(SLJIT_ZERO, start);
-
-JUMPHERE(jump[0]);
-
-OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0);
-
-add_jump(compiler, &common->failed_match, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0));
-
-if (common->match_end_ptr != 0)
- OP1(SLJIT_MOV, STR_END, 0, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr);
-
-#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
-if (common->utf)
- {
- OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-offs1));
-
- jump[0] = jump_if_utf_char_start(compiler, TMP1);
-
- OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
- CMPTO(SLJIT_LESS, STR_PTR, 0, STR_END, 0, restart);
-
- add_jump(compiler, &common->failed_match, JUMP(SLJIT_JUMP));
-
- JUMPHERE(jump[0]);
- }
-#endif
-
-OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(offs1));
-
-if (common->match_end_ptr != 0)
- OP1(SLJIT_MOV, STR_END, 0, TMP3, 0);
-}
-
-static BOOL check_fast_forward_char_pair_sse2(compiler_common *common, fast_forward_char_data *chars, int max)
-{
-sljit_s32 i, j, priority, count;
-sljit_u32 priorities;
-PCRE2_UCHAR a1, a2, b1, b2;
-
-priorities = 0;
-
-count = 0;
-for (i = 0; i < max; i++)
- {
- if (chars[i].last_count > 2)
- {
- SLJIT_ASSERT(chars[i].last_count <= 7);
-
- priorities |= (1 << chars[i].last_count);
- count++;
- }
- }
-
-if (count < 2)
- return FALSE;
-
-for (priority = 7; priority > 2; priority--)
- {
- if ((priorities & (1 << priority)) == 0)
- continue;
+ sljit_s32 i, j, max_i = 0, max_j = 0;
+ sljit_u32 max_pri = 0;
+ PCRE2_UCHAR a1, a2, a_pri, b1, b2, b_pri;
for (i = max - 1; i >= 1; i--)
- if (chars[i].last_count >= priority)
+ {
+ if (chars[i].last_count > 2)
{
- SLJIT_ASSERT(chars[i].count <= 2 && chars[i].count >= 1);
-
a1 = chars[i].chars[0];
a2 = chars[i].chars[1];
+ a_pri = chars[i].last_count;
- j = i - max_fast_forward_char_pair_sse2_offset();
+ j = i - max_fast_forward_char_pair_offset();
if (j < 0)
j = 0;
while (j < i)
{
- if (chars[j].last_count >= priority)
+ b_pri = chars[j].last_count;
+ if (b_pri > 2 && a_pri + b_pri >= max_pri)
{
b1 = chars[j].chars[0];
b2 = chars[j].chars[1];
if (a1 != b1 && a1 != b2 && a2 != b1 && a2 != b2)
{
- fast_forward_char_pair_sse2(common, i, a1, a2, j, b1, b2);
- return TRUE;
+ max_pri = a_pri + b_pri;
+ max_i = i;
+ max_j = j;
}
}
j++;
}
}
- }
-
-return FALSE;
-}
+ }
-#endif
+if (max_pri == 0)
+ return FALSE;
-#undef SSE2_COMPARE_TYPE_INDEX
+fast_forward_char_pair_simd(common, max_i, chars[max_i].chars[0], chars[max_i].chars[1], max_j, chars[max_j].chars[0], chars[max_j].chars[1]);
+return TRUE;
+}
-#endif
+#endif /* JIT_HAS_FAST_FORWARD_CHAR_PAIR_SIMD */
static void fast_forward_first_char2(compiler_common *common, PCRE2_UCHAR char1, PCRE2_UCHAR char2, sljit_s32 offset)
{
@@ -6154,13 +5596,11 @@ if (has_match_end)
CMOV(SLJIT_GREATER, STR_END, TMP1, 0);
}
-#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) && !(defined SUPPORT_VALGRIND)
+#ifdef JIT_HAS_FAST_FORWARD_CHAR_SIMD
-/* SSE2 accelerated first character search. */
-
-if (sljit_has_cpu_feature(SLJIT_HAS_SSE2))
+if (JIT_HAS_FAST_FORWARD_CHAR_SIMD)
{
- fast_forward_first_char2_sse2(common, char1, char2, offset);
+ fast_forward_char_simd(common, char1, char2, offset);
if (offset > 0)
OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(offset));
@@ -6267,8 +5707,8 @@ for (i = 0; i < max; i++)
chars[i].last_count = (chars[i].count == 255) ? 0 : 1;
}
-#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) && !(defined SUPPORT_VALGRIND) && !(defined _WIN64)
-if (sljit_has_cpu_feature(SLJIT_HAS_SSE2) && check_fast_forward_char_pair_sse2(common, chars, max))
+#ifdef JIT_HAS_FAST_FORWARD_CHAR_PAIR_SIMD
+if (JIT_HAS_FAST_FORWARD_CHAR_PAIR_SIMD && check_fast_forward_char_pair_simd(common, chars, max))
return TRUE;
#endif
@@ -6353,18 +5793,21 @@ if (common->match_end_ptr != 0)
{
OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr);
OP1(SLJIT_MOV, TMP3, 0, STR_END, 0);
- OP2(SLJIT_SUB, STR_END, 0, STR_END, 0, SLJIT_IMM, IN_UCHARS(max));
+ OP2(SLJIT_SUB | SLJIT_SET_LESS, STR_END, 0, STR_END, 0, SLJIT_IMM, IN_UCHARS(max));
+ add_jump(compiler, &common->failed_match, JUMP(SLJIT_LESS));
OP2(SLJIT_SUB | SLJIT_SET_GREATER, SLJIT_UNUSED, 0, STR_END, 0, TMP1, 0);
CMOV(SLJIT_GREATER, STR_END, TMP1, 0);
}
else
- OP2(SLJIT_SUB, STR_END, 0, STR_END, 0, SLJIT_IMM, IN_UCHARS(max));
+ {
+ OP2(SLJIT_SUB | SLJIT_SET_LESS, STR_END, 0, STR_END, 0, SLJIT_IMM, IN_UCHARS(max));
+ add_jump(compiler, &common->failed_match, JUMP(SLJIT_LESS));
+ }
SLJIT_ASSERT(range_right >= 0);
-#if !(defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
-OP1(SLJIT_MOV, RETURN_ADDR, 0, SLJIT_IMM, (sljit_sw)update_table);
-#endif
+if (!HAS_VIRTUAL_REGISTERS)
+ OP1(SLJIT_MOV, RETURN_ADDR, 0, SLJIT_IMM, (sljit_sw)update_table);
start = LABEL();
add_jump(compiler, &common->failed_match, CMP(SLJIT_GREATER, STR_PTR, 0, STR_END, 0));
@@ -6375,11 +5818,11 @@ OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(range_right));
OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(range_right + 1) - 1);
#endif
-#if !(defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
-OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM2(RETURN_ADDR, TMP1), 0);
-#else
-OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_sw)update_table);
-#endif
+if (!HAS_VIRTUAL_REGISTERS)
+ OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM2(RETURN_ADDR, TMP1), 0);
+else
+ OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_sw)update_table);
+
OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0);
CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, 0, start);
@@ -6473,9 +5916,17 @@ if (common->match_end_ptr != 0)
if (common->nltype == NLTYPE_FIXED && common->newline > 255)
{
lastchar = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0);
- OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);
- OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, str));
- OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, begin));
+ if (HAS_VIRTUAL_REGISTERS)
+ {
+ OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);
+ OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, str));
+ OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, begin));
+ }
+ else
+ {
+ OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, str));
+ OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, begin));
+ }
firstchar = CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, TMP2, 0);
OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(2));
@@ -6503,9 +5954,15 @@ if (common->nltype == NLTYPE_FIXED && common->newline > 255)
return;
}
-OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);
+if (HAS_VIRTUAL_REGISTERS)
+ {
+ OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);
+ OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, str));
+ }
+else
+ OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, str));
+
/* Example: match /^/ to \r\n from offset 1. */
-OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, str));
firstchar = CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, TMP2, 0);
move_back(common, NULL, FALSE);
@@ -6586,7 +6043,7 @@ if (!optimize_class(common, start_bits, (start_bits[31] & 0x80) != 0, FALSE, &ma
OP2(SLJIT_AND, TMP2, 0, TMP1, 0, SLJIT_IMM, 0x7);
OP2(SLJIT_LSHR, TMP1, 0, TMP1, 0, SLJIT_IMM, 3);
OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_sw)start_bits);
- if (sljit_get_register_index(TMP3) >= 0)
+ if (!HAS_VIRTUAL_REGISTERS)
{
OP2(SLJIT_SHL, TMP3, 0, SLJIT_IMM, 1, TMP2, 0);
OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, TMP3, 0);
@@ -6693,7 +6150,7 @@ OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), -sizeof(sljit_sw));
jump = CMP(SLJIT_SIG_LESS_EQUAL, TMP2, 0, SLJIT_IMM, 0);
OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, TMP1, 0);
-if (sljit_get_register_index(TMP3) < 0)
+if (HAS_VIRTUAL_REGISTERS)
{
OP1(SLJIT_MOV, SLJIT_MEM1(TMP2), 0, SLJIT_MEM1(STACK_TOP), -(2 * sizeof(sljit_sw)));
OP1(SLJIT_MOV, SLJIT_MEM1(TMP2), sizeof(sljit_sw), SLJIT_MEM1(STACK_TOP), -(3 * sizeof(sljit_sw)));
@@ -6718,7 +6175,7 @@ sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
JUMPHERE(jump);
OP1(SLJIT_NEG, TMP2, 0, TMP2, 0);
OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, TMP1, 0);
-if (sljit_get_register_index(TMP3) < 0)
+if (HAS_VIRTUAL_REGISTERS)
{
OP1(SLJIT_MOV, SLJIT_MEM1(TMP2), 0, SLJIT_MEM1(STACK_TOP), -(2 * sizeof(sljit_sw)));
OP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, 2 * sizeof(sljit_sw));
@@ -6737,7 +6194,11 @@ static void check_wordboundary(compiler_common *common)
DEFINE_COMPILER;
struct sljit_jump *skipread;
jump_list *skipread_list = NULL;
-jump_list *invalid_utf = NULL;
+#ifdef SUPPORT_UNICODE
+struct sljit_label *valid_utf;
+jump_list *invalid_utf1 = NULL;
+#endif /* SUPPORT_UNICODE */
+jump_list *invalid_utf2 = NULL;
#if PCRE2_CODE_UNIT_WIDTH != 8 || defined SUPPORT_UNICODE
struct sljit_jump *jump;
#endif /* PCRE2_CODE_UNIT_WIDTH != 8 || SUPPORT_UNICODE */
@@ -6751,14 +6212,30 @@ OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, begin));
OP1(SLJIT_MOV, TMP3, 0, SLJIT_IMM, 0);
skipread = CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, TMP2, 0);
-if (common->mode == PCRE2_JIT_COMPLETE)
- peek_char_back(common, READ_CHAR_MAX, &invalid_utf);
+#ifdef SUPPORT_UNICODE
+if (common->invalid_utf)
+ {
+ peek_char_back(common, READ_CHAR_MAX, &invalid_utf1);
+
+ if (common->mode != PCRE2_JIT_COMPLETE)
+ {
+ OP1(SLJIT_MOV, TMP2, 0, STR_PTR, 0);
+ move_back(common, NULL, TRUE);
+ check_start_used_ptr(common);
+ OP1(SLJIT_MOV, STR_PTR, 0, TMP2, 0);
+ }
+ }
else
+#endif /* SUPPORT_UNICODE */
{
- move_back(common, &invalid_utf, FALSE);
- check_start_used_ptr(common);
- /* No need precise read since match fails anyway. */
- read_char(common, 0, READ_CHAR_MAX, &invalid_utf, READ_CHAR_UPDATE_STR_PTR);
+ if (common->mode == PCRE2_JIT_COMPLETE)
+ peek_char_back(common, READ_CHAR_MAX, NULL);
+ else
+ {
+ move_back(common, NULL, TRUE);
+ check_start_used_ptr(common);
+ read_char(common, 0, READ_CHAR_MAX, NULL, READ_CHAR_UPDATE_STR_PTR);
+ }
}
/* Testing char type. */
@@ -6802,10 +6279,13 @@ JUMPHERE(skipread);
OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, 0);
check_str_end(common, &skipread_list);
-peek_char(common, READ_CHAR_MAX, SLJIT_MEM1(SLJIT_SP), LOCALS1, &invalid_utf);
+peek_char(common, READ_CHAR_MAX, SLJIT_MEM1(SLJIT_SP), LOCALS1, &invalid_utf2);
/* Testing char type. This is a code duplication. */
#ifdef SUPPORT_UNICODE
+
+valid_utf = LABEL();
+
if (common->use_ucp)
{
OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, 1);
@@ -6851,13 +6331,19 @@ sljit_emit_fast_return(compiler, TMP1, 0);
#ifdef SUPPORT_UNICODE
if (common->invalid_utf)
{
- SLJIT_ASSERT(invalid_utf != NULL);
+ set_jumps(invalid_utf1, LABEL());
+
+ peek_char(common, READ_CHAR_MAX, SLJIT_MEM1(SLJIT_SP), LOCALS1, NULL);
+ CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, INVALID_UTF_CHAR, valid_utf);
- set_jumps(invalid_utf, LABEL());
OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0);
OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, -1);
sljit_emit_fast_return(compiler, TMP1, 0);
- return;
+
+ set_jumps(invalid_utf2, LABEL());
+ OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0);
+ OP1(SLJIT_MOV, TMP2, 0, TMP3, 0);
+ sljit_emit_fast_return(compiler, TMP1, 0);
}
#endif /* SUPPORT_UNICODE */
}
@@ -7225,7 +6711,7 @@ struct sljit_label *label;
int char1_reg;
int char2_reg;
-if (sljit_get_register_index(TMP3) < 0)
+if (HAS_VIRTUAL_REGISTERS)
{
char1_reg = STR_END;
char2_reg = STACK_TOP;
@@ -7307,7 +6793,7 @@ int char2_reg;
int lcc_table;
int opt_type = 0;
-if (sljit_get_register_index(TMP3) < 0)
+if (HAS_VIRTUAL_REGISTERS)
{
char2_reg = STACK_TOP;
lcc_table = STACK_LIMIT;
@@ -7790,8 +7276,6 @@ if (needstype || needsscript)
if (needsscript)
{
// PH hacking
-//fprintf(stderr, "~~B\n");
-
OP2(SLJIT_SHL, TMP1, 0, TMP2, 0, SLJIT_IMM, 2);
OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 3);
OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, TMP1, 0);
@@ -7845,7 +7329,6 @@ if (needstype || needsscript)
if (!needschar)
{
// PH hacking
-//fprintf(stderr, "~~C\n");
OP2(SLJIT_SHL, TMP1, 0, TMP2, 0, SLJIT_IMM, 2);
OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 3);
OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, TMP1, 0);
@@ -7860,7 +7343,6 @@ if (needstype || needsscript)
else
{
// PH hacking
-//fprintf(stderr, "~~D\n");
OP2(SLJIT_SHL, TMP1, 0, TMP2, 0, SLJIT_IMM, 2);
OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 3);
@@ -8174,14 +7656,24 @@ struct sljit_label *label;
switch(type)
{
case OP_SOD:
- OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);
- OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, begin));
+ if (HAS_VIRTUAL_REGISTERS)
+ {
+ OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);
+ OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, begin));
+ }
+ else
+ OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, begin));
add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, STR_PTR, 0, TMP1, 0));
return cc;
case OP_SOM:
- OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);
- OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, str));
+ if (HAS_VIRTUAL_REGISTERS)
+ {
+ OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);
+ OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, str));
+ }
+ else
+ OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, str));
add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, STR_PTR, 0, TMP1, 0));
return cc;
@@ -8191,9 +7683,7 @@ switch(type)
#ifdef SUPPORT_UNICODE
if (common->invalid_utf)
{
- OP2(SLJIT_SUB | SLJIT_SET_Z | SLJIT_SET_SIG_LESS, SLJIT_UNUSED, 0, TMP2, 0, SLJIT_IMM, 0);
- add_jump(compiler, backtracks, JUMP(SLJIT_SIG_LESS));
- add_jump(compiler, backtracks, JUMP(type == OP_NOT_WORD_BOUNDARY ? SLJIT_NOT_ZERO : SLJIT_ZERO));
+ add_jump(compiler, backtracks, CMP((type == OP_NOT_WORD_BOUNDARY) ? SLJIT_NOT_EQUAL : SLJIT_SIG_LESS_EQUAL, TMP2, 0, SLJIT_IMM, 0));
return cc;
}
#endif /* SUPPORT_UNICODE */
@@ -8267,17 +7757,24 @@ switch(type)
JUMPHERE(jump[3]);
}
JUMPHERE(jump[0]);
- check_partial(common, FALSE);
+ if (common->mode != PCRE2_JIT_COMPLETE)
+ check_partial(common, TRUE);
return cc;
case OP_EOD:
add_jump(compiler, backtracks, CMP(SLJIT_LESS, STR_PTR, 0, STR_END, 0));
- check_partial(common, FALSE);
+ if (common->mode != PCRE2_JIT_COMPLETE)
+ check_partial(common, TRUE);
return cc;
case OP_DOLL:
- OP1(SLJIT_MOV, TMP2, 0, ARGUMENTS, 0);
- OP2(SLJIT_AND32 | SLJIT_SET_Z, SLJIT_UNUSED, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, options), SLJIT_IMM, PCRE2_NOTEOL);
+ if (HAS_VIRTUAL_REGISTERS)
+ {
+ OP1(SLJIT_MOV, TMP2, 0, ARGUMENTS, 0);
+ OP2(SLJIT_AND32 | SLJIT_SET_Z, SLJIT_UNUSED, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, options), SLJIT_IMM, PCRE2_NOTEOL);
+ }
+ else
+ OP2(SLJIT_AND32 | SLJIT_SET_Z, SLJIT_UNUSED, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, options), SLJIT_IMM, PCRE2_NOTEOL);
add_jump(compiler, backtracks, JUMP(SLJIT_NOT_ZERO32));
if (!common->endonly)
@@ -8291,8 +7788,13 @@ switch(type)
case OP_DOLLM:
jump[1] = CMP(SLJIT_LESS, STR_PTR, 0, STR_END, 0);
- OP1(SLJIT_MOV, TMP2, 0, ARGUMENTS, 0);
- OP2(SLJIT_AND32 | SLJIT_SET_Z, SLJIT_UNUSED, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, options), SLJIT_IMM, PCRE2_NOTEOL);
+ if (HAS_VIRTUAL_REGISTERS)
+ {
+ OP1(SLJIT_MOV, TMP2, 0, ARGUMENTS, 0);
+ OP2(SLJIT_AND32 | SLJIT_SET_Z, SLJIT_UNUSED, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, options), SLJIT_IMM, PCRE2_NOTEOL);
+ }
+ else
+ OP2(SLJIT_AND32 | SLJIT_SET_Z, SLJIT_UNUSED, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, options), SLJIT_IMM, PCRE2_NOTEOL);
add_jump(compiler, backtracks, JUMP(SLJIT_NOT_ZERO32));
check_partial(common, FALSE);
jump[0] = JUMP(SLJIT_JUMP);
@@ -8327,18 +7829,38 @@ switch(type)
return cc;
case OP_CIRC:
- OP1(SLJIT_MOV, TMP2, 0, ARGUMENTS, 0);
- OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, begin));
- add_jump(compiler, backtracks, CMP(SLJIT_GREATER, STR_PTR, 0, TMP1, 0));
- OP2(SLJIT_AND32 | SLJIT_SET_Z, SLJIT_UNUSED, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, options), SLJIT_IMM, PCRE2_NOTBOL);
- add_jump(compiler, backtracks, JUMP(SLJIT_NOT_ZERO32));
+ if (HAS_VIRTUAL_REGISTERS)
+ {
+ OP1(SLJIT_MOV, TMP2, 0, ARGUMENTS, 0);
+ OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, begin));
+ add_jump(compiler, backtracks, CMP(SLJIT_GREATER, STR_PTR, 0, TMP1, 0));
+ OP2(SLJIT_AND32 | SLJIT_SET_Z, SLJIT_UNUSED, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, options), SLJIT_IMM, PCRE2_NOTBOL);
+ add_jump(compiler, backtracks, JUMP(SLJIT_NOT_ZERO32));
+ }
+ else
+ {
+ OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, begin));
+ add_jump(compiler, backtracks, CMP(SLJIT_GREATER, STR_PTR, 0, TMP1, 0));
+ OP2(SLJIT_AND32 | SLJIT_SET_Z, SLJIT_UNUSED, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, options), SLJIT_IMM, PCRE2_NOTBOL);
+ add_jump(compiler, backtracks, JUMP(SLJIT_NOT_ZERO32));
+ }
return cc;
case OP_CIRCM:
- OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);
- OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, begin));
- jump[1] = CMP(SLJIT_GREATER, STR_PTR, 0, TMP2, 0);
- OP2(SLJIT_AND32 | SLJIT_SET_Z, SLJIT_UNUSED, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, options), SLJIT_IMM, PCRE2_NOTBOL);
+ /* TMP2 might be used by peek_char_back. */
+ if (HAS_VIRTUAL_REGISTERS)
+ {
+ OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);
+ OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, begin));
+ jump[1] = CMP(SLJIT_GREATER, STR_PTR, 0, TMP2, 0);
+ OP2(SLJIT_AND32 | SLJIT_SET_Z, SLJIT_UNUSED, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, options), SLJIT_IMM, PCRE2_NOTBOL);
+ }
+ else
+ {
+ OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, begin));
+ jump[1] = CMP(SLJIT_GREATER, STR_PTR, 0, TMP2, 0);
+ OP2(SLJIT_AND32 | SLJIT_SET_Z, SLJIT_UNUSED, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, options), SLJIT_IMM, PCRE2_NOTBOL);
+ }
add_jump(compiler, backtracks, JUMP(SLJIT_NOT_ZERO32));
jump[0] = JUMP(SLJIT_JUMP);
JUMPHERE(jump[1]);
@@ -8367,11 +7889,16 @@ switch(type)
length = GET(cc, 0);
if (length == 0)
return cc + LINK_SIZE;
- OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);
+ if (HAS_VIRTUAL_REGISTERS)
+ {
+ OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);
+ OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, begin));
+ }
+ else
+ OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, begin));
#ifdef SUPPORT_UNICODE
if (common->utf)
{
- OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, begin));
OP1(SLJIT_MOV, TMP3, 0, SLJIT_IMM, length);
label = LABEL();
add_jump(compiler, backtracks, CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, TMP2, 0));
@@ -8382,9 +7909,8 @@ switch(type)
else
#endif
{
- OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, begin));
OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(length));
- add_jump(compiler, backtracks, CMP(SLJIT_LESS, STR_PTR, 0, TMP1, 0));
+ add_jump(compiler, backtracks, CMP(SLJIT_LESS, STR_PTR, 0, TMP2, 0));
}
check_start_used_ptr(common);
return cc + LINK_SIZE;
@@ -8402,12 +7928,12 @@ static PCRE2_SPTR SLJIT_FUNC do_extuni_utf(jit_arguments *args, PCRE2_SPTR cc)
PCRE2_SPTR start_subject = args->begin;
PCRE2_SPTR end_subject = args->end;
int lgb, rgb, ricount;
-PCRE2_SPTR prevcc, startcc, bptr;
+PCRE2_SPTR prevcc, endcc, bptr;
BOOL first = TRUE;
uint32_t c;
prevcc = cc;
-startcc = NULL;
+endcc = NULL;
do
{
GETCHARINC(c, cc);
@@ -8416,7 +7942,7 @@ do
if (first)
{
lgb = rgb;
- startcc = cc;
+ endcc = cc;
first = FALSE;
continue;
}
@@ -8455,25 +7981,27 @@ do
lgb != ucp_gbExtended_Pictographic)
lgb = rgb;
- prevcc = startcc;
- startcc = cc;
+ prevcc = endcc;
+ endcc = cc;
}
while (cc < end_subject);
-return startcc;
+return endcc;
}
+#endif /* PCRE2_CODE_UNIT_WIDTH != 32 */
+
static PCRE2_SPTR SLJIT_FUNC do_extuni_utf_invalid(jit_arguments *args, PCRE2_SPTR cc)
{
PCRE2_SPTR start_subject = args->begin;
PCRE2_SPTR end_subject = args->end;
int lgb, rgb, ricount;
-PCRE2_SPTR prevcc, startcc, bptr;
+PCRE2_SPTR prevcc, endcc, bptr;
BOOL first = TRUE;
uint32_t c;
prevcc = cc;
-startcc = NULL;
+endcc = NULL;
do
{
GETCHARINC_INVALID(c, cc, end_subject, break);
@@ -8482,7 +8010,7 @@ do
if (first)
{
lgb = rgb;
- startcc = cc;
+ endcc = cc;
first = FALSE;
continue;
}
@@ -8520,16 +8048,14 @@ do
lgb != ucp_gbExtended_Pictographic)
lgb = rgb;
- prevcc = startcc;
- startcc = cc;
+ prevcc = endcc;
+ endcc = cc;
}
while (cc < end_subject);
-return startcc;
+return endcc;
}
-#endif /* PCRE2_CODE_UNIT_WIDTH != 32 */
-
static PCRE2_SPTR SLJIT_FUNC do_extuni_no_utf(jit_arguments *args, PCRE2_SPTR cc)
{
PCRE2_SPTR start_subject = args->begin;
@@ -8538,7 +8064,10 @@ int lgb, rgb, ricount;
PCRE2_SPTR bptr;
uint32_t c;
-GETCHARINC(c, cc);
+/* Patch by PH */
+/* GETCHARINC(c, cc); */
+c = *cc++;
+
#if PCRE2_CODE_UNIT_WIDTH == 32
if (c >= 0x110000)
return NULL;
@@ -8800,8 +8329,10 @@ switch(type)
if (common->invalid_utf)
add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, SLJIT_RETURN_REG, 0, SLJIT_IMM, 0));
#else
- sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(SW), SLJIT_IMM, SLJIT_FUNC_OFFSET(do_extuni_no_utf));
- add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, SLJIT_RETURN_REG, 0, SLJIT_IMM, 0));
+ sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(SW), SLJIT_IMM,
+ common->invalid_utf ? SLJIT_FUNC_OFFSET(do_extuni_utf_invalid) : SLJIT_FUNC_OFFSET(do_extuni_no_utf));
+ if (!common->utf || common->invalid_utf)
+ add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, SLJIT_RETURN_REG, 0, SLJIT_IMM, 0));
#endif
OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_RETURN_REG, 0);
@@ -9198,8 +8729,6 @@ if (common->utf && *cc == OP_REFI)
CMPTO(SLJIT_EQUAL, TMP1, 0, char1_reg, 0, loop);
// PH hacking
-//fprintf(stderr, "~~E\n");
-
OP1(SLJIT_MOV, TMP3, 0, TMP1, 0);
add_jump(compiler, &common->getucd, JUMP(SLJIT_FAST_CALL));
@@ -10759,10 +10288,23 @@ if (ket != OP_KET || bra != OP_BRA)
if (offset != 0)
stacksize = match_capture_common(common, stacksize, offset, private_data_ptr);
+/* Skip and count the other alternatives. */
+i = 1;
+while (*cc == OP_ALT)
+ {
+ cc += GET(cc, 1);
+ i++;
+ }
+
if (has_alternatives)
{
if (opcode != OP_ONCE)
- OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), SLJIT_IMM, 0);
+ {
+ if (i <= 3)
+ OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), SLJIT_IMM, 0);
+ else
+ BACKTRACK_AS(bracket_backtrack)->u.matching_put_label = sljit_emit_put_label(compiler, SLJIT_MEM1(STACK_TOP), STACK(stacksize));
+ }
if (ket != OP_KETRMAX)
BACKTRACK_AS(bracket_backtrack)->alternative_matchingpath = LABEL();
}
@@ -10851,9 +10393,6 @@ if (bra == OP_BRAMINZERO)
if ((ket != OP_KET && bra != OP_BRAMINZERO) || bra == OP_BRAZERO)
count_match(common);
-/* Skip the other alternatives. */
-while (*cc == OP_ALT)
- cc += GET(cc, 1);
cc += 1 + LINK_SIZE;
if (opcode == OP_ONCE)
@@ -11412,174 +10951,232 @@ switch(opcode)
JUMPTO(SLJIT_JUMP, label);
if (jump != NULL)
JUMPHERE(jump);
+ BACKTRACK_AS(char_iterator_backtrack)->matchingpath = LABEL();
+ break;
}
- else
- {
- charpos_enabled = FALSE;
- charpos_char = 0;
- charpos_othercasebit = 0;
-
- if ((type != OP_CHAR && type != OP_CHARI) && (*end == OP_CHAR || *end == OP_CHARI))
- {
- charpos_enabled = TRUE;
#ifdef SUPPORT_UNICODE
- charpos_enabled = !common->utf || !HAS_EXTRALEN(end[1]);
-#endif
- if (charpos_enabled && *end == OP_CHARI && char_has_othercase(common, end + 1))
- {
- charpos_othercasebit = char_get_othercase_bit(common, end + 1);
- if (charpos_othercasebit == 0)
- charpos_enabled = FALSE;
- }
-
- if (charpos_enabled)
- {
- charpos_char = end[1];
- /* Consumpe the OP_CHAR opcode. */
- end += 2;
-#if PCRE2_CODE_UNIT_WIDTH == 8
- SLJIT_ASSERT((charpos_othercasebit >> 8) == 0);
-#elif PCRE2_CODE_UNIT_WIDTH == 16 || PCRE2_CODE_UNIT_WIDTH == 32
- SLJIT_ASSERT((charpos_othercasebit >> 9) == 0);
- if ((charpos_othercasebit & 0x100) != 0)
- charpos_othercasebit = (charpos_othercasebit & 0xff) << 8;
+ else if (type == OP_ALLANY && !common->invalid_utf)
+#else
+ else if (type == OP_ALLANY)
#endif
- if (charpos_othercasebit != 0)
- charpos_char |= charpos_othercasebit;
-
- BACKTRACK_AS(char_iterator_backtrack)->u.charpos.enabled = TRUE;
- BACKTRACK_AS(char_iterator_backtrack)->u.charpos.chr = charpos_char;
- BACKTRACK_AS(char_iterator_backtrack)->u.charpos.othercasebit = charpos_othercasebit;
- }
- }
-
- if (charpos_enabled)
+ {
+ if (opcode == OP_STAR)
{
- if (opcode == OP_UPTO)
- OP1(SLJIT_MOV, tmp_base, tmp_offset, SLJIT_IMM, max + 1);
+ if (private_data_ptr == 0)
+ allocate_stack(common, 2);
- /* Search the first instance of charpos_char. */
- jump = JUMP(SLJIT_JUMP);
- label = LABEL();
- if (opcode == OP_UPTO)
- {
- OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1);
- add_jump(compiler, &backtrack->topbacktracks, JUMP(SLJIT_ZERO));
- }
- compile_char1_matchingpath(common, type, cc, &backtrack->topbacktracks, FALSE);
- if (fast_str_ptr != 0)
- OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0);
- JUMPHERE(jump);
+ OP1(SLJIT_MOV, base, offset0, STR_END, 0);
+ OP1(SLJIT_MOV, base, offset1, STR_PTR, 0);
- detect_partial_match(common, &backtrack->topbacktracks);
- OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));
- if (charpos_othercasebit != 0)
- OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, charpos_othercasebit);
- CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, charpos_char, label);
+ OP1(SLJIT_MOV, STR_PTR, 0, STR_END, 0);
+ process_partial_match(common);
+ if (fast_str_ptr != 0)
+ OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_END, 0);
+ BACKTRACK_AS(char_iterator_backtrack)->matchingpath = LABEL();
+ break;
+ }
+#ifdef SUPPORT_UNICODE
+ else if (!common->utf)
+#else
+ else
+#endif
+ {
if (private_data_ptr == 0)
allocate_stack(common, 2);
- OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
+
OP1(SLJIT_MOV, base, offset1, STR_PTR, 0);
- if (opcode == OP_UPTO)
- {
- OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1);
- add_jump(compiler, &no_match, JUMP(SLJIT_ZERO));
- }
+ OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(max));
- /* Search the last instance of charpos_char. */
- label = LABEL();
- compile_char1_matchingpath(common, type, cc, &no_match, FALSE);
- if (fast_str_ptr != 0)
- OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0);
- detect_partial_match(common, &no_match);
- OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));
- if (charpos_othercasebit != 0)
- OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, charpos_othercasebit);
- if (opcode == OP_STAR)
+ if (common->mode == PCRE2_JIT_COMPLETE)
{
- CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, charpos_char, label);
- OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
+ OP2(SLJIT_SUB | SLJIT_SET_GREATER, SLJIT_UNUSED, 0, STR_PTR, 0, STR_END, 0);
+ CMOV(SLJIT_GREATER, STR_PTR, STR_END, 0);
}
else
{
- jump = CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, charpos_char);
- OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
+ jump = CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, STR_END, 0);
+ process_partial_match(common);
JUMPHERE(jump);
}
- if (opcode == OP_UPTO)
- {
- OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1);
- JUMPTO(SLJIT_NOT_ZERO, label);
- }
- else
- JUMPTO(SLJIT_JUMP, label);
-
- set_jumps(no_match, LABEL());
- OP1(SLJIT_MOV, STR_PTR, 0, base, offset0);
- OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
+
+ if (fast_str_ptr != 0)
+ OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0);
+ BACKTRACK_AS(char_iterator_backtrack)->matchingpath = LABEL();
+ break;
}
-#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
- else if (common->utf)
+ }
+
+ charpos_enabled = FALSE;
+ charpos_char = 0;
+ charpos_othercasebit = 0;
+
+ if ((type != OP_CHAR && type != OP_CHARI) && (*end == OP_CHAR || *end == OP_CHARI))
+ {
+#ifdef SUPPORT_UNICODE
+ charpos_enabled = !common->utf || !HAS_EXTRALEN(end[1]);
+#else
+ charpos_enabled = TRUE;
+#endif
+ if (charpos_enabled && *end == OP_CHARI && char_has_othercase(common, end + 1))
{
- if (private_data_ptr == 0)
- allocate_stack(common, 2);
+ charpos_othercasebit = char_get_othercase_bit(common, end + 1);
+ if (charpos_othercasebit == 0)
+ charpos_enabled = FALSE;
+ }
- OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
- OP1(SLJIT_MOV, base, offset1, STR_PTR, 0);
+ if (charpos_enabled)
+ {
+ charpos_char = end[1];
+ /* Consumpe the OP_CHAR opcode. */
+ end += 2;
+#if PCRE2_CODE_UNIT_WIDTH == 8
+ SLJIT_ASSERT((charpos_othercasebit >> 8) == 0);
+#elif PCRE2_CODE_UNIT_WIDTH == 16 || PCRE2_CODE_UNIT_WIDTH == 32
+ SLJIT_ASSERT((charpos_othercasebit >> 9) == 0);
+ if ((charpos_othercasebit & 0x100) != 0)
+ charpos_othercasebit = (charpos_othercasebit & 0xff) << 8;
+#endif
+ if (charpos_othercasebit != 0)
+ charpos_char |= charpos_othercasebit;
- if (opcode == OP_UPTO)
- OP1(SLJIT_MOV, tmp_base, tmp_offset, SLJIT_IMM, max);
+ BACKTRACK_AS(char_iterator_backtrack)->u.charpos.enabled = TRUE;
+ BACKTRACK_AS(char_iterator_backtrack)->u.charpos.chr = charpos_char;
+ BACKTRACK_AS(char_iterator_backtrack)->u.charpos.othercasebit = charpos_othercasebit;
+ }
+ }
- label = LABEL();
- compile_char1_matchingpath(common, type, cc, &no_match, TRUE);
- OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
+ if (charpos_enabled)
+ {
+ if (opcode == OP_UPTO)
+ OP1(SLJIT_MOV, tmp_base, tmp_offset, SLJIT_IMM, max + 1);
- if (opcode == OP_UPTO)
- {
- OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1);
- JUMPTO(SLJIT_NOT_ZERO, label);
- }
- else
- JUMPTO(SLJIT_JUMP, label);
+ /* Search the first instance of charpos_char. */
+ jump = JUMP(SLJIT_JUMP);
+ label = LABEL();
+ if (opcode == OP_UPTO)
+ {
+ OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1);
+ add_jump(compiler, &backtrack->topbacktracks, JUMP(SLJIT_ZERO));
+ }
+ compile_char1_matchingpath(common, type, cc, &backtrack->topbacktracks, FALSE);
+ if (fast_str_ptr != 0)
+ OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0);
+ JUMPHERE(jump);
- set_jumps(no_match, LABEL());
- OP1(SLJIT_MOV, STR_PTR, 0, base, offset0);
- if (fast_str_ptr != 0)
- OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0);
+ detect_partial_match(common, &backtrack->topbacktracks);
+ OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));
+ if (charpos_othercasebit != 0)
+ OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, charpos_othercasebit);
+ CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, charpos_char, label);
+
+ if (private_data_ptr == 0)
+ allocate_stack(common, 2);
+ OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
+ OP1(SLJIT_MOV, base, offset1, STR_PTR, 0);
+ if (opcode == OP_UPTO)
+ {
+ OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1);
+ add_jump(compiler, &no_match, JUMP(SLJIT_ZERO));
+ }
+
+ /* Search the last instance of charpos_char. */
+ label = LABEL();
+ compile_char1_matchingpath(common, type, cc, &no_match, FALSE);
+ if (fast_str_ptr != 0)
+ OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0);
+ detect_partial_match(common, &no_match);
+ OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));
+ if (charpos_othercasebit != 0)
+ OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, charpos_othercasebit);
+ if (opcode == OP_STAR)
+ {
+ CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, charpos_char, label);
+ OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
}
-#endif
else
{
- if (private_data_ptr == 0)
- allocate_stack(common, 2);
+ jump = CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, charpos_char);
+ OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
+ JUMPHERE(jump);
+ }
- OP1(SLJIT_MOV, base, offset1, STR_PTR, 0);
- if (opcode == OP_UPTO)
- OP1(SLJIT_MOV, tmp_base, tmp_offset, SLJIT_IMM, max);
+ if (opcode == OP_UPTO)
+ {
+ OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1);
+ JUMPTO(SLJIT_NOT_ZERO, label);
+ }
+ else
+ JUMPTO(SLJIT_JUMP, label);
- label = LABEL();
- detect_partial_match(common, &no_match);
- compile_char1_matchingpath(common, type, cc, &no_char1_match, FALSE);
- if (opcode == OP_UPTO)
- {
- OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1);
- JUMPTO(SLJIT_NOT_ZERO, label);
- OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
- }
- else
- JUMPTO(SLJIT_JUMP, label);
+ set_jumps(no_match, LABEL());
+ OP1(SLJIT_MOV, STR_PTR, 0, base, offset0);
+ OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
+ OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
+ }
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
+ else if (common->utf)
+ {
+ if (private_data_ptr == 0)
+ allocate_stack(common, 2);
- set_jumps(no_char1_match, LABEL());
- OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
- set_jumps(no_match, LABEL());
- OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
- if (fast_str_ptr != 0)
- OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0);
+ OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
+ OP1(SLJIT_MOV, base, offset1, STR_PTR, 0);
+
+ if (opcode == OP_UPTO)
+ OP1(SLJIT_MOV, tmp_base, tmp_offset, SLJIT_IMM, max);
+
+ detect_partial_match(common, &no_match);
+ label = LABEL();
+ compile_char1_matchingpath(common, type, cc, &no_match, FALSE);
+ OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
+
+ if (opcode == OP_UPTO)
+ {
+ OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1);
+ add_jump(compiler, &no_match, JUMP(SLJIT_ZERO));
+ }
+
+ detect_partial_match_to(common, label);
+ OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
+
+ set_jumps(no_match, LABEL());
+ OP1(SLJIT_MOV, STR_PTR, 0, base, offset0);
+ if (fast_str_ptr != 0)
+ OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0);
+ }
+#endif
+ else
+ {
+ if (private_data_ptr == 0)
+ allocate_stack(common, 2);
+
+ OP1(SLJIT_MOV, base, offset1, STR_PTR, 0);
+ if (opcode == OP_UPTO)
+ OP1(SLJIT_MOV, tmp_base, tmp_offset, SLJIT_IMM, max);
+
+ detect_partial_match(common, &no_match);
+ label = LABEL();
+ compile_char1_matchingpath(common, type, cc, &no_char1_match, FALSE);
+ if (opcode == OP_UPTO)
+ {
+ OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1);
+ add_jump(compiler, &no_match, JUMP(SLJIT_ZERO));
}
+
+ detect_partial_match_to(common, label);
+ OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
+
+ set_jumps(no_char1_match, LABEL());
+ OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
+ set_jumps(no_match, LABEL());
+ OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
+ if (fast_str_ptr != 0)
+ OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0);
}
+
BACKTRACK_AS(char_iterator_backtrack)->matchingpath = LABEL();
break;
@@ -11616,25 +11213,47 @@ switch(opcode)
break;
case OP_POSSTAR:
+#if defined SUPPORT_UNICODE
+ if (type == OP_ALLANY && !common->invalid_utf)
+#else
+ if (type == OP_ALLANY)
+#endif
+ {
+ OP1(SLJIT_MOV, STR_PTR, 0, STR_END, 0);
+ process_partial_match(common);
+ if (fast_str_ptr != 0)
+ OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_END, 0);
+ break;
+ }
+
#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
if (common->utf)
{
OP1(SLJIT_MOV, tmp_base, tmp_offset, STR_PTR, 0);
+ detect_partial_match(common, &no_match);
label = LABEL();
- compile_char1_matchingpath(common, type, cc, &no_match, TRUE);
+ compile_char1_matchingpath(common, type, cc, &no_match, FALSE);
OP1(SLJIT_MOV, tmp_base, tmp_offset, STR_PTR, 0);
- JUMPTO(SLJIT_JUMP, label);
+ detect_partial_match_to(common, label);
+
set_jumps(no_match, LABEL());
OP1(SLJIT_MOV, STR_PTR, 0, tmp_base, tmp_offset);
if (fast_str_ptr != 0)
- OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0);
+ {
+ if (tmp_base == TMP3)
+ OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, TMP3, 0);
+ else
+ OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0);
+ }
break;
}
#endif
- label = LABEL();
detect_partial_match(common, &no_match);
+ label = LABEL();
compile_char1_matchingpath(common, type, cc, &no_char1_match, FALSE);
- JUMPTO(SLJIT_JUMP, label);
+ detect_partial_match_to(common, label);
+ OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
+
set_jumps(no_char1_match, LABEL());
OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
set_jumps(no_match, LABEL());
@@ -11649,23 +11268,52 @@ switch(opcode)
{
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), POSSESSIVE1, STR_PTR, 0);
OP1(SLJIT_MOV, tmp_base, tmp_offset, SLJIT_IMM, max);
+
+ detect_partial_match(common, &no_match);
label = LABEL();
- compile_char1_matchingpath(common, type, cc, &no_match, TRUE);
+ compile_char1_matchingpath(common, type, cc, &no_match, FALSE);
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), POSSESSIVE1, STR_PTR, 0);
OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1);
- JUMPTO(SLJIT_NOT_ZERO, label);
+ add_jump(compiler, &no_match, JUMP(SLJIT_ZERO));
+ detect_partial_match_to(common, label);
+
set_jumps(no_match, LABEL());
OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), POSSESSIVE1);
break;
}
#endif
+
+ if (type == OP_ALLANY)
+ {
+ OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(max));
+
+ if (common->mode == PCRE2_JIT_COMPLETE)
+ {
+ OP2(SLJIT_SUB | SLJIT_SET_GREATER, SLJIT_UNUSED, 0, STR_PTR, 0, STR_END, 0);
+ CMOV(SLJIT_GREATER, STR_PTR, STR_END, 0);
+ }
+ else
+ {
+ jump = CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, STR_END, 0);
+ process_partial_match(common);
+ JUMPHERE(jump);
+ }
+
+ if (fast_str_ptr != 0)
+ OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0);
+ break;
+ }
+
OP1(SLJIT_MOV, tmp_base, tmp_offset, SLJIT_IMM, max);
- label = LABEL();
+
detect_partial_match(common, &no_match);
+ label = LABEL();
compile_char1_matchingpath(common, type, cc, &no_char1_match, FALSE);
OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1);
- JUMPTO(SLJIT_NOT_ZERO, label);
+ add_jump(compiler, &no_match, JUMP(SLJIT_ZERO));
+ detect_partial_match_to(common, label);
OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
+
set_jumps(no_char1_match, LABEL());
OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
set_jumps(no_match, LABEL());
@@ -11719,8 +11367,15 @@ if (common->accept_label == NULL)
add_jump(compiler, &common->accept, CMP(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(0)));
else
CMPTO(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(0), common->accept_label);
-OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);
-OP1(SLJIT_MOV_U32, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, options));
+
+if (HAS_VIRTUAL_REGISTERS)
+ {
+ OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);
+ OP1(SLJIT_MOV_U32, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, options));
+ }
+else
+ OP1(SLJIT_MOV_U32, TMP2, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, options));
+
OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP2, 0, SLJIT_IMM, PCRE2_NOTEMPTY);
add_jump(compiler, &backtrack->topbacktracks, JUMP(SLJIT_NOT_ZERO));
OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP2, 0, SLJIT_IMM, PCRE2_NOTEMPTY_ATSTART);
@@ -11728,7 +11383,8 @@ if (common->accept_label == NULL)
add_jump(compiler, &common->accept, JUMP(SLJIT_ZERO));
else
JUMPTO(SLJIT_ZERO, common->accept_label);
-OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, str));
+
+OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(HAS_VIRTUAL_REGISTERS ? TMP1 : ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, str));
if (common->accept_label == NULL)
add_jump(compiler, &common->accept, CMP(SLJIT_NOT_EQUAL, TMP2, 0, STR_PTR, 0));
else
@@ -11778,10 +11434,11 @@ if (opcode == OP_SKIP)
if (opcode == OP_COMMIT_ARG || opcode == OP_PRUNE_ARG || opcode == OP_THEN_ARG)
{
- OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);
+ if (HAS_VIRTUAL_REGISTERS)
+ OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);
OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, (sljit_sw)(cc + 2));
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->mark_ptr, TMP2, 0);
- OP1(SLJIT_MOV, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, mark_ptr), TMP2, 0);
+ OP1(SLJIT_MOV, SLJIT_MEM1(HAS_VIRTUAL_REGISTERS ? TMP1 : ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, mark_ptr), TMP2, 0);
}
return ccend;
@@ -12072,11 +11729,12 @@ while (cc < ccend)
SLJIT_ASSERT(common->mark_ptr != 0);
OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), common->mark_ptr);
allocate_stack(common, common->has_skip_arg ? 5 : 1);
- OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);
+ if (HAS_VIRTUAL_REGISTERS)
+ OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);
OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(common->has_skip_arg ? 4 : 0), TMP2, 0);
OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, (sljit_sw)(cc + 2));
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->mark_ptr, TMP2, 0);
- OP1(SLJIT_MOV, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, mark_ptr), TMP2, 0);
+ OP1(SLJIT_MOV, SLJIT_MEM1(HAS_VIRTUAL_REGISTERS ? TMP1 : ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, mark_ptr), TMP2, 0);
if (common->has_skip_arg)
{
OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr);
@@ -12403,16 +12061,15 @@ PCRE2_SPTR ccprev;
PCRE2_UCHAR bra = OP_BRA;
PCRE2_UCHAR ket;
assert_backtrack *assert;
-sljit_uw *next_update_addr = NULL;
BOOL has_alternatives;
BOOL needs_control_head = FALSE;
struct sljit_jump *brazero = NULL;
-struct sljit_jump *alt1 = NULL;
-struct sljit_jump *alt2 = NULL;
+struct sljit_jump *next_alt = NULL;
struct sljit_jump *once = NULL;
struct sljit_jump *cond = NULL;
struct sljit_label *rmin_label = NULL;
struct sljit_label *exact_label = NULL;
+struct sljit_put_label *put_label = NULL;
if (*cc == OP_BRAZERO || *cc == OP_BRAMINZERO)
{
@@ -12561,7 +12218,7 @@ else if (SLJIT_UNLIKELY(opcode == OP_COND) || SLJIT_UNLIKELY(opcode == OP_SCOND)
free_stack(common, 1);
alt_max = 2;
- alt1 = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, sizeof(sljit_uw));
+ next_alt = CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, 0);
}
}
else if (has_alternatives)
@@ -12569,21 +12226,15 @@ else if (has_alternatives)
OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
free_stack(common, 1);
- if (alt_max > 4)
+ if (alt_max > 3)
{
- /* Table jump if alt_max is greater than 4. */
- next_update_addr = allocate_read_only_data(common, alt_max * sizeof(sljit_uw));
- if (SLJIT_UNLIKELY(next_update_addr == NULL))
- return;
- sljit_emit_ijump(compiler, SLJIT_JUMP, SLJIT_MEM1(TMP1), (sljit_sw)next_update_addr);
- add_label_addr(common, next_update_addr++);
+ sljit_emit_ijump(compiler, SLJIT_JUMP, TMP1, 0);
+
+ SLJIT_ASSERT(CURRENT_AS(bracket_backtrack)->u.matching_put_label);
+ sljit_set_put_label(CURRENT_AS(bracket_backtrack)->u.matching_put_label, LABEL());
}
else
- {
- if (alt_max == 4)
- alt2 = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 2 * sizeof(sljit_uw));
- alt1 = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, sizeof(sljit_uw));
- }
+ next_alt = CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, 0);
}
COMPILE_BACKTRACKINGPATH(current->top);
@@ -12620,7 +12271,7 @@ if (SLJIT_UNLIKELY(opcode == OP_COND) || SLJIT_UNLIKELY(opcode == OP_SCOND))
if (has_alternatives)
{
- alt_count = sizeof(sljit_uw);
+ alt_count = 1;
do
{
current->top = NULL;
@@ -12699,7 +12350,12 @@ if (has_alternatives)
stacksize = match_capture_common(common, stacksize, offset, private_data_ptr);
if (opcode != OP_ONCE)
- OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), SLJIT_IMM, alt_count);
+ {
+ if (alt_max <= 3)
+ OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), SLJIT_IMM, alt_count);
+ else
+ put_label = sljit_emit_put_label(compiler, SLJIT_MEM1(STACK_TOP), STACK(stacksize));
+ }
if (offset != 0 && ket == OP_KETRMAX && common->optimized_cbracket[offset >> 1] != 0)
{
@@ -12712,24 +12368,18 @@ if (has_alternatives)
if (opcode != OP_ONCE)
{
- if (alt_max > 4)
- add_label_addr(common, next_update_addr++);
- else
+ if (alt_max <= 3)
{
- if (alt_count != 2 * sizeof(sljit_uw))
- {
- JUMPHERE(alt1);
- if (alt_max == 3 && alt_count == sizeof(sljit_uw))
- alt2 = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 2 * sizeof(sljit_uw));
- }
- else
+ JUMPHERE(next_alt);
+ alt_count++;
+ if (alt_count < alt_max)
{
- JUMPHERE(alt2);
- if (alt_max == 4)
- alt1 = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 3 * sizeof(sljit_uw));
+ SLJIT_ASSERT(alt_count == 2 && alt_max == 3);
+ next_alt = CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, 1);
}
}
- alt_count += sizeof(sljit_uw);
+ else
+ sljit_set_put_label(put_label, LABEL());
}
COMPILE_BACKTRACKINGPATH(current->top);
@@ -13219,11 +12869,10 @@ int private_data_size = get_recurse_data_length(common, ccbegin, ccend, &needs_c
int alt_count, alt_max, local_size;
backtrack_common altbacktrack;
jump_list *match = NULL;
-sljit_uw *next_update_addr = NULL;
-struct sljit_jump *alt1 = NULL;
-struct sljit_jump *alt2 = NULL;
+struct sljit_jump *next_alt = NULL;
struct sljit_jump *accept_exit = NULL;
struct sljit_label *quit;
+struct sljit_put_label *put_label;
/* Recurse captures then. */
common->then_trap = NULL;
@@ -13284,7 +12933,12 @@ while (1)
OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), common->recursive_head_ptr);
if (alt_max > 1 || has_accept)
- OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_IMM, alt_count);
+ {
+ if (alt_max > 3)
+ put_label = sljit_emit_put_label(compiler, SLJIT_MEM1(STACK_TOP), STACK(1));
+ else
+ OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_IMM, alt_count);
+ }
add_jump(compiler, &match, JUMP(SLJIT_JUMP));
@@ -13298,7 +12952,7 @@ while (1)
sljit_emit_fast_enter(compiler, TMP1, 0);
if (has_accept)
- accept_exit = CMP(SLJIT_EQUAL, SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_IMM, alt_max * sizeof (sljit_sw));
+ accept_exit = CMP(SLJIT_EQUAL, SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_IMM, -1);
OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
/* Save return address. */
@@ -13311,44 +12965,30 @@ while (1)
OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(1));
free_stack(common, 2);
- if (alt_max > 4)
+ if (alt_max > 3)
{
- /* Table jump if alt_max is greater than 4. */
- next_update_addr = allocate_read_only_data(common, alt_max * sizeof(sljit_uw));
- if (SLJIT_UNLIKELY(next_update_addr == NULL))
- return;
- sljit_emit_ijump(compiler, SLJIT_JUMP, SLJIT_MEM1(TMP1), (sljit_sw)next_update_addr);
- add_label_addr(common, next_update_addr++);
+ sljit_emit_ijump(compiler, SLJIT_JUMP, TMP1, 0);
+ sljit_set_put_label(put_label, LABEL());
}
else
- {
- if (alt_max == 4)
- alt2 = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 2 * sizeof(sljit_uw));
- alt1 = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, sizeof(sljit_uw));
- }
+ next_alt = CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, 0);
}
else
free_stack(common, has_accept ? 2 : 1);
}
- else if (alt_max > 4)
- add_label_addr(common, next_update_addr++);
+ else if (alt_max > 3)
+ sljit_set_put_label(put_label, LABEL());
else
{
- if (alt_count != 2 * sizeof(sljit_uw))
- {
- JUMPHERE(alt1);
- if (alt_max == 3 && alt_count == sizeof(sljit_uw))
- alt2 = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 2 * sizeof(sljit_uw));
- }
- else
+ JUMPHERE(next_alt);
+ if (alt_count + 1 < alt_max)
{
- JUMPHERE(alt2);
- if (alt_max == 4)
- alt1 = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 3 * sizeof(sljit_uw));
+ SLJIT_ASSERT(alt_count == 1 && alt_max == 3);
+ next_alt = CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, 1);
}
}
- alt_count += sizeof(sljit_uw);
+ alt_count++;
compile_backtrackingpath(common, altbacktrack.top);
if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler)))
@@ -13409,7 +13049,7 @@ if (common->accept != NULL)
OP1(SLJIT_MOV, TMP2, 0, STACK_TOP, 0);
allocate_stack(common, 2);
- OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_IMM, alt_count);
+ OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_IMM, -1);
}
set_jumps(match, LABEL());
@@ -13444,7 +13084,6 @@ executable_functions *functions;
void *executable_func;
sljit_uw executable_size;
sljit_uw total_length;
-label_addr_list *label_addr;
struct sljit_label *mainloop_label = NULL;
struct sljit_label *continue_match_label;
struct sljit_label *empty_match_found_label = NULL;
@@ -13459,6 +13098,14 @@ struct sljit_jump *end_anchor_failed = NULL;
SLJIT_ASSERT(tables);
+#if HAS_VIRTUAL_REGISTERS == 1
+SLJIT_ASSERT(sljit_get_register_index(TMP3) < 0 && sljit_get_register_index(ARGUMENTS) < 0 && sljit_get_register_index(RETURN_ADDR) < 0);
+#elif HAS_VIRTUAL_REGISTERS == 0
+SLJIT_ASSERT(sljit_get_register_index(TMP3) >= 0 && sljit_get_register_index(ARGUMENTS) >= 0 && sljit_get_register_index(RETURN_ADDR) >= 0);
+#else
+#error "Invalid value for HAS_VIRTUAL_REGISTERS"
+#endif
+
memset(&rootbacktrack, 0, sizeof(backtrack_common));
memset(common, 0, sizeof(compiler_common));
common->re = re;
@@ -13476,6 +13123,7 @@ common->fcc = tables + fcc_offset;
common->lcc = (sljit_sw)(tables + lcc_offset);
common->mode = mode;
common->might_be_empty = re->minlength == 0;
+common->allow_empty_partial = (re->max_lookbehind > 0) || (re->flags & PCRE2_MATCH_EMPTY) != 0;
common->nltype = NLTYPE_FIXED;
switch(re->newline_convention)
{
@@ -13742,7 +13390,7 @@ if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler)))
sljit_free_compiler(compiler);
SLJIT_FREE(common->optimized_cbracket, allocator_data);
SLJIT_FREE(common->private_data_ptrs, allocator_data);
- PRIV(jit_free_rodata)(common->read_only_data_head, compiler->allocator_data);
+ PRIV(jit_free_rodata)(common->read_only_data_head, allocator_data);
return PCRE2_ERROR_NOMEMORY;
}
@@ -13796,7 +13444,7 @@ if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler)))
sljit_free_compiler(compiler);
SLJIT_FREE(common->optimized_cbracket, allocator_data);
SLJIT_FREE(common->private_data_ptrs, allocator_data);
- PRIV(jit_free_rodata)(common->read_only_data_head, compiler->allocator_data);
+ PRIV(jit_free_rodata)(common->read_only_data_head, allocator_data);
return PCRE2_ERROR_NOMEMORY;
}
@@ -13885,7 +13533,7 @@ while (common->currententry != NULL)
sljit_free_compiler(compiler);
SLJIT_FREE(common->optimized_cbracket, allocator_data);
SLJIT_FREE(common->private_data_ptrs, allocator_data);
- PRIV(jit_free_rodata)(common->read_only_data_head, compiler->allocator_data);
+ PRIV(jit_free_rodata)(common->read_only_data_head, allocator_data);
return PCRE2_ERROR_NOMEMORY;
}
flush_stubs(common);
@@ -14028,16 +13676,11 @@ SLJIT_FREE(common->private_data_ptrs, allocator_data);
executable_func = sljit_generate_code(compiler);
executable_size = sljit_get_generated_code_size(compiler);
-label_addr = common->label_addrs;
-while (label_addr != NULL)
- {
- *label_addr->update_addr = sljit_get_label_addr(label_addr->label);
- label_addr = label_addr->next;
- }
sljit_free_compiler(compiler);
+
if (executable_func == NULL)
{
- PRIV(jit_free_rodata)(common->read_only_data_head, compiler->allocator_data);
+ PRIV(jit_free_rodata)(common->read_only_data_head, allocator_data);
return PCRE2_ERROR_NOMEMORY;
}
@@ -14052,7 +13695,7 @@ else
/* This case is highly unlikely since we just recently
freed a lot of memory. Not impossible though. */
sljit_free_code(executable_func);
- PRIV(jit_free_rodata)(common->read_only_data_head, compiler->allocator_data);
+ PRIV(jit_free_rodata)(common->read_only_data_head, allocator_data);
return PCRE2_ERROR_NOMEMORY;
}
memset(functions, 0, sizeof(executable_functions));
@@ -14097,18 +13740,12 @@ Returns: 0: success or (*NOJIT) was used
PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
pcre2_jit_compile(pcre2_code *code, uint32_t options)
{
-#ifndef SUPPORT_JIT
-
-(void)code;
-(void)options;
-return PCRE2_ERROR_JIT_BADOPTION;
-
-#else /* SUPPORT_JIT */
-
pcre2_real_code *re = (pcre2_real_code *)code;
-executable_functions *functions;
-uint32_t excluded_options;
-int result;
+
+#ifdef SUPPORT_JIT
+executable_functions *functions = (executable_functions *)re->executable_jit;
+static int executable_allocator_is_working = 0;
+#endif
if (code == NULL)
return PCRE2_ERROR_NULL;
@@ -14116,30 +13753,98 @@ if (code == NULL)
if ((options & ~PUBLIC_JIT_COMPILE_OPTIONS) != 0)
return PCRE2_ERROR_JIT_BADOPTION;
+/* Support for invalid UTF was first introduced in JIT, with the option
+PCRE2_JIT_INVALID_UTF. Later, support was added to the interpreter, and the
+compile-time option PCRE2_MATCH_INVALID_UTF was created. This is now the
+preferred feature, with the earlier option deprecated. However, for backward
+compatibility, if the earlier option is set, it forces the new option so that
+if JIT matching falls back to the interpreter, there is still support for
+invalid UTF. However, if this function has already been successfully called
+without PCRE2_JIT_INVALID_UTF and without PCRE2_MATCH_INVALID_UTF (meaning that
+non-invalid-supporting JIT code was compiled), give an error.
+
+If in the future support for PCRE2_JIT_INVALID_UTF is withdrawn, the following
+actions are needed:
+
+ 1. Remove the definition from pcre2.h.in and from the list in
+ PUBLIC_JIT_COMPILE_OPTIONS above.
+
+ 2. Replace PCRE2_JIT_INVALID_UTF with a local flag in this module.
+
+ 3. Replace PCRE2_JIT_INVALID_UTF in pcre2_jit_test.c.
+
+ 4. Delete the following short block of code. The setting of "re" and
+ "functions" can be moved into the JIT-only block below, but if that is
+ done, (void)re and (void)functions will be needed in the non-JIT case, to
+ avoid compiler warnings.
+*/
+
+if ((options & PCRE2_JIT_INVALID_UTF) != 0)
+ {
+ if ((re->overall_options & PCRE2_MATCH_INVALID_UTF) == 0)
+ {
+#ifdef SUPPORT_JIT
+ if (functions != NULL) return PCRE2_ERROR_JIT_BADOPTION;
+#endif
+ re->overall_options |= PCRE2_MATCH_INVALID_UTF;
+ }
+ }
+
+/* The above tests are run with and without JIT support. This means that
+PCRE2_JIT_INVALID_UTF propagates back into the regex options (ensuring
+interpreter support) even in the absence of JIT. But now, if there is no JIT
+support, give an error return. */
+
+#ifndef SUPPORT_JIT
+return PCRE2_ERROR_JIT_BADOPTION;
+#else /* SUPPORT_JIT */
+
+/* There is JIT support. Do the necessary. */
+
if ((re->flags & PCRE2_NOJIT) != 0) return 0;
-functions = (executable_functions *)re->executable_jit;
+if (executable_allocator_is_working == 0)
+ {
+ /* Checks whether the executable allocator is working. This check
+ might run multiple times in multi-threaded environments, but the
+ result should not be affected by it. */
+ void *ptr = SLJIT_MALLOC_EXEC(32);
+
+ executable_allocator_is_working = -1;
+
+ if (ptr != NULL)
+ {
+ SLJIT_FREE_EXEC(((sljit_u8*)(ptr)) + SLJIT_EXEC_OFFSET(ptr));
+ executable_allocator_is_working = 1;
+ }
+ }
+
+if (executable_allocator_is_working < 0)
+ return PCRE2_ERROR_NOMEMORY;
+
+if ((re->overall_options & PCRE2_MATCH_INVALID_UTF) != 0)
+ options |= PCRE2_JIT_INVALID_UTF;
if ((options & PCRE2_JIT_COMPLETE) != 0 && (functions == NULL
|| functions->executable_funcs[0] == NULL)) {
- excluded_options = (PCRE2_JIT_PARTIAL_SOFT | PCRE2_JIT_PARTIAL_HARD);
- result = jit_compile(code, options & ~excluded_options);
+ uint32_t excluded_options = (PCRE2_JIT_PARTIAL_SOFT | PCRE2_JIT_PARTIAL_HARD);
+ int result = jit_compile(code, options & ~excluded_options);
if (result != 0)
return result;
}
if ((options & PCRE2_JIT_PARTIAL_SOFT) != 0 && (functions == NULL
|| functions->executable_funcs[1] == NULL)) {
- excluded_options = (PCRE2_JIT_COMPLETE | PCRE2_JIT_PARTIAL_HARD);
- result = jit_compile(code, options & ~excluded_options);
+ uint32_t excluded_options = (PCRE2_JIT_COMPLETE | PCRE2_JIT_PARTIAL_HARD);
+ int result = jit_compile(code, options & ~excluded_options);
if (result != 0)
return result;
}
if ((options & PCRE2_JIT_PARTIAL_HARD) != 0 && (functions == NULL
|| functions->executable_funcs[2] == NULL)) {
- excluded_options = (PCRE2_JIT_COMPLETE | PCRE2_JIT_PARTIAL_SOFT);
- result = jit_compile(code, options & ~excluded_options);
+ uint32_t excluded_options = (PCRE2_JIT_COMPLETE | PCRE2_JIT_PARTIAL_SOFT);
+ int result = jit_compile(code, options & ~excluded_options);
if (result != 0)
return result;
}
diff --git a/thirdparty/pcre2/src/pcre2_jit_match.c b/thirdparty/pcre2/src/pcre2_jit_match.c
index eee038644d..7e13b8cfee 100644
--- a/thirdparty/pcre2/src/pcre2_jit_match.c
+++ b/thirdparty/pcre2/src/pcre2_jit_match.c
@@ -74,7 +74,6 @@ Arguments:
options option bits
match_data points to a match_data block
mcontext points to a match context
- jit_stack points to a JIT stack
Returns: > 0 => success; value is the number of ovector pairs filled
= 0 => success, but ovector is not big enough
diff --git a/thirdparty/pcre2/src/pcre2_jit_neon_inc.h b/thirdparty/pcre2/src/pcre2_jit_neon_inc.h
new file mode 100644
index 0000000000..55b1f32ac9
--- /dev/null
+++ b/thirdparty/pcre2/src/pcre2_jit_neon_inc.h
@@ -0,0 +1,321 @@
+/*************************************************
+* Perl-Compatible Regular Expressions *
+*************************************************/
+
+/* PCRE is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
+
+ Written by Philip Hazel
+ This module by Zoltan Herczeg and Sebastian Pop
+ Original API code Copyright (c) 1997-2012 University of Cambridge
+ New API code Copyright (c) 2016-2019 University of Cambridge
+
+-----------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the name of the University of Cambridge nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+-----------------------------------------------------------------------------
+*/
+
+# if defined(FFCS)
+# if defined(FF_UTF)
+# define FF_FUN ffcs_utf
+# else
+# define FF_FUN ffcs
+# endif
+
+# elif defined(FFCS_2)
+# if defined(FF_UTF)
+# define FF_FUN ffcs_2_utf
+# else
+# define FF_FUN ffcs_2
+# endif
+
+# elif defined(FFCS_MASK)
+# if defined(FF_UTF)
+# define FF_FUN ffcs_mask_utf
+# else
+# define FF_FUN ffcs_mask
+# endif
+
+# elif defined(FFCPS_0)
+# if defined (FF_UTF)
+# define FF_FUN ffcps_0_utf
+# else
+# define FF_FUN ffcps_0
+# endif
+
+# elif defined (FFCPS_1)
+# if defined (FF_UTF)
+# define FF_FUN ffcps_1_utf
+# else
+# define FF_FUN ffcps_1
+# endif
+
+# elif defined (FFCPS_DEFAULT)
+# if defined (FF_UTF)
+# define FF_FUN ffcps_default_utf
+# else
+# define FF_FUN ffcps_default
+# endif
+# endif
+
+static sljit_u8* SLJIT_FUNC FF_FUN(sljit_u8 *str_end, sljit_u8 *str_ptr, sljit_uw offs1, sljit_uw offs2, sljit_uw chars)
+#undef FF_FUN
+{
+quad_word qw;
+int_char ic;
+ic.x = chars;
+
+#if defined(FFCS)
+sljit_u8 c1 = ic.c.c1;
+vect_t vc1 = VDUPQ(c1);
+
+#elif defined(FFCS_2)
+sljit_u8 c1 = ic.c.c1;
+vect_t vc1 = VDUPQ(c1);
+sljit_u8 c2 = ic.c.c2;
+vect_t vc2 = VDUPQ(c2);
+
+#elif defined(FFCS_MASK)
+sljit_u8 c1 = ic.c.c1;
+vect_t vc1 = VDUPQ(c1);
+sljit_u8 mask = ic.c.c2;
+vect_t vmask = VDUPQ(mask);
+#endif
+
+#if defined(FFCPS)
+compare_type compare1_type = compare_match1;
+compare_type compare2_type = compare_match1;
+vect_t cmp1a, cmp1b, cmp2a, cmp2b;
+const sljit_u32 diff = IN_UCHARS(offs1 - offs2);
+PCRE2_UCHAR char1a = ic.c.c1;
+PCRE2_UCHAR char2a = ic.c.c3;
+
+# ifdef FFCPS_CHAR1A2A
+cmp1a = VDUPQ(char1a);
+cmp2a = VDUPQ(char2a);
+# else
+PCRE2_UCHAR char1b = ic.c.c2;
+PCRE2_UCHAR char2b = ic.c.c4;
+if (char1a == char1b)
+ cmp1a = VDUPQ(char1a);
+else
+ {
+ sljit_u32 bit1 = char1a ^ char1b;
+ if (is_powerof2(bit1))
+ {
+ compare1_type = compare_match1i;
+ cmp1a = VDUPQ(char1a | bit1);
+ cmp1b = VDUPQ(bit1);
+ }
+ else
+ {
+ compare1_type = compare_match2;
+ cmp1a = VDUPQ(char1a);
+ cmp1b = VDUPQ(char1b);
+ }
+ }
+
+if (char2a == char2b)
+ cmp2a = VDUPQ(char2a);
+else
+ {
+ sljit_u32 bit2 = char2a ^ char2b;
+ if (is_powerof2(bit2))
+ {
+ compare2_type = compare_match1i;
+ cmp2a = VDUPQ(char2a | bit2);
+ cmp2b = VDUPQ(bit2);
+ }
+ else
+ {
+ compare2_type = compare_match2;
+ cmp2a = VDUPQ(char2a);
+ cmp2b = VDUPQ(char2b);
+ }
+ }
+# endif
+
+str_ptr += IN_UCHARS(offs1);
+#endif
+
+#if PCRE2_CODE_UNIT_WIDTH != 8
+vect_t char_mask = VDUPQ(0xff);
+#endif
+
+#if defined(FF_UTF)
+restart:;
+#endif
+
+#if defined(FFCPS)
+sljit_u8 *p1 = str_ptr - diff;
+#endif
+sljit_s32 align_offset = ((uint64_t)str_ptr & 0xf);
+str_ptr = (sljit_u8 *) ((uint64_t)str_ptr & ~0xf);
+vect_t data = VLD1Q(str_ptr);
+#if PCRE2_CODE_UNIT_WIDTH != 8
+data = VANDQ(data, char_mask);
+#endif
+
+#if defined(FFCS)
+vect_t eq = VCEQQ(data, vc1);
+
+#elif defined(FFCS_2)
+vect_t eq1 = VCEQQ(data, vc1);
+vect_t eq2 = VCEQQ(data, vc2);
+vect_t eq = VORRQ(eq1, eq2);
+
+#elif defined(FFCS_MASK)
+vect_t eq = VORRQ(data, vmask);
+eq = VCEQQ(eq, vc1);
+
+#elif defined(FFCPS)
+# if defined(FFCPS_DIFF1)
+vect_t prev_data = data;
+# endif
+
+vect_t data2;
+if (p1 < str_ptr)
+ {
+ data2 = VLD1Q(str_ptr - diff);
+#if PCRE2_CODE_UNIT_WIDTH != 8
+ data2 = VANDQ(data2, char_mask);
+#endif
+ }
+else
+ data2 = shift_left_n_lanes(data, offs1 - offs2);
+
+data = fast_forward_char_pair_compare(compare1_type, data, cmp1a, cmp1b);
+data2 = fast_forward_char_pair_compare(compare2_type, data2, cmp2a, cmp2b);
+vect_t eq = VANDQ(data, data2);
+#endif
+
+VST1Q(qw.mem, eq);
+/* Ignore matches before the first STR_PTR. */
+if (align_offset < 8)
+ {
+ qw.dw[0] >>= align_offset * 8;
+ if (qw.dw[0])
+ {
+ str_ptr += align_offset + __builtin_ctzll(qw.dw[0]) / 8;
+ goto match;
+ }
+ if (qw.dw[1])
+ {
+ str_ptr += 8 + __builtin_ctzll(qw.dw[1]) / 8;
+ goto match;
+ }
+ }
+else
+ {
+ qw.dw[1] >>= (align_offset - 8) * 8;
+ if (qw.dw[1])
+ {
+ str_ptr += align_offset + __builtin_ctzll(qw.dw[1]) / 8;
+ goto match;
+ }
+ }
+str_ptr += 16;
+
+while (str_ptr < str_end)
+ {
+ vect_t orig_data = VLD1Q(str_ptr);
+#if PCRE2_CODE_UNIT_WIDTH != 8
+ orig_data = VANDQ(orig_data, char_mask);
+#endif
+ data = orig_data;
+
+#if defined(FFCS)
+ eq = VCEQQ(data, vc1);
+
+#elif defined(FFCS_2)
+ eq1 = VCEQQ(data, vc1);
+ eq2 = VCEQQ(data, vc2);
+ eq = VORRQ(eq1, eq2);
+
+#elif defined(FFCS_MASK)
+ eq = VORRQ(data, vmask);
+ eq = VCEQQ(eq, vc1);
+#endif
+
+#if defined(FFCPS)
+# if defined (FFCPS_DIFF1)
+ data2 = VEXTQ(prev_data, data, VECTOR_FACTOR - 1);
+# else
+ data2 = VLD1Q(str_ptr - diff);
+# if PCRE2_CODE_UNIT_WIDTH != 8
+ data2 = VANDQ(data2, char_mask);
+# endif
+# endif
+
+# ifdef FFCPS_CHAR1A2A
+ data = VCEQQ(data, cmp1a);
+ data2 = VCEQQ(data2, cmp2a);
+# else
+ data = fast_forward_char_pair_compare(compare1_type, data, cmp1a, cmp1b);
+ data2 = fast_forward_char_pair_compare(compare2_type, data2, cmp2a, cmp2b);
+# endif
+
+ eq = VANDQ(data, data2);
+#endif
+
+ VST1Q(qw.mem, eq);
+ if (qw.dw[0])
+ str_ptr += __builtin_ctzll(qw.dw[0]) / 8;
+ else if (qw.dw[1])
+ str_ptr += 8 + __builtin_ctzll(qw.dw[1]) / 8;
+ else {
+ str_ptr += 16;
+#if defined (FFCPS_DIFF1)
+ prev_data = orig_data;
+#endif
+ continue;
+ }
+
+match:;
+ if (str_ptr >= str_end)
+ /* Failed match. */
+ return NULL;
+
+#if defined(FF_UTF)
+ if (utf_continue(str_ptr + IN_UCHARS(-offs1)))
+ {
+ /* Not a match. */
+ str_ptr += IN_UCHARS(1);
+ goto restart;
+ }
+#endif
+
+ /* Match. */
+#if defined (FFCPS)
+ str_ptr -= IN_UCHARS(offs1);
+#endif
+ return str_ptr;
+ }
+
+/* Failed match. */
+return NULL;
+}
diff --git a/thirdparty/pcre2/src/pcre2_jit_simd_inc.h b/thirdparty/pcre2/src/pcre2_jit_simd_inc.h
new file mode 100644
index 0000000000..f7d56b29f8
--- /dev/null
+++ b/thirdparty/pcre2/src/pcre2_jit_simd_inc.h
@@ -0,0 +1,993 @@
+/*************************************************
+* Perl-Compatible Regular Expressions *
+*************************************************/
+
+/* PCRE is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
+
+ Written by Philip Hazel
+ This module by Zoltan Herczeg
+ Original API code Copyright (c) 1997-2012 University of Cambridge
+ New API code Copyright (c) 2016-2019 University of Cambridge
+
+-----------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the name of the University of Cambridge nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+-----------------------------------------------------------------------------
+*/
+
+#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) && !(defined SUPPORT_VALGRIND)
+
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
+static struct sljit_jump *jump_if_utf_char_start(struct sljit_compiler *compiler, sljit_s32 reg)
+{
+#if PCRE2_CODE_UNIT_WIDTH == 8
+OP2(SLJIT_AND, reg, 0, reg, 0, SLJIT_IMM, 0xc0);
+return CMP(SLJIT_NOT_EQUAL, reg, 0, SLJIT_IMM, 0x80);
+#elif PCRE2_CODE_UNIT_WIDTH == 16
+OP2(SLJIT_AND, reg, 0, reg, 0, SLJIT_IMM, 0xfc00);
+return CMP(SLJIT_NOT_EQUAL, reg, 0, SLJIT_IMM, 0xdc00);
+#else
+#error "Unknown code width"
+#endif
+}
+#endif
+
+static sljit_s32 character_to_int32(PCRE2_UCHAR chr)
+{
+sljit_u32 value = chr;
+#if PCRE2_CODE_UNIT_WIDTH == 8
+#define SSE2_COMPARE_TYPE_INDEX 0
+return (sljit_s32)((value << 24) | (value << 16) | (value << 8) | value);
+#elif PCRE2_CODE_UNIT_WIDTH == 16
+#define SSE2_COMPARE_TYPE_INDEX 1
+return (sljit_s32)((value << 16) | value);
+#elif PCRE2_CODE_UNIT_WIDTH == 32
+#define SSE2_COMPARE_TYPE_INDEX 2
+return (sljit_s32)(value);
+#else
+#error "Unsupported unit width"
+#endif
+}
+
+static void load_from_mem_sse2(struct sljit_compiler *compiler, sljit_s32 dst_xmm_reg, sljit_s32 src_general_reg, sljit_s8 offset)
+{
+sljit_u8 instruction[5];
+
+SLJIT_ASSERT(dst_xmm_reg < 8);
+SLJIT_ASSERT(src_general_reg < 8);
+
+/* MOVDQA xmm1, xmm2/m128 */
+instruction[0] = ((sljit_u8)offset & 0xf) == 0 ? 0x66 : 0xf3;
+instruction[1] = 0x0f;
+instruction[2] = 0x6f;
+
+if (offset == 0)
+ {
+ instruction[3] = (dst_xmm_reg << 3) | src_general_reg;
+ sljit_emit_op_custom(compiler, instruction, 4);
+ return;
+ }
+
+instruction[3] = 0x40 | (dst_xmm_reg << 3) | src_general_reg;
+instruction[4] = (sljit_u8)offset;
+sljit_emit_op_custom(compiler, instruction, 5);
+}
+
+typedef enum {
+ sse2_compare_match1,
+ sse2_compare_match1i,
+ sse2_compare_match2,
+} sse2_compare_type;
+
+static void fast_forward_char_pair_sse2_compare(struct sljit_compiler *compiler, sse2_compare_type compare_type,
+ int step, sljit_s32 dst_ind, sljit_s32 cmp1_ind, sljit_s32 cmp2_ind, sljit_s32 tmp_ind)
+{
+sljit_u8 instruction[4];
+instruction[0] = 0x66;
+instruction[1] = 0x0f;
+
+SLJIT_ASSERT(step >= 0 && step <= 3);
+
+if (compare_type != sse2_compare_match2)
+ {
+ if (step == 0)
+ {
+ if (compare_type == sse2_compare_match1i)
+ {
+ /* POR xmm1, xmm2/m128 */
+ /* instruction[0] = 0x66; */
+ /* instruction[1] = 0x0f; */
+ instruction[2] = 0xeb;
+ instruction[3] = 0xc0 | (dst_ind << 3) | cmp2_ind;
+ sljit_emit_op_custom(compiler, instruction, 4);
+ }
+ return;
+ }
+
+ if (step != 2)
+ return;
+
+ /* PCMPEQB/W/D xmm1, xmm2/m128 */
+ /* instruction[0] = 0x66; */
+ /* instruction[1] = 0x0f; */
+ instruction[2] = 0x74 + SSE2_COMPARE_TYPE_INDEX;
+ instruction[3] = 0xc0 | (dst_ind << 3) | cmp1_ind;
+ sljit_emit_op_custom(compiler, instruction, 4);
+ return;
+ }
+
+switch (step)
+ {
+ case 0:
+ /* MOVDQA xmm1, xmm2/m128 */
+ /* instruction[0] = 0x66; */
+ /* instruction[1] = 0x0f; */
+ instruction[2] = 0x6f;
+ instruction[3] = 0xc0 | (tmp_ind << 3) | dst_ind;
+ sljit_emit_op_custom(compiler, instruction, 4);
+ return;
+
+ case 1:
+ /* PCMPEQB/W/D xmm1, xmm2/m128 */
+ /* instruction[0] = 0x66; */
+ /* instruction[1] = 0x0f; */
+ instruction[2] = 0x74 + SSE2_COMPARE_TYPE_INDEX;
+ instruction[3] = 0xc0 | (dst_ind << 3) | cmp1_ind;
+ sljit_emit_op_custom(compiler, instruction, 4);
+ return;
+
+ case 2:
+ /* PCMPEQB/W/D xmm1, xmm2/m128 */
+ /* instruction[0] = 0x66; */
+ /* instruction[1] = 0x0f; */
+ instruction[2] = 0x74 + SSE2_COMPARE_TYPE_INDEX;
+ instruction[3] = 0xc0 | (tmp_ind << 3) | cmp2_ind;
+ sljit_emit_op_custom(compiler, instruction, 4);
+ return;
+
+ case 3:
+ /* POR xmm1, xmm2/m128 */
+ /* instruction[0] = 0x66; */
+ /* instruction[1] = 0x0f; */
+ instruction[2] = 0xeb;
+ instruction[3] = 0xc0 | (dst_ind << 3) | tmp_ind;
+ sljit_emit_op_custom(compiler, instruction, 4);
+ return;
+ }
+}
+
+#define JIT_HAS_FAST_FORWARD_CHAR_SIMD (sljit_has_cpu_feature(SLJIT_HAS_SSE2))
+
+static void fast_forward_char_simd(compiler_common *common, PCRE2_UCHAR char1, PCRE2_UCHAR char2, sljit_s32 offset)
+{
+DEFINE_COMPILER;
+struct sljit_label *start;
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
+struct sljit_label *restart;
+#endif
+struct sljit_jump *quit;
+struct sljit_jump *partial_quit[2];
+sse2_compare_type compare_type = sse2_compare_match1;
+sljit_u8 instruction[8];
+sljit_s32 tmp1_reg_ind = sljit_get_register_index(TMP1);
+sljit_s32 str_ptr_reg_ind = sljit_get_register_index(STR_PTR);
+sljit_s32 data_ind = 0;
+sljit_s32 tmp_ind = 1;
+sljit_s32 cmp1_ind = 2;
+sljit_s32 cmp2_ind = 3;
+sljit_u32 bit = 0;
+int i;
+
+SLJIT_UNUSED_ARG(offset);
+
+if (char1 != char2)
+ {
+ bit = char1 ^ char2;
+ compare_type = sse2_compare_match1i;
+
+ if (!is_powerof2(bit))
+ {
+ bit = 0;
+ compare_type = sse2_compare_match2;
+ }
+ }
+
+partial_quit[0] = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0);
+if (common->mode == PCRE2_JIT_COMPLETE)
+ add_jump(compiler, &common->failed_match, partial_quit[0]);
+
+/* First part (unaligned start) */
+
+OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, character_to_int32(char1 | bit));
+
+SLJIT_ASSERT(tmp1_reg_ind < 8);
+
+/* MOVD xmm, r/m32 */
+instruction[0] = 0x66;
+instruction[1] = 0x0f;
+instruction[2] = 0x6e;
+instruction[3] = 0xc0 | (cmp1_ind << 3) | tmp1_reg_ind;
+sljit_emit_op_custom(compiler, instruction, 4);
+
+if (char1 != char2)
+ {
+ OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, character_to_int32(bit != 0 ? bit : char2));
+
+ /* MOVD xmm, r/m32 */
+ instruction[3] = 0xc0 | (cmp2_ind << 3) | tmp1_reg_ind;
+ sljit_emit_op_custom(compiler, instruction, 4);
+ }
+
+OP1(SLJIT_MOV, TMP2, 0, STR_PTR, 0);
+
+/* PSHUFD xmm1, xmm2/m128, imm8 */
+/* instruction[0] = 0x66; */
+/* instruction[1] = 0x0f; */
+instruction[2] = 0x70;
+instruction[3] = 0xc0 | (cmp1_ind << 3) | cmp1_ind;
+instruction[4] = 0;
+sljit_emit_op_custom(compiler, instruction, 5);
+
+if (char1 != char2)
+ {
+ /* PSHUFD xmm1, xmm2/m128, imm8 */
+ instruction[3] = 0xc0 | (cmp2_ind << 3) | cmp2_ind;
+ sljit_emit_op_custom(compiler, instruction, 5);
+ }
+
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
+restart = LABEL();
+#endif
+OP2(SLJIT_AND, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, ~0xf);
+OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xf);
+
+load_from_mem_sse2(compiler, data_ind, str_ptr_reg_ind, 0);
+for (i = 0; i < 4; i++)
+ fast_forward_char_pair_sse2_compare(compiler, compare_type, i, data_ind, cmp1_ind, cmp2_ind, tmp_ind);
+
+/* PMOVMSKB reg, xmm */
+/* instruction[0] = 0x66; */
+/* instruction[1] = 0x0f; */
+instruction[2] = 0xd7;
+instruction[3] = 0xc0 | (tmp1_reg_ind << 3) | data_ind;
+sljit_emit_op_custom(compiler, instruction, 4);
+
+OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP2, 0);
+OP2(SLJIT_LSHR, TMP1, 0, TMP1, 0, TMP2, 0);
+
+quit = CMP(SLJIT_NOT_ZERO, TMP1, 0, SLJIT_IMM, 0);
+
+OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, TMP2, 0);
+
+/* Second part (aligned) */
+start = LABEL();
+
+OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, 16);
+
+partial_quit[1] = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0);
+if (common->mode == PCRE2_JIT_COMPLETE)
+ add_jump(compiler, &common->failed_match, partial_quit[1]);
+
+load_from_mem_sse2(compiler, data_ind, str_ptr_reg_ind, 0);
+for (i = 0; i < 4; i++)
+ fast_forward_char_pair_sse2_compare(compiler, compare_type, i, data_ind, cmp1_ind, cmp2_ind, tmp_ind);
+
+/* PMOVMSKB reg, xmm */
+/* instruction[0] = 0x66; */
+/* instruction[1] = 0x0f; */
+instruction[2] = 0xd7;
+instruction[3] = 0xc0 | (tmp1_reg_ind << 3) | data_ind;
+sljit_emit_op_custom(compiler, instruction, 4);
+
+CMPTO(SLJIT_ZERO, TMP1, 0, SLJIT_IMM, 0, start);
+
+JUMPHERE(quit);
+
+/* BSF r32, r/m32 */
+instruction[0] = 0x0f;
+instruction[1] = 0xbc;
+instruction[2] = 0xc0 | (tmp1_reg_ind << 3) | tmp1_reg_ind;
+sljit_emit_op_custom(compiler, instruction, 3);
+
+OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0);
+
+if (common->mode != PCRE2_JIT_COMPLETE)
+ {
+ JUMPHERE(partial_quit[0]);
+ JUMPHERE(partial_quit[1]);
+ OP2(SLJIT_SUB | SLJIT_SET_GREATER, SLJIT_UNUSED, 0, STR_PTR, 0, STR_END, 0);
+ CMOV(SLJIT_GREATER, STR_PTR, STR_END, 0);
+ }
+else
+ add_jump(compiler, &common->failed_match, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0));
+
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
+if (common->utf && offset > 0)
+ {
+ SLJIT_ASSERT(common->mode == PCRE2_JIT_COMPLETE);
+
+ OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-offset));
+
+ quit = jump_if_utf_char_start(compiler, TMP1);
+
+ OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
+ add_jump(compiler, &common->failed_match, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0));
+ OP1(SLJIT_MOV, TMP2, 0, STR_PTR, 0);
+ JUMPTO(SLJIT_JUMP, restart);
+
+ JUMPHERE(quit);
+ }
+#endif
+}
+
+#ifndef _WIN64
+
+static SLJIT_INLINE sljit_u32 max_fast_forward_char_pair_offset(void)
+{
+#if PCRE2_CODE_UNIT_WIDTH == 8
+return 15;
+#elif PCRE2_CODE_UNIT_WIDTH == 16
+return 7;
+#elif PCRE2_CODE_UNIT_WIDTH == 32
+return 3;
+#else
+#error "Unsupported unit width"
+#endif
+}
+
+#define JIT_HAS_FAST_FORWARD_CHAR_PAIR_SIMD (sljit_has_cpu_feature(SLJIT_HAS_SSE2))
+
+static void fast_forward_char_pair_simd(compiler_common *common, sljit_s32 offs1,
+ PCRE2_UCHAR char1a, PCRE2_UCHAR char1b, sljit_s32 offs2, PCRE2_UCHAR char2a, PCRE2_UCHAR char2b)
+{
+DEFINE_COMPILER;
+sse2_compare_type compare1_type = sse2_compare_match1;
+sse2_compare_type compare2_type = sse2_compare_match1;
+sljit_u32 bit1 = 0;
+sljit_u32 bit2 = 0;
+sljit_u32 diff = IN_UCHARS(offs1 - offs2);
+sljit_s32 tmp1_reg_ind = sljit_get_register_index(TMP1);
+sljit_s32 tmp2_reg_ind = sljit_get_register_index(TMP2);
+sljit_s32 str_ptr_reg_ind = sljit_get_register_index(STR_PTR);
+sljit_s32 data1_ind = 0;
+sljit_s32 data2_ind = 1;
+sljit_s32 tmp1_ind = 2;
+sljit_s32 tmp2_ind = 3;
+sljit_s32 cmp1a_ind = 4;
+sljit_s32 cmp1b_ind = 5;
+sljit_s32 cmp2a_ind = 6;
+sljit_s32 cmp2b_ind = 7;
+struct sljit_label *start;
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
+struct sljit_label *restart;
+#endif
+struct sljit_jump *jump[2];
+sljit_u8 instruction[8];
+int i;
+
+SLJIT_ASSERT(common->mode == PCRE2_JIT_COMPLETE && offs1 > offs2);
+SLJIT_ASSERT(diff <= IN_UCHARS(max_fast_forward_char_pair_offset()));
+SLJIT_ASSERT(tmp1_reg_ind < 8 && tmp2_reg_ind == 1);
+
+/* Initialize. */
+if (common->match_end_ptr != 0)
+ {
+ OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr);
+ OP1(SLJIT_MOV, TMP3, 0, STR_END, 0);
+ OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(offs1 + 1));
+
+ OP2(SLJIT_SUB | SLJIT_SET_LESS, SLJIT_UNUSED, 0, TMP1, 0, STR_END, 0);
+ CMOV(SLJIT_LESS, STR_END, TMP1, 0);
+ }
+
+OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(offs1));
+add_jump(compiler, &common->failed_match, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0));
+
+/* MOVD xmm, r/m32 */
+instruction[0] = 0x66;
+instruction[1] = 0x0f;
+instruction[2] = 0x6e;
+
+if (char1a == char1b)
+ OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, character_to_int32(char1a));
+else
+ {
+ bit1 = char1a ^ char1b;
+ if (is_powerof2(bit1))
+ {
+ compare1_type = sse2_compare_match1i;
+ OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, character_to_int32(char1a | bit1));
+ OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, character_to_int32(bit1));
+ }
+ else
+ {
+ compare1_type = sse2_compare_match2;
+ bit1 = 0;
+ OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, character_to_int32(char1a));
+ OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, character_to_int32(char1b));
+ }
+ }
+
+instruction[3] = 0xc0 | (cmp1a_ind << 3) | tmp1_reg_ind;
+sljit_emit_op_custom(compiler, instruction, 4);
+
+if (char1a != char1b)
+ {
+ instruction[3] = 0xc0 | (cmp1b_ind << 3) | tmp2_reg_ind;
+ sljit_emit_op_custom(compiler, instruction, 4);
+ }
+
+if (char2a == char2b)
+ OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, character_to_int32(char2a));
+else
+ {
+ bit2 = char2a ^ char2b;
+ if (is_powerof2(bit2))
+ {
+ compare2_type = sse2_compare_match1i;
+ OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, character_to_int32(char2a | bit2));
+ OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, character_to_int32(bit2));
+ }
+ else
+ {
+ compare2_type = sse2_compare_match2;
+ bit2 = 0;
+ OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, character_to_int32(char2a));
+ OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, character_to_int32(char2b));
+ }
+ }
+
+instruction[3] = 0xc0 | (cmp2a_ind << 3) | tmp1_reg_ind;
+sljit_emit_op_custom(compiler, instruction, 4);
+
+if (char2a != char2b)
+ {
+ instruction[3] = 0xc0 | (cmp2b_ind << 3) | tmp2_reg_ind;
+ sljit_emit_op_custom(compiler, instruction, 4);
+ }
+
+/* PSHUFD xmm1, xmm2/m128, imm8 */
+/* instruction[0] = 0x66; */
+/* instruction[1] = 0x0f; */
+instruction[2] = 0x70;
+instruction[4] = 0;
+
+instruction[3] = 0xc0 | (cmp1a_ind << 3) | cmp1a_ind;
+sljit_emit_op_custom(compiler, instruction, 5);
+
+if (char1a != char1b)
+ {
+ instruction[3] = 0xc0 | (cmp1b_ind << 3) | cmp1b_ind;
+ sljit_emit_op_custom(compiler, instruction, 5);
+ }
+
+instruction[3] = 0xc0 | (cmp2a_ind << 3) | cmp2a_ind;
+sljit_emit_op_custom(compiler, instruction, 5);
+
+if (char2a != char2b)
+ {
+ instruction[3] = 0xc0 | (cmp2b_ind << 3) | cmp2b_ind;
+ sljit_emit_op_custom(compiler, instruction, 5);
+ }
+
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
+restart = LABEL();
+#endif
+
+OP2(SLJIT_SUB, TMP1, 0, STR_PTR, 0, SLJIT_IMM, diff);
+OP1(SLJIT_MOV, TMP2, 0, STR_PTR, 0);
+OP2(SLJIT_AND, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, ~0xf);
+
+load_from_mem_sse2(compiler, data1_ind, str_ptr_reg_ind, 0);
+
+jump[0] = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, STR_PTR, 0);
+
+load_from_mem_sse2(compiler, data2_ind, str_ptr_reg_ind, -(sljit_s8)diff);
+jump[1] = JUMP(SLJIT_JUMP);
+
+JUMPHERE(jump[0]);
+
+/* MOVDQA xmm1, xmm2/m128 */
+/* instruction[0] = 0x66; */
+/* instruction[1] = 0x0f; */
+instruction[2] = 0x6f;
+instruction[3] = 0xc0 | (data2_ind << 3) | data1_ind;
+sljit_emit_op_custom(compiler, instruction, 4);
+
+/* PSLLDQ xmm1, imm8 */
+/* instruction[0] = 0x66; */
+/* instruction[1] = 0x0f; */
+instruction[2] = 0x73;
+instruction[3] = 0xc0 | (7 << 3) | data2_ind;
+instruction[4] = diff;
+sljit_emit_op_custom(compiler, instruction, 5);
+
+JUMPHERE(jump[1]);
+
+OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xf);
+
+for (i = 0; i < 4; i++)
+ {
+ fast_forward_char_pair_sse2_compare(compiler, compare2_type, i, data2_ind, cmp2a_ind, cmp2b_ind, tmp2_ind);
+ fast_forward_char_pair_sse2_compare(compiler, compare1_type, i, data1_ind, cmp1a_ind, cmp1b_ind, tmp1_ind);
+ }
+
+/* PAND xmm1, xmm2/m128 */
+/* instruction[0] = 0x66; */
+/* instruction[1] = 0x0f; */
+instruction[2] = 0xdb;
+instruction[3] = 0xc0 | (data1_ind << 3) | data2_ind;
+sljit_emit_op_custom(compiler, instruction, 4);
+
+/* PMOVMSKB reg, xmm */
+/* instruction[0] = 0x66; */
+/* instruction[1] = 0x0f; */
+instruction[2] = 0xd7;
+instruction[3] = 0xc0 | (tmp1_reg_ind << 3) | 0;
+sljit_emit_op_custom(compiler, instruction, 4);
+
+/* Ignore matches before the first STR_PTR. */
+OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP2, 0);
+OP2(SLJIT_LSHR, TMP1, 0, TMP1, 0, TMP2, 0);
+
+jump[0] = CMP(SLJIT_NOT_ZERO, TMP1, 0, SLJIT_IMM, 0);
+
+OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, TMP2, 0);
+
+/* Main loop. */
+start = LABEL();
+
+OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, 16);
+add_jump(compiler, &common->failed_match, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0));
+
+load_from_mem_sse2(compiler, data1_ind, str_ptr_reg_ind, 0);
+load_from_mem_sse2(compiler, data2_ind, str_ptr_reg_ind, -(sljit_s8)diff);
+
+for (i = 0; i < 4; i++)
+ {
+ fast_forward_char_pair_sse2_compare(compiler, compare1_type, i, data1_ind, cmp1a_ind, cmp1b_ind, tmp2_ind);
+ fast_forward_char_pair_sse2_compare(compiler, compare2_type, i, data2_ind, cmp2a_ind, cmp2b_ind, tmp1_ind);
+ }
+
+/* PAND xmm1, xmm2/m128 */
+/* instruction[0] = 0x66; */
+/* instruction[1] = 0x0f; */
+instruction[2] = 0xdb;
+instruction[3] = 0xc0 | (data1_ind << 3) | data2_ind;
+sljit_emit_op_custom(compiler, instruction, 4);
+
+/* PMOVMSKB reg, xmm */
+/* instruction[0] = 0x66; */
+/* instruction[1] = 0x0f; */
+instruction[2] = 0xd7;
+instruction[3] = 0xc0 | (tmp1_reg_ind << 3) | 0;
+sljit_emit_op_custom(compiler, instruction, 4);
+
+CMPTO(SLJIT_ZERO, TMP1, 0, SLJIT_IMM, 0, start);
+
+JUMPHERE(jump[0]);
+
+/* BSF r32, r/m32 */
+instruction[0] = 0x0f;
+instruction[1] = 0xbc;
+instruction[2] = 0xc0 | (tmp1_reg_ind << 3) | tmp1_reg_ind;
+sljit_emit_op_custom(compiler, instruction, 3);
+
+OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0);
+
+add_jump(compiler, &common->failed_match, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0));
+
+if (common->match_end_ptr != 0)
+ OP1(SLJIT_MOV, STR_END, 0, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr);
+
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
+if (common->utf)
+ {
+ OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-offs1));
+
+ jump[0] = jump_if_utf_char_start(compiler, TMP1);
+
+ OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
+ CMPTO(SLJIT_LESS, STR_PTR, 0, STR_END, 0, restart);
+
+ add_jump(compiler, &common->failed_match, JUMP(SLJIT_JUMP));
+
+ JUMPHERE(jump[0]);
+ }
+#endif
+
+OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(offs1));
+
+if (common->match_end_ptr != 0)
+ OP1(SLJIT_MOV, STR_END, 0, TMP3, 0);
+}
+
+#endif /* !_WIN64 */
+
+#undef SSE2_COMPARE_TYPE_INDEX
+
+#endif /* SLJIT_CONFIG_X86 && !SUPPORT_VALGRIND */
+
+#if (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64 && (defined __ARM_NEON || defined __ARM_NEON__))
+
+#include <arm_neon.h>
+
+typedef union {
+ unsigned int x;
+ struct { unsigned char c1, c2, c3, c4; } c;
+} int_char;
+
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
+static SLJIT_INLINE int utf_continue(sljit_u8 *s)
+{
+#if PCRE2_CODE_UNIT_WIDTH == 8
+return (*s & 0xc0) == 0x80;
+#elif PCRE2_CODE_UNIT_WIDTH == 16
+return (*s & 0xfc00) == 0xdc00;
+#else
+#error "Unknown code width"
+#endif
+}
+#endif /* SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 */
+
+#if PCRE2_CODE_UNIT_WIDTH == 8
+# define VECTOR_FACTOR 16
+# define vect_t uint8x16_t
+# define VLD1Q(X) vld1q_u8((sljit_u8 *)(X))
+# define VCEQQ vceqq_u8
+# define VORRQ vorrq_u8
+# define VST1Q vst1q_u8
+# define VDUPQ vdupq_n_u8
+# define VEXTQ vextq_u8
+# define VANDQ vandq_u8
+typedef union {
+ uint8_t mem[16];
+ uint64_t dw[2];
+} quad_word;
+#elif PCRE2_CODE_UNIT_WIDTH == 16
+# define VECTOR_FACTOR 8
+# define vect_t uint16x8_t
+# define VLD1Q(X) vld1q_u16((sljit_u16 *)(X))
+# define VCEQQ vceqq_u16
+# define VORRQ vorrq_u16
+# define VST1Q vst1q_u16
+# define VDUPQ vdupq_n_u16
+# define VEXTQ vextq_u16
+# define VANDQ vandq_u16
+typedef union {
+ uint16_t mem[8];
+ uint64_t dw[2];
+} quad_word;
+#else
+# define VECTOR_FACTOR 4
+# define vect_t uint32x4_t
+# define VLD1Q(X) vld1q_u32((sljit_u32 *)(X))
+# define VCEQQ vceqq_u32
+# define VORRQ vorrq_u32
+# define VST1Q vst1q_u32
+# define VDUPQ vdupq_n_u32
+# define VEXTQ vextq_u32
+# define VANDQ vandq_u32
+typedef union {
+ uint32_t mem[4];
+ uint64_t dw[2];
+} quad_word;
+#endif
+
+#define FFCS
+#include "pcre2_jit_neon_inc.h"
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
+# define FF_UTF
+# include "pcre2_jit_neon_inc.h"
+# undef FF_UTF
+#endif
+#undef FFCS
+
+#define FFCS_2
+#include "pcre2_jit_neon_inc.h"
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
+# define FF_UTF
+# include "pcre2_jit_neon_inc.h"
+# undef FF_UTF
+#endif
+#undef FFCS_2
+
+#define FFCS_MASK
+#include "pcre2_jit_neon_inc.h"
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
+# define FF_UTF
+# include "pcre2_jit_neon_inc.h"
+# undef FF_UTF
+#endif
+#undef FFCS_MASK
+
+#define JIT_HAS_FAST_FORWARD_CHAR_SIMD 1
+
+static void fast_forward_char_simd(compiler_common *common, PCRE2_UCHAR char1, PCRE2_UCHAR char2, sljit_s32 offset)
+{
+DEFINE_COMPILER;
+int_char ic;
+struct sljit_jump *partial_quit;
+/* Save temporary registers. */
+OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS0, STR_PTR, 0);
+OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS1, TMP3, 0);
+
+/* Prepare function arguments */
+OP1(SLJIT_MOV, SLJIT_R0, 0, STR_END, 0);
+OP1(SLJIT_MOV, SLJIT_R1, 0, STR_PTR, 0);
+OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, offset);
+
+if (char1 == char2)
+ {
+ ic.c.c1 = char1;
+ ic.c.c2 = char2;
+ OP1(SLJIT_MOV, SLJIT_R4, 0, SLJIT_IMM, ic.x);
+
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
+ if (common->utf && offset > 0)
+ sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(UW) | SLJIT_ARG3(UW) | SLJIT_ARG4(UW),
+ SLJIT_IMM, SLJIT_FUNC_OFFSET(ffcs_utf));
+ else
+ sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(UW) | SLJIT_ARG3(UW) | SLJIT_ARG4(UW),
+ SLJIT_IMM, SLJIT_FUNC_OFFSET(ffcs));
+#else
+ sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(UW) | SLJIT_ARG3(UW) | SLJIT_ARG4(UW),
+ SLJIT_IMM, SLJIT_FUNC_OFFSET(ffcs));
+#endif
+ }
+else
+ {
+ PCRE2_UCHAR mask = char1 ^ char2;
+ if (is_powerof2(mask))
+ {
+ ic.c.c1 = char1 | mask;
+ ic.c.c2 = mask;
+ OP1(SLJIT_MOV, SLJIT_R4, 0, SLJIT_IMM, ic.x);
+
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
+ if (common->utf && offset > 0)
+ sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(UW) | SLJIT_ARG3(UW) | SLJIT_ARG4(UW),
+ SLJIT_IMM, SLJIT_FUNC_OFFSET(ffcs_mask_utf));
+ else
+ sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(UW) | SLJIT_ARG3(UW) | SLJIT_ARG4(UW),
+ SLJIT_IMM, SLJIT_FUNC_OFFSET(ffcs_mask));
+#else
+ sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(UW) | SLJIT_ARG3(UW) | SLJIT_ARG4(UW),
+ SLJIT_IMM, SLJIT_FUNC_OFFSET(ffcs_mask));
+#endif
+ }
+ else
+ {
+ ic.c.c1 = char1;
+ ic.c.c2 = char2;
+ OP1(SLJIT_MOV, SLJIT_R4, 0, SLJIT_IMM, ic.x);
+
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
+ if (common->utf && offset > 0)
+ sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(UW) | SLJIT_ARG3(UW) | SLJIT_ARG4(UW),
+ SLJIT_IMM, SLJIT_FUNC_OFFSET(ffcs_2_utf));
+ else
+ sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(UW) | SLJIT_ARG3(UW) | SLJIT_ARG4(UW),
+ SLJIT_IMM, SLJIT_FUNC_OFFSET(ffcs_2));
+#else
+ sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(UW) | SLJIT_ARG3(UW) | SLJIT_ARG4(UW),
+ SLJIT_IMM, SLJIT_FUNC_OFFSET(ffcs_2));
+#endif
+ }
+ }
+/* Restore registers. */
+OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0);
+OP1(SLJIT_MOV, TMP3, 0, SLJIT_MEM1(SLJIT_SP), LOCALS1);
+
+/* Check return value. */
+partial_quit = CMP(SLJIT_EQUAL, SLJIT_RETURN_REG, 0, SLJIT_IMM, 0);
+if (common->mode == PCRE2_JIT_COMPLETE)
+ add_jump(compiler, &common->failed_match, partial_quit);
+
+/* Fast forward STR_PTR to the result of memchr. */
+OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_RETURN_REG, 0);
+
+if (common->mode != PCRE2_JIT_COMPLETE)
+ JUMPHERE(partial_quit);
+}
+
+typedef enum {
+ compare_match1,
+ compare_match1i,
+ compare_match2,
+} compare_type;
+
+static inline vect_t fast_forward_char_pair_compare(compare_type ctype, vect_t dst, vect_t cmp1, vect_t cmp2)
+{
+if (ctype == compare_match2)
+ {
+ vect_t tmp = dst;
+ dst = VCEQQ(dst, cmp1);
+ tmp = VCEQQ(tmp, cmp2);
+ dst = VORRQ(dst, tmp);
+ return dst;
+ }
+
+if (ctype == compare_match1i)
+ dst = VORRQ(dst, cmp2);
+dst = VCEQQ(dst, cmp1);
+return dst;
+}
+
+static SLJIT_INLINE sljit_u32 max_fast_forward_char_pair_offset(void)
+{
+#if PCRE2_CODE_UNIT_WIDTH == 8
+return 15;
+#elif PCRE2_CODE_UNIT_WIDTH == 16
+return 7;
+#elif PCRE2_CODE_UNIT_WIDTH == 32
+return 3;
+#else
+#error "Unsupported unit width"
+#endif
+}
+
+/* ARM doesn't have a shift left across lanes. */
+static SLJIT_INLINE vect_t shift_left_n_lanes(vect_t a, sljit_u8 n)
+{
+vect_t zero = VDUPQ(0);
+SLJIT_ASSERT(0 < n && n < VECTOR_FACTOR);
+/* VEXTQ takes an immediate as last argument. */
+#define C(X) case X: return VEXTQ(zero, a, VECTOR_FACTOR - X);
+switch (n)
+ {
+ C(1); C(2); C(3);
+#if PCRE2_CODE_UNIT_WIDTH != 32
+ C(4); C(5); C(6); C(7);
+# if PCRE2_CODE_UNIT_WIDTH != 16
+ C(8); C(9); C(10); C(11); C(12); C(13); C(14); C(15);
+# endif
+#endif
+ default:
+ /* Based on the ASSERT(0 < n && n < VECTOR_FACTOR) above, this won't
+ happen. The return is still here for compilers to not warn. */
+ return a;
+ }
+}
+
+#define FFCPS
+#define FFCPS_DIFF1
+#define FFCPS_CHAR1A2A
+
+#define FFCPS_0
+#include "pcre2_jit_neon_inc.h"
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
+# define FF_UTF
+# include "pcre2_jit_neon_inc.h"
+# undef FF_UTF
+#endif
+#undef FFCPS_0
+
+#undef FFCPS_CHAR1A2A
+
+#define FFCPS_1
+#include "pcre2_jit_neon_inc.h"
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
+# define FF_UTF
+# include "pcre2_jit_neon_inc.h"
+# undef FF_UTF
+#endif
+#undef FFCPS_1
+
+#undef FFCPS_DIFF1
+
+#define FFCPS_DEFAULT
+#include "pcre2_jit_neon_inc.h"
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
+# define FF_UTF
+# include "pcre2_jit_neon_inc.h"
+# undef FF_UTF
+#endif
+#undef FFCPS
+
+#define JIT_HAS_FAST_FORWARD_CHAR_PAIR_SIMD 1
+
+static void fast_forward_char_pair_simd(compiler_common *common, sljit_s32 offs1,
+ PCRE2_UCHAR char1a, PCRE2_UCHAR char1b, sljit_s32 offs2, PCRE2_UCHAR char2a, PCRE2_UCHAR char2b)
+{
+DEFINE_COMPILER;
+sljit_u32 diff = IN_UCHARS(offs1 - offs2);
+struct sljit_jump *partial_quit;
+int_char ic;
+SLJIT_ASSERT(common->mode == PCRE2_JIT_COMPLETE && offs1 > offs2);
+SLJIT_ASSERT(diff <= IN_UCHARS(max_fast_forward_char_pair_offset()));
+SLJIT_ASSERT(compiler->scratches == 5);
+
+/* Save temporary register STR_PTR. */
+OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS0, STR_PTR, 0);
+
+/* Prepare arguments for the function call. */
+if (common->match_end_ptr == 0)
+ OP1(SLJIT_MOV, SLJIT_R0, 0, STR_END, 0);
+else
+ {
+ OP1(SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr);
+ OP2(SLJIT_ADD, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, IN_UCHARS(offs1 + 1));
+
+ OP2(SLJIT_SUB | SLJIT_SET_LESS, SLJIT_UNUSED, 0, STR_END, 0, SLJIT_R0, 0);
+ CMOV(SLJIT_LESS, SLJIT_R0, STR_END, 0);
+ }
+
+OP1(SLJIT_MOV, SLJIT_R1, 0, STR_PTR, 0);
+OP1(SLJIT_MOV_S32, SLJIT_R2, 0, SLJIT_IMM, offs1);
+OP1(SLJIT_MOV_S32, SLJIT_R3, 0, SLJIT_IMM, offs2);
+ic.c.c1 = char1a;
+ic.c.c2 = char1b;
+ic.c.c3 = char2a;
+ic.c.c4 = char2b;
+OP1(SLJIT_MOV_U32, SLJIT_R4, 0, SLJIT_IMM, ic.x);
+
+if (diff == 1) {
+ if (char1a == char1b && char2a == char2b) {
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
+ if (common->utf)
+ sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(SW) | SLJIT_ARG3(SW) | SLJIT_ARG4(SW),
+ SLJIT_IMM, SLJIT_FUNC_OFFSET(ffcps_0_utf));
+ else
+#endif
+ sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(SW) | SLJIT_ARG3(SW) | SLJIT_ARG4(SW),
+ SLJIT_IMM, SLJIT_FUNC_OFFSET(ffcps_0));
+ } else {
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
+ if (common->utf)
+ sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(SW) | SLJIT_ARG3(SW) | SLJIT_ARG4(SW),
+ SLJIT_IMM, SLJIT_FUNC_OFFSET(ffcps_1_utf));
+ else
+#endif
+ sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(SW) | SLJIT_ARG3(SW) | SLJIT_ARG4(SW),
+ SLJIT_IMM, SLJIT_FUNC_OFFSET(ffcps_1));
+ }
+} else {
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
+ if (common->utf)
+ sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(SW) | SLJIT_ARG3(SW) | SLJIT_ARG4(SW),
+ SLJIT_IMM, SLJIT_FUNC_OFFSET(ffcps_default_utf));
+ else
+#endif
+ sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(SW) | SLJIT_ARG3(SW) | SLJIT_ARG4(SW),
+ SLJIT_IMM, SLJIT_FUNC_OFFSET(ffcps_default));
+}
+
+/* Restore STR_PTR register. */
+OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0);
+
+/* Check return value. */
+partial_quit = CMP(SLJIT_EQUAL, SLJIT_RETURN_REG, 0, SLJIT_IMM, 0);
+add_jump(compiler, &common->failed_match, partial_quit);
+
+/* Fast forward STR_PTR to the result of memchr. */
+OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_RETURN_REG, 0);
+
+JUMPHERE(partial_quit);
+}
+
+#endif /* SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64 */
diff --git a/thirdparty/pcre2/src/pcre2_maketables.c b/thirdparty/pcre2/src/pcre2_maketables.c
index 5921e90793..8c93b4b573 100644
--- a/thirdparty/pcre2/src/pcre2_maketables.c
+++ b/thirdparty/pcre2/src/pcre2_maketables.c
@@ -147,4 +147,15 @@ for (i = 0; i < 256; i++)
return yield;
}
+#ifndef DFTABLES
+PCRE2_EXP_DEFN void PCRE2_CALL_CONVENTION
+pcre2_maketables_free(pcre2_general_context *gcontext, const uint8_t *tables)
+{
+ if (gcontext)
+ gcontext->memctl.free((void *)tables, gcontext->memctl.memory_data);
+ else
+ free((void *)tables);
+}
+#endif
+
/* End of pcre2_maketables.c */
diff --git a/thirdparty/pcre2/src/pcre2_match.c b/thirdparty/pcre2/src/pcre2_match.c
index 419561fd64..48e7b9dbb2 100644
--- a/thirdparty/pcre2/src/pcre2_match.c
+++ b/thirdparty/pcre2/src/pcre2_match.c
@@ -415,8 +415,7 @@ if (caseless)
else
#endif
- /* Not in UTF mode */
-
+ /* Not in UTF mode */
{
for (; length > 0; length--)
{
@@ -491,27 +490,32 @@ heap is used for a larger vector.
*************************************************/
/* These macros pack up tests that are used for partial matching several times
-in the code. We set the "hit end" flag if the pointer is at the end of the
-subject and also past the earliest inspected character (i.e. something has been
-matched, even if not part of the actual matched string). For hard partial
-matching, we then return immediately. The second one is used when we already
-know we are past the end of the subject. */
+in the code. The second one is used when we already know we are past the end of
+the subject. We set the "hit end" flag if the pointer is at the end of the
+subject and either (a) the pointer is past the earliest inspected character
+(i.e. something has been matched, even if not part of the actual matched
+string), or (b) the pattern contains a lookbehind. These are the conditions for
+which adding more characters may allow the current match to continue.
+
+For hard partial matching, we immediately return a partial match. Otherwise,
+carrying on means that a complete match on the current subject will be sought.
+A partial match is returned only if no complete match can be found. */
#define CHECK_PARTIAL()\
- if (mb->partial != 0 && Feptr >= mb->end_subject && \
- Feptr > mb->start_used_ptr) \
+ if (Feptr >= mb->end_subject) \
{ \
- mb->hitend = TRUE; \
- if (mb->partial > 1) return PCRE2_ERROR_PARTIAL; \
+ SCHECK_PARTIAL(); \
}
#define SCHECK_PARTIAL()\
- if (mb->partial != 0 && Feptr > mb->start_used_ptr) \
+ if (mb->partial != 0 && \
+ (Feptr > mb->start_used_ptr || mb->allowemptypartial)) \
{ \
mb->hitend = TRUE; \
if (mb->partial > 1) return PCRE2_ERROR_PARTIAL; \
}
+
/* These macros are used to implement backtracking. They simulate a recursive
call to the match() function by means of a local vector of frames which
remember the backtracking points. */
@@ -5127,6 +5131,8 @@ fprintf(stderr, "++ op=%d\n", *Fecode);
case OP_ASSERT:
case OP_ASSERTBACK:
+ case OP_ASSERT_NA:
+ case OP_ASSERTBACK_NA:
Lframe_type = GF_NOCAPTURE | Fop;
for (;;)
{
@@ -5412,7 +5418,7 @@ fprintf(stderr, "++ op=%d\n", *Fecode);
{
while (number-- > 0)
{
- if (Feptr <= mb->start_subject) RRETURN(MATCH_NOMATCH);
+ if (Feptr <= mb->check_subject) RRETURN(MATCH_NOMATCH);
Feptr--;
BACKCHAR(Feptr);
}
@@ -5420,7 +5426,7 @@ fprintf(stderr, "++ op=%d\n", *Fecode);
else
#endif
- /* No UTF-8 support, or not in UTF-8 mode: count is byte count */
+ /* No UTF-8 support, or not in UTF-8 mode: count is code unit count */
{
if ((ptrdiff_t)number > Feptr - mb->start_subject) RRETURN(MATCH_NOMATCH);
@@ -5472,15 +5478,16 @@ fprintf(stderr, "++ op=%d\n", *Fecode);
/* If we are at the end of an assertion that is a condition, return a
match, discarding any intermediate backtracking points. Copy back the
- captures into the frame before N so that they are set on return. Doing
- this for all assertions, both positive and negative, seems to match what
- Perl does. */
+ mark setting and the captures into the frame before N so that they are
+ set on return. Doing this for all assertions, both positive and negative,
+ seems to match what Perl does. */
if (GF_IDMASK(N->group_frame_type) == GF_CONDASSERT)
{
memcpy((char *)P + offsetof(heapframe, ovector), Fovector,
Foffset_top * sizeof(PCRE2_SIZE));
P->offset_top = Foffset_top;
+ P->mark = Fmark;
Fback_frame = (char *)F - (char *)P;
RRETURN(MATCH_MATCH);
}
@@ -5496,10 +5503,20 @@ fprintf(stderr, "++ op=%d\n", *Fecode);
case OP_SCOND:
break;
- /* Positive assertions are like OP_ONCE, except that in addition the
+ /* Non-atomic positive assertions are like OP_BRA, except that the
subject pointer must be put back to where it was at the start of the
assertion. */
+ case OP_ASSERT_NA:
+ case OP_ASSERTBACK_NA:
+ if (Feptr > mb->last_used_ptr) mb->last_used_ptr = Feptr;
+ Feptr = P->eptr;
+ break;
+
+ /* Atomic positive assertions are like OP_ONCE, except that in addition
+ the subject pointer must be put back to where it was at the start of the
+ assertion. */
+
case OP_ASSERT:
case OP_ASSERTBACK:
if (Feptr > mb->last_used_ptr) mb->last_used_ptr = Feptr;
@@ -5640,7 +5657,11 @@ fprintf(stderr, "++ op=%d\n", *Fecode);
case OP_EOD:
if (Feptr < mb->end_subject) RRETURN(MATCH_NOMATCH);
- SCHECK_PARTIAL();
+ if (mb->partial != 0)
+ {
+ mb->hitend = TRUE;
+ if (mb->partial > 1) return PCRE2_ERROR_PARTIAL;
+ }
Fecode++;
break;
@@ -5665,7 +5686,11 @@ fprintf(stderr, "++ op=%d\n", *Fecode);
/* Either at end of string or \n before end. */
- SCHECK_PARTIAL();
+ if (mb->partial != 0)
+ {
+ mb->hitend = TRUE;
+ if (mb->partial > 1) return PCRE2_ERROR_PARTIAL;
+ }
Fecode++;
break;
@@ -5743,7 +5768,7 @@ fprintf(stderr, "++ op=%d\n", *Fecode);
case OP_NOT_WORD_BOUNDARY:
case OP_WORD_BOUNDARY:
- if (Feptr == mb->start_subject) prev_is_word = FALSE; else
+ if (Feptr == mb->check_subject) prev_is_word = FALSE; else
{
PCRE2_SPTR lastptr = Feptr - 1;
#ifdef SUPPORT_UNICODE
@@ -5946,6 +5971,7 @@ in rrc. */
#define LBL(val) case val: goto L_RM##val;
RETURN_SWITCH:
+if (Feptr > mb->last_used_ptr) mb->last_used_ptr = Feptr;
if (Frdepth == 0) return rrc; /* Exit from the top level */
F = (heapframe *)((char *)F - Fback_frame); /* Backtrack */
mb->cb->callout_flags |= PCRE2_CALLOUT_BACKTRACK; /* Note for callouts */
@@ -5999,9 +6025,9 @@ Arguments:
Returns: > 0 => success; value is the number of ovector pairs filled
= 0 => success, but ovector is not big enough
- -1 => failed to match (PCRE2_ERROR_NOMATCH)
- -2 => partial match (PCRE2_ERROR_PARTIAL)
- < -2 => some kind of unexpected problem
+ = -1 => failed to match (PCRE2_ERROR_NOMATCH)
+ = -2 => partial match (PCRE2_ERROR_PARTIAL)
+ < -2 => some kind of unexpected problem
*/
PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
@@ -6014,7 +6040,6 @@ int was_zero_terminated = 0;
const uint8_t *start_bits = NULL;
const pcre2_real_code *re = (const pcre2_real_code *)code;
-
BOOL anchored;
BOOL firstline;
BOOL has_first_cu = FALSE;
@@ -6022,6 +6047,11 @@ BOOL has_req_cu = FALSE;
BOOL startline;
BOOL utf;
+#if PCRE2_CODE_UNIT_WIDTH == 8
+BOOL memchr_not_found_first_cu = FALSE;
+BOOL memchr_not_found_first_cu2 = FALSE;
+#endif
+
PCRE2_UCHAR first_cu = 0;
PCRE2_UCHAR first_cu2 = 0;
PCRE2_UCHAR req_cu = 0;
@@ -6029,10 +6059,23 @@ PCRE2_UCHAR req_cu2 = 0;
PCRE2_SPTR bumpalong_limit;
PCRE2_SPTR end_subject;
+PCRE2_SPTR true_end_subject;
PCRE2_SPTR start_match = subject + start_offset;
PCRE2_SPTR req_cu_ptr = start_match - 1;
-PCRE2_SPTR start_partial = NULL;
-PCRE2_SPTR match_partial = NULL;
+PCRE2_SPTR start_partial;
+PCRE2_SPTR match_partial;
+
+#ifdef SUPPORT_JIT
+BOOL use_jit;
+#endif
+
+#ifdef SUPPORT_UNICODE
+BOOL allow_invalid;
+uint32_t fragment_options = 0;
+#ifdef SUPPORT_JIT
+BOOL jit_checked_utf = FALSE;
+#endif
+#endif
PCRE2_SIZE frame_size;
@@ -6059,7 +6102,7 @@ if (length == PCRE2_ZERO_TERMINATED)
length = PRIV(strlen)(subject);
was_zero_terminated = 1;
}
-end_subject = subject + length;
+true_end_subject = end_subject = subject + length;
/* Plausibility checks */
@@ -6095,12 +6138,24 @@ options |= (re->flags & FF) / ((FF & (~FF+1)) / (OO & (~OO+1)));
#undef FF
#undef OO
-/* These two settings are used in the code for checking a UTF string that
-follows immediately afterwards. Other values in the mb block are used only
-during interpretive processing, not when the JIT support is in use, so they are
-set up later. */
+/* If the pattern was successfully studied with JIT support, we will run the
+JIT executable instead of the rest of this function. Most options must be set
+at compile time for the JIT code to be usable. */
+
+#ifdef SUPPORT_JIT
+use_jit = (re->executable_jit != NULL &&
+ (options & ~PUBLIC_JIT_MATCH_OPTIONS) == 0);
+#endif
+
+/* Initialize UTF parameters. */
utf = (re->overall_options & PCRE2_UTF) != 0;
+#ifdef SUPPORT_UNICODE
+allow_invalid = (re->overall_options & PCRE2_MATCH_INVALID_UTF) != 0;
+#endif
+
+/* Convert the partial matching flags into an integer. */
+
mb->partial = ((options & PCRE2_PARTIAL_HARD) != 0)? 2 :
((options & PCRE2_PARTIAL_SOFT) != 0)? 1 : 0;
@@ -6111,88 +6166,107 @@ if (mb->partial != 0 &&
((re->overall_options | options) & PCRE2_ENDANCHORED) != 0)
return PCRE2_ERROR_BADOPTION;
-/* Check a UTF string for validity if required. For 8-bit and 16-bit strings,
-we must also check that a starting offset does not point into the middle of a
-multiunit character. We check only the portion of the subject that is going to
-be inspected during matching - from the offset minus the maximum back reference
-to the given length. This saves time when a small part of a large subject is
-being matched by the use of a starting offset. Note that the maximum lookbehind
-is a number of characters, not code units. */
+/* It is an error to set an offset limit without setting the flag at compile
+time. */
-#ifdef SUPPORT_UNICODE
-if (utf && (options & PCRE2_NO_UTF_CHECK) == 0)
+if (mcontext != NULL && mcontext->offset_limit != PCRE2_UNSET &&
+ (re->overall_options & PCRE2_USE_OFFSET_LIMIT) == 0)
+ return PCRE2_ERROR_BADOFFSETLIMIT;
+
+/* If the match data block was previously used with PCRE2_COPY_MATCHED_SUBJECT,
+free the memory that was obtained. Set the field to NULL for no match cases. */
+
+if ((match_data->flags & PCRE2_MD_COPIED_SUBJECT) != 0)
{
- PCRE2_SPTR check_subject = start_match; /* start_match includes offset */
+ match_data->memctl.free((void *)match_data->subject,
+ match_data->memctl.memory_data);
+ match_data->flags &= ~PCRE2_MD_COPIED_SUBJECT;
+ }
+match_data->subject = NULL;
+
+/* Zero the error offset in case the first code unit is invalid UTF. */
+
+match_data->startchar = 0;
+
+
+/* ============================= JIT matching ============================== */
+
+/* Prepare for JIT matching. Check a UTF string for validity unless no check is
+requested or invalid UTF can be handled. We check only the portion of the
+subject that might be be inspected during matching - from the offset minus the
+maximum lookbehind to the given length. This saves time when a small part of a
+large subject is being matched by the use of a starting offset. Note that the
+maximum lookbehind is a number of characters, not code units. */
- if (start_offset > 0)
+#ifdef SUPPORT_JIT
+if (use_jit)
+ {
+#ifdef SUPPORT_UNICODE
+ if (utf && (options & PCRE2_NO_UTF_CHECK) == 0 && !allow_invalid)
{
#if PCRE2_CODE_UNIT_WIDTH != 32
unsigned int i;
+#endif
+
+ /* For 8-bit and 16-bit UTF, check that the first code unit is a valid
+ character start. */
+
+#if PCRE2_CODE_UNIT_WIDTH != 32
if (start_match < end_subject && NOT_FIRSTCU(*start_match))
- return PCRE2_ERROR_BADUTFOFFSET;
- for (i = re->max_lookbehind; i > 0 && check_subject > subject; i--)
{
- check_subject--;
- while (check_subject > subject &&
+ if (start_offset > 0) return PCRE2_ERROR_BADUTFOFFSET;
+#if PCRE2_CODE_UNIT_WIDTH == 8
+ return PCRE2_ERROR_UTF8_ERR20; /* Isolated 0x80 byte */
+#else
+ return PCRE2_ERROR_UTF16_ERR3; /* Isolated low surrogate */
+#endif
+ }
+#endif /* WIDTH != 32 */
+
+ /* Move back by the maximum lookbehind, just in case it happens at the very
+ start of matching. */
+
+#if PCRE2_CODE_UNIT_WIDTH != 32
+ for (i = re->max_lookbehind; i > 0 && start_match > subject; i--)
+ {
+ start_match--;
+ while (start_match > subject &&
#if PCRE2_CODE_UNIT_WIDTH == 8
- (*check_subject & 0xc0) == 0x80)
+ (*start_match & 0xc0) == 0x80)
#else /* 16-bit */
- (*check_subject & 0xfc00) == 0xdc00)
-#endif /* PCRE2_CODE_UNIT_WIDTH == 8 */
- check_subject--;
+ (*start_match & 0xfc00) == 0xdc00)
+#endif
+ start_match--;
}
-#else
+#else /* PCRE2_CODE_UNIT_WIDTH != 32 */
+
/* In the 32-bit library, one code unit equals one character. However,
we cannot just subtract the lookbehind and then compare pointers, because
a very large lookbehind could create an invalid pointer. */
if (start_offset >= re->max_lookbehind)
- check_subject -= re->max_lookbehind;
+ start_match -= re->max_lookbehind;
else
- check_subject = subject;
+ start_match = subject;
#endif /* PCRE2_CODE_UNIT_WIDTH != 32 */
- }
- /* Validate the relevant portion of the subject. After an error, adjust the
- offset to be an absolute offset in the whole string. */
+ /* Validate the relevant portion of the subject. Adjust the offset of an
+ invalid code point to be an absolute offset in the whole string. */
- match_data->rc = PRIV(valid_utf)(check_subject,
- length - (check_subject - subject), &(match_data->startchar));
- if (match_data->rc != 0)
- {
- match_data->startchar += check_subject - subject;
- return match_data->rc;
+ match_data->rc = PRIV(valid_utf)(start_match,
+ length - (start_match - subject), &(match_data->startchar));
+ if (match_data->rc != 0)
+ {
+ match_data->startchar += start_match - subject;
+ return match_data->rc;
+ }
+ jit_checked_utf = TRUE;
}
- }
#endif /* SUPPORT_UNICODE */
-/* It is an error to set an offset limit without setting the flag at compile
-time. */
-
-if (mcontext != NULL && mcontext->offset_limit != PCRE2_UNSET &&
- (re->overall_options & PCRE2_USE_OFFSET_LIMIT) == 0)
- return PCRE2_ERROR_BADOFFSETLIMIT;
-
-/* If the match data block was previously used with PCRE2_COPY_MATCHED_SUBJECT,
-free the memory that was obtained. Set the field to NULL for no match cases. */
+ /* If JIT returns BADOPTION, which means that the selected complete or
+ partial matching mode was not compiled, fall through to the interpreter. */
-if ((match_data->flags & PCRE2_MD_COPIED_SUBJECT) != 0)
- {
- match_data->memctl.free((void *)match_data->subject,
- match_data->memctl.memory_data);
- match_data->flags &= ~PCRE2_MD_COPIED_SUBJECT;
- }
-match_data->subject = NULL;
-
-/* If the pattern was successfully studied with JIT support, run the JIT
-executable instead of the rest of this function. Most options must be set at
-compile time for the JIT code to be usable. Fallback to the normal code path if
-an unsupported option is set or if JIT returns BADOPTION (which means that the
-selected normal or partial matching mode was not compiled). */
-
-#ifdef SUPPORT_JIT
-if (re->executable_jit != NULL && (options & ~PUBLIC_JIT_MATCH_OPTIONS) == 0)
- {
rc = pcre2_jit_match(code, subject, length, start_offset, options,
match_data, mcontext);
if (rc != PCRE2_ERROR_JIT_BADOPTION)
@@ -6209,10 +6283,152 @@ if (re->executable_jit != NULL && (options & ~PUBLIC_JIT_MATCH_OPTIONS) == 0)
return rc;
}
}
+#endif /* SUPPORT_JIT */
+
+/* ========================= End of JIT matching ========================== */
+
+
+/* Proceed with non-JIT matching. The default is to allow lookbehinds to the
+start of the subject. A UTF check when there is a non-zero offset may change
+this. */
+
+mb->check_subject = subject;
+
+/* If a UTF subject string was not checked for validity in the JIT code above,
+check it here, and handle support for invalid UTF strings. The check above
+happens only when invalid UTF is not supported and PCRE2_NO_CHECK_UTF is unset.
+If we get here in those circumstances, it means the subject string is valid,
+but for some reason JIT matching was not successful. There is no need to check
+the subject again.
+
+We check only the portion of the subject that might be be inspected during
+matching - from the offset minus the maximum lookbehind to the given length.
+This saves time when a small part of a large subject is being matched by the
+use of a starting offset. Note that the maximum lookbehind is a number of
+characters, not code units.
+
+Note also that support for invalid UTF forces a check, overriding the setting
+of PCRE2_NO_CHECK_UTF. */
+
+#ifdef SUPPORT_UNICODE
+if (utf &&
+#ifdef SUPPORT_JIT
+ !jit_checked_utf &&
+#endif
+ ((options & PCRE2_NO_UTF_CHECK) == 0 || allow_invalid))
+ {
+#if PCRE2_CODE_UNIT_WIDTH != 32
+ BOOL skipped_bad_start = FALSE;
+#endif
+
+ /* For 8-bit and 16-bit UTF, check that the first code unit is a valid
+ character start. If we are handling invalid UTF, just skip over such code
+ units. Otherwise, give an appropriate error. */
+
+#if PCRE2_CODE_UNIT_WIDTH != 32
+ if (allow_invalid)
+ {
+ while (start_match < end_subject && NOT_FIRSTCU(*start_match))
+ {
+ start_match++;
+ skipped_bad_start = TRUE;
+ }
+ }
+ else if (start_match < end_subject && NOT_FIRSTCU(*start_match))
+ {
+ if (start_offset > 0) return PCRE2_ERROR_BADUTFOFFSET;
+#if PCRE2_CODE_UNIT_WIDTH == 8
+ return PCRE2_ERROR_UTF8_ERR20; /* Isolated 0x80 byte */
+#else
+ return PCRE2_ERROR_UTF16_ERR3; /* Isolated low surrogate */
+#endif
+ }
+#endif /* WIDTH != 32 */
+
+ /* The mb->check_subject field points to the start of UTF checking;
+ lookbehinds can go back no further than this. */
+
+ mb->check_subject = start_match;
+
+ /* Move back by the maximum lookbehind, just in case it happens at the very
+ start of matching, but don't do this if we skipped bad 8-bit or 16-bit code
+ units above. */
+
+#if PCRE2_CODE_UNIT_WIDTH != 32
+ if (!skipped_bad_start)
+ {
+ unsigned int i;
+ for (i = re->max_lookbehind; i > 0 && mb->check_subject > subject; i--)
+ {
+ mb->check_subject--;
+ while (mb->check_subject > subject &&
+#if PCRE2_CODE_UNIT_WIDTH == 8
+ (*mb->check_subject & 0xc0) == 0x80)
+#else /* 16-bit */
+ (*mb->check_subject & 0xfc00) == 0xdc00)
+#endif
+ mb->check_subject--;
+ }
+ }
+#else /* PCRE2_CODE_UNIT_WIDTH != 32 */
+
+ /* In the 32-bit library, one code unit equals one character. However,
+ we cannot just subtract the lookbehind and then compare pointers, because
+ a very large lookbehind could create an invalid pointer. */
+
+ if (start_offset >= re->max_lookbehind)
+ mb->check_subject -= re->max_lookbehind;
+ else
+ mb->check_subject = subject;
+#endif /* PCRE2_CODE_UNIT_WIDTH != 32 */
+
+ /* Validate the relevant portion of the subject. There's a loop in case we
+ encounter bad UTF in the characters preceding start_match which we are
+ scanning because of a lookbehind. */
+
+ for (;;)
+ {
+ match_data->rc = PRIV(valid_utf)(mb->check_subject,
+ length - (mb->check_subject - subject), &(match_data->startchar));
+
+ if (match_data->rc == 0) break; /* Valid UTF string */
+
+ /* Invalid UTF string. Adjust the offset to be an absolute offset in the
+ whole string. If we are handling invalid UTF strings, set end_subject to
+ stop before the bad code unit, and set the options to "not end of line".
+ Otherwise return the error. */
+
+ match_data->startchar += mb->check_subject - subject;
+ if (!allow_invalid || match_data->rc > 0) return match_data->rc;
+ end_subject = subject + match_data->startchar;
+
+ /* If the end precedes start_match, it means there is invalid UTF in the
+ extra code units we reversed over because of a lookbehind. Advance past the
+ first bad code unit, and then skip invalid character starting code units in
+ 8-bit and 16-bit modes, and try again. */
+
+ if (end_subject < start_match)
+ {
+ mb->check_subject = end_subject + 1;
+#if PCRE2_CODE_UNIT_WIDTH != 32
+ while (mb->check_subject < start_match && NOT_FIRSTCU(*mb->check_subject))
+ mb->check_subject++;
#endif
+ }
+
+ /* Otherwise, set the not end of line option, and do the match. */
+
+ else
+ {
+ fragment_options = PCRE2_NOTEOL;
+ break;
+ }
+ }
+ }
+#endif /* SUPPORT_UNICODE */
-/* Carry on with non-JIT matching. A NULL match context means "use a default
-context", but we take the memory control functions from the pattern. */
+/* A NULL match context means "use a default context", but we take the memory
+control functions from the pattern. */
if (mcontext == NULL)
{
@@ -6224,8 +6440,8 @@ else mb->memctl = mcontext->memctl;
anchored = ((re->overall_options | options) & PCRE2_ANCHORED) != 0;
firstline = (re->overall_options & PCRE2_FIRSTLINE) != 0;
startline = (re->flags & PCRE2_STARTLINE) != 0;
-bumpalong_limit = (mcontext->offset_limit == PCRE2_UNSET)?
- end_subject : subject + mcontext->offset_limit;
+bumpalong_limit = (mcontext->offset_limit == PCRE2_UNSET)?
+ true_end_subject : subject + mcontext->offset_limit;
/* Initialize and set up the fixed fields in the callout block, with a pointer
in the match block. */
@@ -6236,7 +6452,8 @@ cb.subject = subject;
cb.subject_length = (PCRE2_SIZE)(end_subject - subject);
cb.callout_flags = 0;
-/* Fill in the remaining fields in the match block. */
+/* Fill in the remaining fields in the match block, except for moptions, which
+gets set later. */
mb->callout = mcontext->callout;
mb->callout_data = mcontext->callout_data;
@@ -6245,13 +6462,11 @@ mb->start_subject = subject;
mb->start_offset = start_offset;
mb->end_subject = end_subject;
mb->hasthen = (re->flags & PCRE2_HASTHEN) != 0;
-
-mb->moptions = options; /* Match options */
-mb->poptions = re->overall_options; /* Pattern options */
-
+mb->allowemptypartial = (re->max_lookbehind > 0) ||
+ (re->flags & PCRE2_MATCH_EMPTY) != 0;
+mb->poptions = re->overall_options; /* Pattern options */
mb->ignore_skip_arg = 0;
-mb->mark = mb->nomatch_mark = NULL; /* In case never set */
-mb->hitend = FALSE;
+mb->mark = mb->nomatch_mark = NULL; /* In case never set */
/* The name table is needed for finding all the numbers associated with a
given name, for condition testing. The code follows the name table. */
@@ -6404,6 +6619,13 @@ if ((re->flags & PCRE2_LASTSET) != 0)
/* Loop for handling unanchored repeated matching attempts; for anchored regexs
the loop runs just once. */
+#ifdef SUPPORT_UNICODE
+FRAGMENT_RESTART:
+#endif
+
+start_partial = match_partial = NULL;
+mb->hitend = FALSE;
+
for(;;)
{
PCRE2_SPTR new_start_match;
@@ -6473,7 +6695,10 @@ for(;;)
/* Not anchored. Advance to a unique first code unit if there is one. In
8-bit mode, the use of memchr() gives a big speed up, even though we have
to call it twice in caseless mode, in order to find the earliest occurrence
- of the character in either of its cases. */
+ of the character in either of its cases. If a call to memchr() that
+ searches the rest of the subject fails to find one case, remember that in
+ order not to keep on repeating the search. This can make a huge difference
+ when the strings are very long and only one case is present. */
else
{
@@ -6487,11 +6712,29 @@ for(;;)
(smc = UCHAR21TEST(start_match)) != first_cu &&
smc != first_cu2)
start_match++;
+
#else /* 8-bit code units */
- PCRE2_SPTR pp1 =
- memchr(start_match, first_cu, end_subject-start_match);
- PCRE2_SPTR pp2 =
- memchr(start_match, first_cu2, end_subject-start_match);
+ PCRE2_SPTR pp1 = NULL;
+ PCRE2_SPTR pp2 = NULL;
+ PCRE2_SIZE cu2size = end_subject - start_match;
+
+ if (!memchr_not_found_first_cu)
+ {
+ pp1 = memchr(start_match, first_cu, end_subject - start_match);
+ if (pp1 == NULL) memchr_not_found_first_cu = TRUE;
+ else cu2size = pp1 - start_match;
+ }
+
+ /* If pp1 is not NULL, we have arranged to search only as far as pp1,
+ to see if the other case is earlier, so we can set "not found" only
+ when both searches have returned NULL. */
+
+ if (!memchr_not_found_first_cu2)
+ {
+ pp2 = memchr(start_match, first_cu2, cu2size);
+ memchr_not_found_first_cu2 = (pp2 == NULL && pp1 == NULL);
+ }
+
if (pp1 == NULL)
start_match = (pp2 == NULL)? end_subject : pp2;
else
@@ -6523,7 +6766,7 @@ for(;;)
we also let the cycle run, because the matching string is legitimately
allowed to start with the first code unit of a newline. */
- if (!mb->partial && start_match >= mb->end_subject)
+ if (mb->partial == 0 && start_match >= mb->end_subject)
{
rc = MATCH_NOMATCH;
break;
@@ -6582,7 +6825,7 @@ for(;;)
/* See comment above in first_cu checking about the next few lines. */
- if (!mb->partial && start_match >= mb->end_subject)
+ if (mb->partial == 0 && start_match >= mb->end_subject)
{
rc = MATCH_NOMATCH;
break;
@@ -6596,8 +6839,10 @@ for(;;)
/* The following two optimizations must be disabled for partial matching. */
- if (!mb->partial)
+ if (mb->partial == 0)
{
+ PCRE2_SPTR p;
+
/* The minimum matching length is a lower bound; no string of that length
may actually match the pattern. Although the value is, strictly, in
characters, we treat it as code units to avoid spending too much time in
@@ -6621,60 +6866,57 @@ for(;;)
memchr() twice in the caseless case because we only need to check for the
presence of the character in either case, not find the first occurrence.
+ The search can be skipped if the code unit was found later than the
+ current starting point in a previous iteration of the bumpalong loop.
+
HOWEVER: when the subject string is very, very long, searching to its end
can take a long time, and give bad performance on quite ordinary
- patterns. This showed up when somebody was matching something like
- /^\d+C/ on a 32-megabyte string... so we don't do this when the string is
- sufficiently long. */
+ anchored patterns. This showed up when somebody was matching something
+ like /^\d+C/ on a 32-megabyte string... so we don't do this when the
+ string is sufficiently long, but it's worth searching a lot more for
+ unanchored patterns. */
- if (has_req_cu && end_subject - start_match < REQ_CU_MAX)
+ p = start_match + (has_first_cu? 1:0);
+ if (has_req_cu && p > req_cu_ptr)
{
- PCRE2_SPTR p = start_match + (has_first_cu? 1:0);
-
- /* We don't need to repeat the search if we haven't yet reached the
- place we found it last time round the bumpalong loop. */
+ PCRE2_SIZE check_length = end_subject - start_match;
- if (p > req_cu_ptr)
+ if (check_length < REQ_CU_MAX ||
+ (!anchored && check_length < REQ_CU_MAX * 1000))
{
- if (p < end_subject)
+ if (req_cu != req_cu2) /* Caseless */
{
- if (req_cu != req_cu2) /* Caseless */
- {
#if PCRE2_CODE_UNIT_WIDTH != 8
- do
- {
- uint32_t pp = UCHAR21INCTEST(p);
- if (pp == req_cu || pp == req_cu2) { p--; break; }
- }
- while (p < end_subject);
-
+ while (p < end_subject)
+ {
+ uint32_t pp = UCHAR21INCTEST(p);
+ if (pp == req_cu || pp == req_cu2) { p--; break; }
+ }
#else /* 8-bit code units */
- PCRE2_SPTR pp = p;
- p = memchr(pp, req_cu, end_subject - pp);
- if (p == NULL)
- {
- p = memchr(pp, req_cu2, end_subject - pp);
- if (p == NULL) p = end_subject;
- }
-#endif /* PCRE2_CODE_UNIT_WIDTH != 8 */
+ PCRE2_SPTR pp = p;
+ p = memchr(pp, req_cu, end_subject - pp);
+ if (p == NULL)
+ {
+ p = memchr(pp, req_cu2, end_subject - pp);
+ if (p == NULL) p = end_subject;
}
+#endif /* PCRE2_CODE_UNIT_WIDTH != 8 */
+ }
- /* The caseful case */
+ /* The caseful case */
- else
- {
+ else
+ {
#if PCRE2_CODE_UNIT_WIDTH != 8
- do
- {
- if (UCHAR21INCTEST(p) == req_cu) { p--; break; }
- }
- while (p < end_subject);
+ while (p < end_subject)
+ {
+ if (UCHAR21INCTEST(p) == req_cu) { p--; break; }
+ }
#else /* 8-bit code units */
- p = memchr(p, req_cu, end_subject - p);
- if (p == NULL) p = end_subject;
+ p = memchr(p, req_cu, end_subject - p);
+ if (p == NULL) p = end_subject;
#endif
- }
}
/* If we can't find the required code unit, break the bumpalong loop,
@@ -6714,6 +6956,11 @@ for(;;)
mb->start_used_ptr = start_match;
mb->last_used_ptr = start_match;
+#ifdef SUPPORT_UNICODE
+ mb->moptions = options | fragment_options;
+#else
+ mb->moptions = options;
+#endif
mb->match_call_count = 0;
mb->end_offset_top = 0;
mb->skip_arg_count = 0;
@@ -6839,6 +7086,68 @@ for(;;)
ENDLOOP:
+/* If end_subject != true_end_subject, it means we are handling invalid UTF,
+and have just processed a non-terminal fragment. If this resulted in no match
+or a partial match we must carry on to the next fragment (a partial match is
+returned to the caller only at the very end of the subject). A loop is used to
+avoid trying to match against empty fragments; if the pattern can match an
+empty string it would have done so already. */
+
+#ifdef SUPPORT_UNICODE
+if (utf && end_subject != true_end_subject &&
+ (rc == MATCH_NOMATCH || rc == PCRE2_ERROR_PARTIAL))
+ {
+ for (;;)
+ {
+ /* Advance past the first bad code unit, and then skip invalid character
+ starting code units in 8-bit and 16-bit modes. */
+
+ start_match = end_subject + 1;
+#if PCRE2_CODE_UNIT_WIDTH != 32
+ while (start_match < true_end_subject && NOT_FIRSTCU(*start_match))
+ start_match++;
+#endif
+
+ /* If we have hit the end of the subject, there isn't another non-empty
+ fragment, so give up. */
+
+ if (start_match >= true_end_subject)
+ {
+ rc = MATCH_NOMATCH; /* In case it was partial */
+ break;
+ }
+
+ /* Check the rest of the subject */
+
+ mb->check_subject = start_match;
+ rc = PRIV(valid_utf)(start_match, length - (start_match - subject),
+ &(match_data->startchar));
+
+ /* The rest of the subject is valid UTF. */
+
+ if (rc == 0)
+ {
+ mb->end_subject = end_subject = true_end_subject;
+ fragment_options = PCRE2_NOTBOL;
+ goto FRAGMENT_RESTART;
+ }
+
+ /* A subsequent UTF error has been found; if the next fragment is
+ non-empty, set up to process it. Otherwise, let the loop advance. */
+
+ else if (rc < 0)
+ {
+ mb->end_subject = end_subject = start_match + match_data->startchar;
+ if (end_subject > start_match)
+ {
+ fragment_options = PCRE2_NOTBOL|PCRE2_NOTEOL;
+ goto FRAGMENT_RESTART;
+ }
+ }
+ }
+ }
+#endif /* SUPPORT_UNICODE */
+
/* Release an enlarged frame vector that is on the heap. */
if (mb->match_frames != mb->stack_frames)
diff --git a/thirdparty/pcre2/src/pcre2_match_data.c b/thirdparty/pcre2/src/pcre2_match_data.c
index ccc5f6740e..53e4698707 100644
--- a/thirdparty/pcre2/src/pcre2_match_data.c
+++ b/thirdparty/pcre2/src/pcre2_match_data.c
@@ -7,7 +7,7 @@ and semantics are as close as possible to those of the Perl 5 language.
Written by Philip Hazel
Original API code Copyright (c) 1997-2012 University of Cambridge
- New API code Copyright (c) 2016-2018 University of Cambridge
+ New API code Copyright (c) 2016-2019 University of Cambridge
-----------------------------------------------------------------------------
Redistribution and use in source and binary forms, with or without
@@ -150,4 +150,17 @@ pcre2_get_startchar(pcre2_match_data *match_data)
return match_data->startchar;
}
+
+
+/*************************************************
+* Get size of match data block *
+*************************************************/
+
+PCRE2_EXP_DEFN PCRE2_SIZE PCRE2_CALL_CONVENTION
+pcre2_get_match_data_size(pcre2_match_data *match_data)
+{
+return offsetof(pcre2_match_data, ovector) +
+ 2 * (match_data->oveccount) * sizeof(PCRE2_SIZE);
+}
+
/* End of pcre2_match_data.c */
diff --git a/thirdparty/pcre2/src/pcre2_study.c b/thirdparty/pcre2/src/pcre2_study.c
index e883c2eb4c..2883868618 100644
--- a/thirdparty/pcre2/src/pcre2_study.c
+++ b/thirdparty/pcre2/src/pcre2_study.c
@@ -88,11 +88,13 @@ Arguments:
countptr pointer to call count (to catch over complexity)
backref_cache vector for caching back references.
+This function is no longer called when the pattern contains (*ACCEPT); however,
+the old code for returning -1 is retained, just in case.
+
Returns: the minimum length
-1 \C in UTF-8 mode
or (*ACCEPT)
or pattern too complicated
- or back reference to duplicate name/number
-2 internal error (missing capturing bracket)
-3 internal error (opcode not listed)
*/
@@ -103,6 +105,7 @@ find_minlength(const pcre2_real_code *re, PCRE2_SPTR code,
int *backref_cache)
{
int length = -1;
+int branchlength = 0;
int prev_cap_recno = -1;
int prev_cap_d = 0;
int prev_recurse_recno = -1;
@@ -110,9 +113,9 @@ int prev_recurse_d = 0;
uint32_t once_fudge = 0;
BOOL had_recurse = FALSE;
BOOL dupcapused = (re->flags & PCRE2_DUPCAPUSED) != 0;
-recurse_check this_recurse;
-int branchlength = 0;
+PCRE2_SPTR nextbranch = code + GET(code, 1);
PCRE2_UCHAR *cc = (PCRE2_UCHAR *)code + 1 + LINK_SIZE;
+recurse_check this_recurse;
/* If this is a "could be empty" group, its minimum length is 0. */
@@ -128,16 +131,20 @@ if ((*countptr)++ > 1000) return -1;
/* Scan along the opcodes for this branch. If we get to the end of the branch,
check the length against that of the other branches. If the accumulated length
-passes 16-bits, stop. */
+passes 16-bits, reset to that value and skip the rest of the branch. */
for (;;)
{
int d, min, recno;
- PCRE2_UCHAR *cs, *ce;
- PCRE2_UCHAR op = *cc;
+ PCRE2_UCHAR op, *cs, *ce;
- if (branchlength >= UINT16_MAX) return UINT16_MAX;
+ if (branchlength >= UINT16_MAX)
+ {
+ branchlength = UINT16_MAX;
+ cc = (PCRE2_UCHAR *)nextbranch;
+ }
+ op = *cc;
switch (op)
{
case OP_COND:
@@ -206,7 +213,9 @@ for (;;)
cc += 1 + LINK_SIZE;
break;
- /* ACCEPT makes things far too complicated; we have to give up. */
+ /* ACCEPT makes things far too complicated; we have to give up. In fact,
+ from 10.34 onwards, if a pattern contains (*ACCEPT), this function is not
+ used. However, leave the code in place, just in case. */
case OP_ACCEPT:
case OP_ASSERT_ACCEPT:
@@ -214,9 +223,9 @@ for (;;)
/* Reached end of a branch; if it's a ket it is the end of a nested
call. If it's ALT it is an alternation in a nested call. If it is END it's
- the end of the outer call. All can be handled by the same code. If an
- ACCEPT was previously encountered, use the length that was in force at that
- time, and pass back the shortest ACCEPT length. */
+ the end of the outer call. All can be handled by the same code. If the
+ length of any branch is zero, there is no need to scan any subsequent
+ branches. */
case OP_ALT:
case OP_KET:
@@ -226,7 +235,8 @@ for (;;)
case OP_END:
if (length < 0 || (!had_recurse && branchlength < length))
length = branchlength;
- if (op != OP_ALT) return length;
+ if (op != OP_ALT || length == 0) return length;
+ nextbranch = cc + GET(cc, 1);
cc += 1 + LINK_SIZE;
branchlength = 0;
had_recurse = FALSE;
@@ -238,6 +248,8 @@ for (;;)
case OP_ASSERT_NOT:
case OP_ASSERTBACK:
case OP_ASSERTBACK_NOT:
+ case OP_ASSERT_NA:
+ case OP_ASSERTBACK_NA:
do cc += GET(cc, 1); while (*cc == OP_ALT);
/* Fall through */
@@ -451,15 +463,17 @@ for (;;)
If PCRE2_MATCH_UNSET_BACKREF is set, a backreference to an unset bracket
matches an empty string (by default it causes a matching failure), so in
- that case we must set the minimum length to zero. */
+ that case we must set the minimum length to zero.
+
+ For backreferenes, if duplicate numbers are present in the pattern we check
+ for a reference to a duplicate. If it is, we don't know which version will
+ be referenced, so we have to set the minimum length to zero. */
- /* Duplicate named pattern back reference. We cannot reliably find a length
- for this if duplicate numbers are present in the pattern. */
+ /* Duplicate named pattern back reference. */
case OP_DNREF:
case OP_DNREFI:
- if (dupcapused) return -1;
- if ((re->overall_options & PCRE2_MATCH_UNSET_BACKREF) == 0)
+ if (!dupcapused && (re->overall_options & PCRE2_MATCH_UNSET_BACKREF) == 0)
{
int count = GET2(cc, 1+IMM2_SIZE);
PCRE2_UCHAR *slot =
@@ -482,28 +496,32 @@ for (;;)
ce = cs = (PCRE2_UCHAR *)PRIV(find_bracket)(startcode, utf, recno);
if (cs == NULL) return -2;
do ce += GET(ce, 1); while (*ce == OP_ALT);
- if (cc > cs && cc < ce) /* Simple recursion */
- {
- dd = 0;
- had_recurse = TRUE;
- }
- else
+
+ dd = 0;
+ if (!dupcapused ||
+ (PCRE2_UCHAR *)PRIV(find_bracket)(ce, utf, recno) == NULL)
{
- recurse_check *r = recurses;
- for (r = recurses; r != NULL; r = r->prev)
- if (r->group == cs) break;
- if (r != NULL) /* Mutual recursion */
+ if (cc > cs && cc < ce) /* Simple recursion */
{
- dd = 0;
had_recurse = TRUE;
}
else
{
- this_recurse.prev = recurses;
- this_recurse.group = cs;
- dd = find_minlength(re, cs, startcode, utf, &this_recurse,
- countptr, backref_cache);
- if (dd < 0) return dd;
+ recurse_check *r = recurses;
+ for (r = recurses; r != NULL; r = r->prev)
+ if (r->group == cs) break;
+ if (r != NULL) /* Mutual recursion */
+ {
+ had_recurse = TRUE;
+ }
+ else
+ {
+ this_recurse.prev = recurses; /* No recursion */
+ this_recurse.group = cs;
+ dd = find_minlength(re, cs, startcode, utf, &this_recurse,
+ countptr, backref_cache);
+ if (dd < 0) return dd;
+ }
}
}
@@ -521,48 +539,51 @@ for (;;)
cc += 1 + 2*IMM2_SIZE;
goto REPEAT_BACK_REFERENCE;
- /* Single back reference. We cannot find a length for this if duplicate
- numbers are present in the pattern. */
+ /* Single back reference by number. References by name are converted to by
+ number when there is no duplication. */
case OP_REF:
case OP_REFI:
- if (dupcapused) return -1;
recno = GET2(cc, 1);
if (recno <= backref_cache[0] && backref_cache[recno] >= 0)
d = backref_cache[recno];
else
{
int i;
+ d = 0;
+
if ((re->overall_options & PCRE2_MATCH_UNSET_BACKREF) == 0)
{
ce = cs = (PCRE2_UCHAR *)PRIV(find_bracket)(startcode, utf, recno);
if (cs == NULL) return -2;
do ce += GET(ce, 1); while (*ce == OP_ALT);
- if (cc > cs && cc < ce) /* Simple recursion */
- {
- d = 0;
- had_recurse = TRUE;
- }
- else
+
+ if (!dupcapused ||
+ (PCRE2_UCHAR *)PRIV(find_bracket)(ce, utf, recno) == NULL)
{
- recurse_check *r = recurses;
- for (r = recurses; r != NULL; r = r->prev) if (r->group == cs) break;
- if (r != NULL) /* Mutual recursion */
+ if (cc > cs && cc < ce) /* Simple recursion */
{
- d = 0;
had_recurse = TRUE;
}
else
{
- this_recurse.prev = recurses;
- this_recurse.group = cs;
- d = find_minlength(re, cs, startcode, utf, &this_recurse, countptr,
- backref_cache);
- if (d < 0) return d;
+ recurse_check *r = recurses;
+ for (r = recurses; r != NULL; r = r->prev) if (r->group == cs) break;
+ if (r != NULL) /* Mutual recursion */
+ {
+ had_recurse = TRUE;
+ }
+ else /* No recursion */
+ {
+ this_recurse.prev = recurses;
+ this_recurse.group = cs;
+ d = find_minlength(re, cs, startcode, utf, &this_recurse, countptr,
+ backref_cache);
+ if (d < 0) return d;
+ }
}
}
}
- else d = 0;
backref_cache[recno] = d;
for (i = backref_cache[0] + 1; i < recno; i++) backref_cache[i] = -1;
@@ -888,7 +909,7 @@ if (table_limit != 32) for (c = 24; c < 32; c++) re->start_bitmap[c] = 0xff;
/*************************************************
-* Create bitmap of starting bytes *
+* Create bitmap of starting code units *
*************************************************/
/* This function scans a compiled unanchored expression recursively and
@@ -938,6 +959,9 @@ do
{
int rc;
uint8_t *classmap = NULL;
+#ifdef SUPPORT_WIDE_CHARS
+ PCRE2_UCHAR xclassflags;
+#endif
switch(*tcode)
{
@@ -1078,6 +1102,7 @@ do
case OP_ONCE:
case OP_SCRIPT_RUN:
case OP_ASSERT:
+ case OP_ASSERT_NA:
rc = set_start_bits(re, tcode, utf);
if (rc == SSB_FAIL || rc == SSB_UNKNOWN) return rc;
if (rc == SSB_DONE) try_next = FALSE; else
@@ -1120,6 +1145,7 @@ do
case OP_ASSERT_NOT:
case OP_ASSERTBACK:
case OP_ASSERTBACK_NOT:
+ case OP_ASSERTBACK_NA:
do tcode += GET(tcode, 1); while (*tcode == OP_ALT);
tcode += 1 + LINK_SIZE;
break;
@@ -1444,20 +1470,59 @@ do
negative XCLASS without a map, give up. If there are no property checks,
there must be wide characters on the XCLASS list, because otherwise an
XCLASS would not have been created. This means that code points >= 255
- are always potential starters. */
+ are potential starters. In the UTF-8 case we can scan them and set bits
+ for the relevant leading bytes. */
#ifdef SUPPORT_WIDE_CHARS
case OP_XCLASS:
- if ((tcode[1 + LINK_SIZE] & XCL_HASPROP) != 0 ||
- (tcode[1 + LINK_SIZE] & (XCL_MAP|XCL_NOT)) == XCL_NOT)
+ xclassflags = tcode[1 + LINK_SIZE];
+ if ((xclassflags & XCL_HASPROP) != 0 ||
+ (xclassflags & (XCL_MAP|XCL_NOT)) == XCL_NOT)
return SSB_FAIL;
/* We have a positive XCLASS or a negative one without a map. Set up the
map pointer if there is one, and fall through. */
- classmap = ((tcode[1 + LINK_SIZE] & XCL_MAP) == 0)? NULL :
+ classmap = ((xclassflags & XCL_MAP) == 0)? NULL :
(uint8_t *)(tcode + 1 + LINK_SIZE + 1);
-#endif
+
+ /* In UTF-8 mode, scan the character list and set bits for leading bytes,
+ then jump to handle the map. */
+
+#if PCRE2_CODE_UNIT_WIDTH == 8
+ if (utf && (xclassflags & XCL_NOT) == 0)
+ {
+ PCRE2_UCHAR b, e;
+ PCRE2_SPTR p = tcode + 1 + LINK_SIZE + 1 + ((classmap == NULL)? 0:32);
+ tcode += GET(tcode, 1);
+
+ for (;;) switch (*p++)
+ {
+ case XCL_SINGLE:
+ b = *p++;
+ while ((*p & 0xc0) == 0x80) p++;
+ re->start_bitmap[b/8] |= (1u << (b&7));
+ break;
+
+ case XCL_RANGE:
+ b = *p++;
+ while ((*p & 0xc0) == 0x80) p++;
+ e = *p++;
+ while ((*p & 0xc0) == 0x80) p++;
+ for (; b <= e; b++)
+ re->start_bitmap[b/8] |= (1u << (b&7));
+ break;
+
+ case XCL_END:
+ goto HANDLE_CLASSMAP;
+
+ default:
+ return SSB_UNKNOWN; /* Internal error, should not occur */
+ }
+ }
+#endif /* SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8 */
+#endif /* SUPPORT_WIDE_CHARS */
+
/* It seems that the fall through comment must be outside the #ifdef if
it is to avoid the gcc compiler warning. */
@@ -1499,6 +1564,9 @@ do
greater than 127. In fact, there are only two possible starting bytes for
characters in the range 128 - 255. */
+#if defined SUPPORT_WIDE_CHARS && PCRE2_CODE_UNIT_WIDTH == 8
+ HANDLE_CLASSMAP:
+#endif
if (classmap != NULL)
{
#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8
@@ -1569,7 +1637,9 @@ return yield;
/* This function is handed a compiled expression that it must study to produce
information that will speed up the matching.
-Argument: points to the compiled expression
+Argument:
+ re points to the compiled expression
+
Returns: 0 normally; non-zero should never normally occur
1 unknown opcode in set_start_bits
2 missing capturing bracket
@@ -1579,7 +1649,6 @@ Returns: 0 normally; non-zero should never normally occur
int
PRIV(study)(pcre2_real_code *re)
{
-int min;
int count = 0;
PCRE2_UCHAR *code;
BOOL utf = (re->overall_options & PCRE2_UTF) != 0;
@@ -1597,25 +1666,121 @@ if ((re->flags & (PCRE2_FIRSTSET|PCRE2_STARTLINE)) == 0)
{
int rc = set_start_bits(re, code, utf);
if (rc == SSB_UNKNOWN) return 1;
- if (rc == SSB_DONE) re->flags |= PCRE2_FIRSTMAPSET;
+
+ /* If a list of starting code units was set up, scan the list to see if only
+ one or two were listed. Having only one listed is rare because usually a
+ single starting code unit will have been recognized and PCRE2_FIRSTSET set.
+ If two are listed, see if they are caseless versions of the same character;
+ if so we can replace the list with a caseless first code unit. This gives
+ better performance and is plausibly worth doing for patterns such as [Ww]ord
+ or (word|WORD). */
+
+ if (rc == SSB_DONE)
+ {
+ int i;
+ int a = -1;
+ int b = -1;
+ uint8_t *p = re->start_bitmap;
+ uint32_t flags = PCRE2_FIRSTMAPSET;
+
+ for (i = 0; i < 256; p++, i += 8)
+ {
+ uint8_t x = *p;
+ if (x != 0)
+ {
+ int c;
+ uint8_t y = x & (~x + 1); /* Least significant bit */
+ if (y != x) goto DONE; /* More than one bit set */
+
+ /* In the 16-bit and 32-bit libraries, the bit for 0xff means "0xff and
+ all wide characters", so we cannot use it here. */
+
+#if PCRE2_CODE_UNIT_WIDTH != 8
+ if (i == 248 && x == 0x80) goto DONE;
+#endif
+
+ /* Compute the character value */
+
+ c = i;
+ switch (x)
+ {
+ case 1: break;
+ case 2: c += 1; break; case 4: c += 2; break;
+ case 8: c += 3; break; case 16: c += 4; break;
+ case 32: c += 5; break; case 64: c += 6; break;
+ case 128: c += 7; break;
+ }
+
+ /* c contains the code unit value, in the range 0-255. In 8-bit UTF
+ mode, only values < 128 can be used. */
+
+#if PCRE2_CODE_UNIT_WIDTH == 8
+ if (c > 127) goto DONE;
+#endif
+ if (a < 0) a = c; /* First one found */
+ else if (b < 0) /* Second one found */
+ {
+ int d = TABLE_GET((unsigned int)c, re->tables + fcc_offset, c);
+
+#ifdef SUPPORT_UNICODE
+#if PCRE2_CODE_UNIT_WIDTH == 8
+ if (utf && UCD_CASESET(c) != 0) goto DONE; /* Multiple case set */
+#else /* 16-bit or 32-bit */
+ if (UCD_CASESET(c) != 0) goto DONE; /* Multiple case set */
+ if (utf && c > 127) d = UCD_OTHERCASE(c);
+#endif /* Code width */
+#endif /* SUPPORT_UNICODE */
+
+ if (d != a) goto DONE; /* Not other case of a */
+ b = c;
+ }
+ else goto DONE; /* More than two characters found */
+ }
+ }
+
+ /* Replace the start code unit bits with a first code unit, but only if it
+ is not the same as a required later code unit. This is because a search for
+ a required code unit starts after an explicit first code unit, but at a
+ code unit found from the bitmap. Patterns such as /a*a/ don't work
+ if both the start unit and required unit are the same. */
+
+ if (a >= 0 &&
+ (
+ (re->flags & PCRE2_LASTSET) == 0 ||
+ (
+ re->last_codeunit != (uint32_t)a &&
+ (b < 0 || re->last_codeunit != (uint32_t)b)
+ )
+ ))
+ {
+ re->first_codeunit = a;
+ flags = PCRE2_FIRSTSET;
+ if (b >= 0) flags |= PCRE2_FIRSTCASELESS;
+ }
+
+ DONE:
+ re->flags |= flags;
+ }
}
/* Find the minimum length of subject string. If the pattern can match an empty
-string, the minimum length is already known. If there are more back references
-than the size of the vector we are going to cache them in, do nothing. A
-pattern that complicated will probably take a long time to analyze and may in
-any case turn out to be too complicated. Note that back reference minima are
-held as 16-bit numbers. */
-
-if ((re->flags & PCRE2_MATCH_EMPTY) == 0 &&
+string, the minimum length is already known. If the pattern contains (*ACCEPT)
+all bets are off, and we don't even try to find a minimum length. If there are
+more back references than the size of the vector we are going to cache them in,
+do nothing. A pattern that complicated will probably take a long time to
+analyze and may in any case turn out to be too complicated. Note that back
+reference minima are held as 16-bit numbers. */
+
+if ((re->flags & (PCRE2_MATCH_EMPTY|PCRE2_HASACCEPT)) == 0 &&
re->top_backref <= MAX_CACHE_BACKREF)
{
+ int min;
int backref_cache[MAX_CACHE_BACKREF+1];
backref_cache[0] = 0; /* Highest one that is set */
min = find_minlength(re, code, code, utf, NULL, &count, backref_cache);
switch(min)
{
- case -1: /* \C in UTF mode or (*ACCEPT) or over-complex regex */
+ case -1: /* \C in UTF mode or over-complex regex */
break; /* Leave minlength unchanged (will be zero) */
case -2:
@@ -1625,8 +1790,7 @@ if ((re->flags & PCRE2_MATCH_EMPTY) == 0 &&
return 3; /* unrecognized opcode */
default:
- if (min > UINT16_MAX) min = UINT16_MAX;
- re->minlength = min;
+ re->minlength = (min > UINT16_MAX)? UINT16_MAX : min;
break;
}
}
diff --git a/thirdparty/pcre2/src/pcre2_tables.c b/thirdparty/pcre2/src/pcre2_tables.c
index 84019361fc..25531d98c6 100644
--- a/thirdparty/pcre2/src/pcre2_tables.c
+++ b/thirdparty/pcre2/src/pcre2_tables.c
@@ -279,6 +279,7 @@ strings to make sure that UTF-8 support works on EBCDIC platforms. */
#define STRING_Duployan0 STR_D STR_u STR_p STR_l STR_o STR_y STR_a STR_n "\0"
#define STRING_Egyptian_Hieroglyphs0 STR_E STR_g STR_y STR_p STR_t STR_i STR_a STR_n STR_UNDERSCORE STR_H STR_i STR_e STR_r STR_o STR_g STR_l STR_y STR_p STR_h STR_s "\0"
#define STRING_Elbasan0 STR_E STR_l STR_b STR_a STR_s STR_a STR_n "\0"
+#define STRING_Elymaic0 STR_E STR_l STR_y STR_m STR_a STR_i STR_c "\0"
#define STRING_Ethiopic0 STR_E STR_t STR_h STR_i STR_o STR_p STR_i STR_c "\0"
#define STRING_Georgian0 STR_G STR_e STR_o STR_r STR_g STR_i STR_a STR_n "\0"
#define STRING_Glagolitic0 STR_G STR_l STR_a STR_g STR_o STR_l STR_i STR_t STR_i STR_c "\0"
@@ -348,6 +349,7 @@ strings to make sure that UTF-8 support works on EBCDIC platforms. */
#define STRING_Myanmar0 STR_M STR_y STR_a STR_n STR_m STR_a STR_r "\0"
#define STRING_N0 STR_N "\0"
#define STRING_Nabataean0 STR_N STR_a STR_b STR_a STR_t STR_a STR_e STR_a STR_n "\0"
+#define STRING_Nandinagari0 STR_N STR_a STR_n STR_d STR_i STR_n STR_a STR_g STR_a STR_r STR_i "\0"
#define STRING_Nd0 STR_N STR_d "\0"
#define STRING_New_Tai_Lue0 STR_N STR_e STR_w STR_UNDERSCORE STR_T STR_a STR_i STR_UNDERSCORE STR_L STR_u STR_e "\0"
#define STRING_Newa0 STR_N STR_e STR_w STR_a "\0"
@@ -355,6 +357,7 @@ strings to make sure that UTF-8 support works on EBCDIC platforms. */
#define STRING_Nl0 STR_N STR_l "\0"
#define STRING_No0 STR_N STR_o "\0"
#define STRING_Nushu0 STR_N STR_u STR_s STR_h STR_u "\0"
+#define STRING_Nyiakeng_Puachue_Hmong0 STR_N STR_y STR_i STR_a STR_k STR_e STR_n STR_g STR_UNDERSCORE STR_P STR_u STR_a STR_c STR_h STR_u STR_e STR_UNDERSCORE STR_H STR_m STR_o STR_n STR_g "\0"
#define STRING_Ogham0 STR_O STR_g STR_h STR_a STR_m "\0"
#define STRING_Ol_Chiki0 STR_O STR_l STR_UNDERSCORE STR_C STR_h STR_i STR_k STR_i "\0"
#define STRING_Old_Hungarian0 STR_O STR_l STR_d STR_UNDERSCORE STR_H STR_u STR_n STR_g STR_a STR_r STR_i STR_a STR_n "\0"
@@ -419,6 +422,7 @@ strings to make sure that UTF-8 support works on EBCDIC platforms. */
#define STRING_Ugaritic0 STR_U STR_g STR_a STR_r STR_i STR_t STR_i STR_c "\0"
#define STRING_Unknown0 STR_U STR_n STR_k STR_n STR_o STR_w STR_n "\0"
#define STRING_Vai0 STR_V STR_a STR_i "\0"
+#define STRING_Wancho0 STR_W STR_a STR_n STR_c STR_h STR_o "\0"
#define STRING_Warang_Citi0 STR_W STR_a STR_r STR_a STR_n STR_g STR_UNDERSCORE STR_C STR_i STR_t STR_i "\0"
#define STRING_Xan0 STR_X STR_a STR_n "\0"
#define STRING_Xps0 STR_X STR_p STR_s "\0"
@@ -474,6 +478,7 @@ const char PRIV(utt_names)[] =
STRING_Duployan0
STRING_Egyptian_Hieroglyphs0
STRING_Elbasan0
+ STRING_Elymaic0
STRING_Ethiopic0
STRING_Georgian0
STRING_Glagolitic0
@@ -543,6 +548,7 @@ const char PRIV(utt_names)[] =
STRING_Myanmar0
STRING_N0
STRING_Nabataean0
+ STRING_Nandinagari0
STRING_Nd0
STRING_New_Tai_Lue0
STRING_Newa0
@@ -550,6 +556,7 @@ const char PRIV(utt_names)[] =
STRING_Nl0
STRING_No0
STRING_Nushu0
+ STRING_Nyiakeng_Puachue_Hmong0
STRING_Ogham0
STRING_Ol_Chiki0
STRING_Old_Hungarian0
@@ -614,6 +621,7 @@ const char PRIV(utt_names)[] =
STRING_Ugaritic0
STRING_Unknown0
STRING_Vai0
+ STRING_Wancho0
STRING_Warang_Citi0
STRING_Xan0
STRING_Xps0
@@ -669,158 +677,162 @@ const ucp_type_table PRIV(utt)[] = {
{ 299, PT_SC, ucp_Duployan },
{ 308, PT_SC, ucp_Egyptian_Hieroglyphs },
{ 329, PT_SC, ucp_Elbasan },
- { 337, PT_SC, ucp_Ethiopic },
- { 346, PT_SC, ucp_Georgian },
- { 355, PT_SC, ucp_Glagolitic },
- { 366, PT_SC, ucp_Gothic },
- { 373, PT_SC, ucp_Grantha },
- { 381, PT_SC, ucp_Greek },
- { 387, PT_SC, ucp_Gujarati },
- { 396, PT_SC, ucp_Gunjala_Gondi },
- { 410, PT_SC, ucp_Gurmukhi },
- { 419, PT_SC, ucp_Han },
- { 423, PT_SC, ucp_Hangul },
- { 430, PT_SC, ucp_Hanifi_Rohingya },
- { 446, PT_SC, ucp_Hanunoo },
- { 454, PT_SC, ucp_Hatran },
- { 461, PT_SC, ucp_Hebrew },
- { 468, PT_SC, ucp_Hiragana },
- { 477, PT_SC, ucp_Imperial_Aramaic },
- { 494, PT_SC, ucp_Inherited },
- { 504, PT_SC, ucp_Inscriptional_Pahlavi },
- { 526, PT_SC, ucp_Inscriptional_Parthian },
- { 549, PT_SC, ucp_Javanese },
- { 558, PT_SC, ucp_Kaithi },
- { 565, PT_SC, ucp_Kannada },
- { 573, PT_SC, ucp_Katakana },
- { 582, PT_SC, ucp_Kayah_Li },
- { 591, PT_SC, ucp_Kharoshthi },
- { 602, PT_SC, ucp_Khmer },
- { 608, PT_SC, ucp_Khojki },
- { 615, PT_SC, ucp_Khudawadi },
- { 625, PT_GC, ucp_L },
- { 627, PT_LAMP, 0 },
- { 630, PT_SC, ucp_Lao },
- { 634, PT_SC, ucp_Latin },
- { 640, PT_SC, ucp_Lepcha },
- { 647, PT_SC, ucp_Limbu },
- { 653, PT_SC, ucp_Linear_A },
- { 662, PT_SC, ucp_Linear_B },
- { 671, PT_SC, ucp_Lisu },
- { 676, PT_PC, ucp_Ll },
- { 679, PT_PC, ucp_Lm },
- { 682, PT_PC, ucp_Lo },
- { 685, PT_PC, ucp_Lt },
- { 688, PT_PC, ucp_Lu },
- { 691, PT_SC, ucp_Lycian },
- { 698, PT_SC, ucp_Lydian },
- { 705, PT_GC, ucp_M },
- { 707, PT_SC, ucp_Mahajani },
- { 716, PT_SC, ucp_Makasar },
- { 724, PT_SC, ucp_Malayalam },
- { 734, PT_SC, ucp_Mandaic },
- { 742, PT_SC, ucp_Manichaean },
- { 753, PT_SC, ucp_Marchen },
- { 761, PT_SC, ucp_Masaram_Gondi },
- { 775, PT_PC, ucp_Mc },
- { 778, PT_PC, ucp_Me },
- { 781, PT_SC, ucp_Medefaidrin },
- { 793, PT_SC, ucp_Meetei_Mayek },
- { 806, PT_SC, ucp_Mende_Kikakui },
- { 820, PT_SC, ucp_Meroitic_Cursive },
- { 837, PT_SC, ucp_Meroitic_Hieroglyphs },
- { 858, PT_SC, ucp_Miao },
- { 863, PT_PC, ucp_Mn },
- { 866, PT_SC, ucp_Modi },
- { 871, PT_SC, ucp_Mongolian },
- { 881, PT_SC, ucp_Mro },
- { 885, PT_SC, ucp_Multani },
- { 893, PT_SC, ucp_Myanmar },
- { 901, PT_GC, ucp_N },
- { 903, PT_SC, ucp_Nabataean },
- { 913, PT_PC, ucp_Nd },
- { 916, PT_SC, ucp_New_Tai_Lue },
- { 928, PT_SC, ucp_Newa },
- { 933, PT_SC, ucp_Nko },
- { 937, PT_PC, ucp_Nl },
- { 940, PT_PC, ucp_No },
- { 943, PT_SC, ucp_Nushu },
- { 949, PT_SC, ucp_Ogham },
- { 955, PT_SC, ucp_Ol_Chiki },
- { 964, PT_SC, ucp_Old_Hungarian },
- { 978, PT_SC, ucp_Old_Italic },
- { 989, PT_SC, ucp_Old_North_Arabian },
- { 1007, PT_SC, ucp_Old_Permic },
- { 1018, PT_SC, ucp_Old_Persian },
- { 1030, PT_SC, ucp_Old_Sogdian },
- { 1042, PT_SC, ucp_Old_South_Arabian },
- { 1060, PT_SC, ucp_Old_Turkic },
- { 1071, PT_SC, ucp_Oriya },
- { 1077, PT_SC, ucp_Osage },
- { 1083, PT_SC, ucp_Osmanya },
- { 1091, PT_GC, ucp_P },
- { 1093, PT_SC, ucp_Pahawh_Hmong },
- { 1106, PT_SC, ucp_Palmyrene },
- { 1116, PT_SC, ucp_Pau_Cin_Hau },
- { 1128, PT_PC, ucp_Pc },
- { 1131, PT_PC, ucp_Pd },
- { 1134, PT_PC, ucp_Pe },
- { 1137, PT_PC, ucp_Pf },
- { 1140, PT_SC, ucp_Phags_Pa },
- { 1149, PT_SC, ucp_Phoenician },
- { 1160, PT_PC, ucp_Pi },
- { 1163, PT_PC, ucp_Po },
- { 1166, PT_PC, ucp_Ps },
- { 1169, PT_SC, ucp_Psalter_Pahlavi },
- { 1185, PT_SC, ucp_Rejang },
- { 1192, PT_SC, ucp_Runic },
- { 1198, PT_GC, ucp_S },
- { 1200, PT_SC, ucp_Samaritan },
- { 1210, PT_SC, ucp_Saurashtra },
- { 1221, PT_PC, ucp_Sc },
- { 1224, PT_SC, ucp_Sharada },
- { 1232, PT_SC, ucp_Shavian },
- { 1240, PT_SC, ucp_Siddham },
- { 1248, PT_SC, ucp_SignWriting },
- { 1260, PT_SC, ucp_Sinhala },
- { 1268, PT_PC, ucp_Sk },
- { 1271, PT_PC, ucp_Sm },
- { 1274, PT_PC, ucp_So },
- { 1277, PT_SC, ucp_Sogdian },
- { 1285, PT_SC, ucp_Sora_Sompeng },
- { 1298, PT_SC, ucp_Soyombo },
- { 1306, PT_SC, ucp_Sundanese },
- { 1316, PT_SC, ucp_Syloti_Nagri },
- { 1329, PT_SC, ucp_Syriac },
- { 1336, PT_SC, ucp_Tagalog },
- { 1344, PT_SC, ucp_Tagbanwa },
- { 1353, PT_SC, ucp_Tai_Le },
- { 1360, PT_SC, ucp_Tai_Tham },
- { 1369, PT_SC, ucp_Tai_Viet },
- { 1378, PT_SC, ucp_Takri },
- { 1384, PT_SC, ucp_Tamil },
- { 1390, PT_SC, ucp_Tangut },
- { 1397, PT_SC, ucp_Telugu },
- { 1404, PT_SC, ucp_Thaana },
- { 1411, PT_SC, ucp_Thai },
- { 1416, PT_SC, ucp_Tibetan },
- { 1424, PT_SC, ucp_Tifinagh },
- { 1433, PT_SC, ucp_Tirhuta },
- { 1441, PT_SC, ucp_Ugaritic },
- { 1450, PT_SC, ucp_Unknown },
- { 1458, PT_SC, ucp_Vai },
- { 1462, PT_SC, ucp_Warang_Citi },
- { 1474, PT_ALNUM, 0 },
- { 1478, PT_PXSPACE, 0 },
- { 1482, PT_SPACE, 0 },
- { 1486, PT_UCNC, 0 },
- { 1490, PT_WORD, 0 },
- { 1494, PT_SC, ucp_Yi },
- { 1497, PT_GC, ucp_Z },
- { 1499, PT_SC, ucp_Zanabazar_Square },
- { 1516, PT_PC, ucp_Zl },
- { 1519, PT_PC, ucp_Zp },
- { 1522, PT_PC, ucp_Zs }
+ { 337, PT_SC, ucp_Elymaic },
+ { 345, PT_SC, ucp_Ethiopic },
+ { 354, PT_SC, ucp_Georgian },
+ { 363, PT_SC, ucp_Glagolitic },
+ { 374, PT_SC, ucp_Gothic },
+ { 381, PT_SC, ucp_Grantha },
+ { 389, PT_SC, ucp_Greek },
+ { 395, PT_SC, ucp_Gujarati },
+ { 404, PT_SC, ucp_Gunjala_Gondi },
+ { 418, PT_SC, ucp_Gurmukhi },
+ { 427, PT_SC, ucp_Han },
+ { 431, PT_SC, ucp_Hangul },
+ { 438, PT_SC, ucp_Hanifi_Rohingya },
+ { 454, PT_SC, ucp_Hanunoo },
+ { 462, PT_SC, ucp_Hatran },
+ { 469, PT_SC, ucp_Hebrew },
+ { 476, PT_SC, ucp_Hiragana },
+ { 485, PT_SC, ucp_Imperial_Aramaic },
+ { 502, PT_SC, ucp_Inherited },
+ { 512, PT_SC, ucp_Inscriptional_Pahlavi },
+ { 534, PT_SC, ucp_Inscriptional_Parthian },
+ { 557, PT_SC, ucp_Javanese },
+ { 566, PT_SC, ucp_Kaithi },
+ { 573, PT_SC, ucp_Kannada },
+ { 581, PT_SC, ucp_Katakana },
+ { 590, PT_SC, ucp_Kayah_Li },
+ { 599, PT_SC, ucp_Kharoshthi },
+ { 610, PT_SC, ucp_Khmer },
+ { 616, PT_SC, ucp_Khojki },
+ { 623, PT_SC, ucp_Khudawadi },
+ { 633, PT_GC, ucp_L },
+ { 635, PT_LAMP, 0 },
+ { 638, PT_SC, ucp_Lao },
+ { 642, PT_SC, ucp_Latin },
+ { 648, PT_SC, ucp_Lepcha },
+ { 655, PT_SC, ucp_Limbu },
+ { 661, PT_SC, ucp_Linear_A },
+ { 670, PT_SC, ucp_Linear_B },
+ { 679, PT_SC, ucp_Lisu },
+ { 684, PT_PC, ucp_Ll },
+ { 687, PT_PC, ucp_Lm },
+ { 690, PT_PC, ucp_Lo },
+ { 693, PT_PC, ucp_Lt },
+ { 696, PT_PC, ucp_Lu },
+ { 699, PT_SC, ucp_Lycian },
+ { 706, PT_SC, ucp_Lydian },
+ { 713, PT_GC, ucp_M },
+ { 715, PT_SC, ucp_Mahajani },
+ { 724, PT_SC, ucp_Makasar },
+ { 732, PT_SC, ucp_Malayalam },
+ { 742, PT_SC, ucp_Mandaic },
+ { 750, PT_SC, ucp_Manichaean },
+ { 761, PT_SC, ucp_Marchen },
+ { 769, PT_SC, ucp_Masaram_Gondi },
+ { 783, PT_PC, ucp_Mc },
+ { 786, PT_PC, ucp_Me },
+ { 789, PT_SC, ucp_Medefaidrin },
+ { 801, PT_SC, ucp_Meetei_Mayek },
+ { 814, PT_SC, ucp_Mende_Kikakui },
+ { 828, PT_SC, ucp_Meroitic_Cursive },
+ { 845, PT_SC, ucp_Meroitic_Hieroglyphs },
+ { 866, PT_SC, ucp_Miao },
+ { 871, PT_PC, ucp_Mn },
+ { 874, PT_SC, ucp_Modi },
+ { 879, PT_SC, ucp_Mongolian },
+ { 889, PT_SC, ucp_Mro },
+ { 893, PT_SC, ucp_Multani },
+ { 901, PT_SC, ucp_Myanmar },
+ { 909, PT_GC, ucp_N },
+ { 911, PT_SC, ucp_Nabataean },
+ { 921, PT_SC, ucp_Nandinagari },
+ { 933, PT_PC, ucp_Nd },
+ { 936, PT_SC, ucp_New_Tai_Lue },
+ { 948, PT_SC, ucp_Newa },
+ { 953, PT_SC, ucp_Nko },
+ { 957, PT_PC, ucp_Nl },
+ { 960, PT_PC, ucp_No },
+ { 963, PT_SC, ucp_Nushu },
+ { 969, PT_SC, ucp_Nyiakeng_Puachue_Hmong },
+ { 992, PT_SC, ucp_Ogham },
+ { 998, PT_SC, ucp_Ol_Chiki },
+ { 1007, PT_SC, ucp_Old_Hungarian },
+ { 1021, PT_SC, ucp_Old_Italic },
+ { 1032, PT_SC, ucp_Old_North_Arabian },
+ { 1050, PT_SC, ucp_Old_Permic },
+ { 1061, PT_SC, ucp_Old_Persian },
+ { 1073, PT_SC, ucp_Old_Sogdian },
+ { 1085, PT_SC, ucp_Old_South_Arabian },
+ { 1103, PT_SC, ucp_Old_Turkic },
+ { 1114, PT_SC, ucp_Oriya },
+ { 1120, PT_SC, ucp_Osage },
+ { 1126, PT_SC, ucp_Osmanya },
+ { 1134, PT_GC, ucp_P },
+ { 1136, PT_SC, ucp_Pahawh_Hmong },
+ { 1149, PT_SC, ucp_Palmyrene },
+ { 1159, PT_SC, ucp_Pau_Cin_Hau },
+ { 1171, PT_PC, ucp_Pc },
+ { 1174, PT_PC, ucp_Pd },
+ { 1177, PT_PC, ucp_Pe },
+ { 1180, PT_PC, ucp_Pf },
+ { 1183, PT_SC, ucp_Phags_Pa },
+ { 1192, PT_SC, ucp_Phoenician },
+ { 1203, PT_PC, ucp_Pi },
+ { 1206, PT_PC, ucp_Po },
+ { 1209, PT_PC, ucp_Ps },
+ { 1212, PT_SC, ucp_Psalter_Pahlavi },
+ { 1228, PT_SC, ucp_Rejang },
+ { 1235, PT_SC, ucp_Runic },
+ { 1241, PT_GC, ucp_S },
+ { 1243, PT_SC, ucp_Samaritan },
+ { 1253, PT_SC, ucp_Saurashtra },
+ { 1264, PT_PC, ucp_Sc },
+ { 1267, PT_SC, ucp_Sharada },
+ { 1275, PT_SC, ucp_Shavian },
+ { 1283, PT_SC, ucp_Siddham },
+ { 1291, PT_SC, ucp_SignWriting },
+ { 1303, PT_SC, ucp_Sinhala },
+ { 1311, PT_PC, ucp_Sk },
+ { 1314, PT_PC, ucp_Sm },
+ { 1317, PT_PC, ucp_So },
+ { 1320, PT_SC, ucp_Sogdian },
+ { 1328, PT_SC, ucp_Sora_Sompeng },
+ { 1341, PT_SC, ucp_Soyombo },
+ { 1349, PT_SC, ucp_Sundanese },
+ { 1359, PT_SC, ucp_Syloti_Nagri },
+ { 1372, PT_SC, ucp_Syriac },
+ { 1379, PT_SC, ucp_Tagalog },
+ { 1387, PT_SC, ucp_Tagbanwa },
+ { 1396, PT_SC, ucp_Tai_Le },
+ { 1403, PT_SC, ucp_Tai_Tham },
+ { 1412, PT_SC, ucp_Tai_Viet },
+ { 1421, PT_SC, ucp_Takri },
+ { 1427, PT_SC, ucp_Tamil },
+ { 1433, PT_SC, ucp_Tangut },
+ { 1440, PT_SC, ucp_Telugu },
+ { 1447, PT_SC, ucp_Thaana },
+ { 1454, PT_SC, ucp_Thai },
+ { 1459, PT_SC, ucp_Tibetan },
+ { 1467, PT_SC, ucp_Tifinagh },
+ { 1476, PT_SC, ucp_Tirhuta },
+ { 1484, PT_SC, ucp_Ugaritic },
+ { 1493, PT_SC, ucp_Unknown },
+ { 1501, PT_SC, ucp_Vai },
+ { 1505, PT_SC, ucp_Wancho },
+ { 1512, PT_SC, ucp_Warang_Citi },
+ { 1524, PT_ALNUM, 0 },
+ { 1528, PT_PXSPACE, 0 },
+ { 1532, PT_SPACE, 0 },
+ { 1536, PT_UCNC, 0 },
+ { 1540, PT_WORD, 0 },
+ { 1544, PT_SC, ucp_Yi },
+ { 1547, PT_GC, ucp_Z },
+ { 1549, PT_SC, ucp_Zanabazar_Square },
+ { 1566, PT_PC, ucp_Zl },
+ { 1569, PT_PC, ucp_Zp },
+ { 1572, PT_PC, ucp_Zs }
};
const size_t PRIV(utt_size) = sizeof(PRIV(utt)) / sizeof(ucp_type_table);
diff --git a/thirdparty/pcre2/src/pcre2_ucd.c b/thirdparty/pcre2/src/pcre2_ucd.c
index cc53c24001..55ba03bd43 100644
--- a/thirdparty/pcre2/src/pcre2_ucd.c
+++ b/thirdparty/pcre2/src/pcre2_ucd.c
@@ -20,7 +20,7 @@ needed. */
/* Unicode character database. */
/* This file was autogenerated by the MultiStage2.py script. */
-/* Total size: 97152 bytes, block size: 128. */
+/* Total size: 99316 bytes, block size: 128. */
/* The tables herein are needed only when UCP support is built,
and in PCRE2 that happens automatically with UTF support.
@@ -39,7 +39,7 @@ const uint16_t PRIV(ucd_stage2)[] = {0};
const uint32_t PRIV(ucd_caseless_sets)[] = {0};
#else
-const char *PRIV(unicode_version) = "11.0.0";
+const char *PRIV(unicode_version) = "12.1.0";
/* If the 32-bit library is run in non-32-bit mode, character values
greater than 0x10ffff may be encountered. For these we set up a
@@ -116,7 +116,7 @@ set of decimal digits. It is used to ensure that all the digits in
a script run come from the same set. */
const uint32_t PRIV(ucd_digit_sets)[] = {
- 61, /* Number of subsequent values */
+ 63, /* Number of subsequent values */
0x00039, 0x00669, 0x006f9, 0x007c9, 0x0096f, 0x009ef, 0x00a6f, 0x00aef,
0x00b6f, 0x00bef, 0x00c6f, 0x00cef, 0x00d6f, 0x00def, 0x00e59, 0x00ed9,
0x00f29, 0x01049, 0x01099, 0x017e9, 0x01819, 0x0194f, 0x019d9, 0x01a89,
@@ -124,7 +124,7 @@ const uint32_t PRIV(ucd_digit_sets)[] = {
0x0a9d9, 0x0a9f9, 0x0aa59, 0x0abf9, 0x0ff19, 0x104a9, 0x10d39, 0x1106f,
0x110f9, 0x1113f, 0x111d9, 0x112f9, 0x11459, 0x114d9, 0x11659, 0x116c9,
0x11739, 0x118e9, 0x11c59, 0x11d59, 0x11da9, 0x16a69, 0x16b59, 0x1d7d7,
- 0x1d7e1, 0x1d7eb, 0x1d7f5, 0x1d7ff, 0x1e959,
+ 0x1d7e1, 0x1d7eb, 0x1d7f5, 0x1d7ff, 0x1e149, 0x1e2f9, 0x1e959,
};
/* This vector is a list of lists of scripts for the Script Extension
@@ -145,38 +145,42 @@ const uint8_t PRIV(ucd_script_sets)[] = {
/* 31 */ 13, 34, 0,
/* 34 */ 13, 118, 0,
/* 37 */ 15, 107, 0,
- /* 40 */ 15, 100, 0,
- /* 43 */ 15, 54, 0,
- /* 46 */ 17, 34, 0,
- /* 49 */ 107, 54, 0,
- /* 52 */ 21, 108, 0,
- /* 55 */ 22, 129, 0,
- /* 58 */ 27, 30, 0,
- /* 61 */ 38, 65, 0,
- /* 64 */ 1, 50, 56, 0,
- /* 68 */ 3, 96, 49, 0,
- /* 72 */ 96, 39, 53, 0,
- /* 76 */ 12, 110, 36, 0,
- /* 80 */ 15, 107, 29, 0,
- /* 84 */ 15, 107, 34, 0,
- /* 88 */ 23, 27, 30, 0,
- /* 92 */ 69, 34, 39, 0,
- /* 96 */ 1, 144, 50, 56, 0,
- /* 101 */ 3, 15, 107, 29, 0,
- /* 106 */ 7, 25, 52, 51, 0,
- /* 111 */ 15, 142, 85, 111, 0,
- /* 116 */ 4, 24, 23, 27, 30, 0,
- /* 122 */ 4, 24, 23, 27, 30, 61, 0,
- /* 129 */ 15, 29, 37, 44, 54, 55, 0,
- /* 136 */ 132, 1, 95, 112, 121, 144, 148, 50, 0,
- /* 145 */ 15, 142, 21, 22, 108, 85, 111, 114, 109, 102, 124, 0,
- /* 157 */ 3, 15, 107, 21, 22, 29, 34, 37, 44, 54, 55, 124, 0,
- /* 170 */ 15, 142, 21, 22, 108, 29, 85, 111, 114, 109, 102, 124, 0,
- /* 183 */ 3, 15, 107, 21, 22, 29, 34, 37, 44, 100, 54, 55, 124, 0,
- /* 197 */ 15, 142, 21, 22, 108, 29, 85, 111, 37, 114, 109, 102, 124, 0,
- /* 211 */ 3, 15, 142, 143, 107, 21, 22, 29, 111, 37, 44, 109, 48, 49, 102, 54, 55, 124, 0,
- /* 230 */ 3, 15, 142, 143, 107, 21, 22, 29, 35, 111, 37, 44, 109, 48, 49, 102, 54, 55, 124, 0,
- /* 250 */
+ /* 40 */ 15, 150, 0,
+ /* 43 */ 15, 100, 0,
+ /* 46 */ 15, 54, 0,
+ /* 49 */ 17, 34, 0,
+ /* 52 */ 107, 54, 0,
+ /* 55 */ 21, 108, 0,
+ /* 58 */ 22, 129, 0,
+ /* 61 */ 27, 30, 0,
+ /* 64 */ 29, 150, 0,
+ /* 67 */ 34, 38, 0,
+ /* 70 */ 38, 65, 0,
+ /* 73 */ 1, 50, 56, 0,
+ /* 77 */ 3, 96, 49, 0,
+ /* 81 */ 96, 39, 53, 0,
+ /* 85 */ 12, 110, 36, 0,
+ /* 89 */ 15, 107, 29, 0,
+ /* 93 */ 15, 107, 34, 0,
+ /* 97 */ 23, 27, 30, 0,
+ /* 101 */ 69, 34, 39, 0,
+ /* 105 */ 1, 144, 50, 56, 0,
+ /* 110 */ 3, 15, 107, 29, 0,
+ /* 115 */ 7, 25, 52, 51, 0,
+ /* 120 */ 15, 142, 85, 111, 0,
+ /* 125 */ 4, 24, 23, 27, 30, 0,
+ /* 131 */ 4, 24, 23, 27, 30, 61, 0,
+ /* 138 */ 15, 29, 37, 44, 54, 55, 0,
+ /* 145 */ 132, 1, 95, 112, 121, 144, 148, 50, 0,
+ /* 154 */ 3, 15, 107, 29, 150, 44, 55, 124, 0,
+ /* 163 */ 15, 142, 21, 22, 108, 85, 111, 114, 109, 102, 124, 0,
+ /* 175 */ 3, 15, 107, 21, 22, 29, 34, 37, 44, 54, 55, 124, 0,
+ /* 188 */ 3, 15, 107, 21, 22, 29, 34, 37, 44, 100, 54, 55, 124, 0,
+ /* 202 */ 15, 142, 21, 22, 108, 29, 85, 111, 114, 150, 109, 102, 124, 0,
+ /* 216 */ 15, 142, 21, 22, 108, 29, 85, 111, 37, 114, 150, 109, 102, 124, 0,
+ /* 231 */ 3, 15, 142, 143, 138, 107, 21, 22, 29, 111, 37, 150, 44, 109, 48, 49, 102, 54, 55, 124, 0,
+ /* 252 */ 3, 15, 142, 143, 138, 107, 21, 22, 29, 35, 111, 37, 150, 44, 109, 48, 49, 102, 54, 55, 124, 0,
+ /* 274 */
};
/* These are the main two-stage UCD tables. The fields in each record are:
@@ -185,7 +189,7 @@ offset to multichar other cases or zero (8 bits), offset to other case
or zero (32 bits, signed), script extension (16 bits, signed), and a dummy
16-bit field to make the whole thing a multiple of 4 bytes. */
-const ucd_record PRIV(ucd_records)[] = { /* 11136 bytes, record size 12 */
+const ucd_record PRIV(ucd_records)[] = { /* 11508 bytes, record size 12 */
{ 10, 0, 2, 0, 0, 10, 256, }, /* 0 */
{ 10, 0, 2, 0, 0, 10, 0, }, /* 1 */
{ 10, 0, 1, 0, 0, 10, 0, }, /* 2 */
@@ -288,832 +292,863 @@ const ucd_record PRIV(ucd_records)[] = { /* 11136 bytes, record size 12 */
{ 34, 5, 12, 0, -214, 34, 0, }, /* 99 */
{ 34, 5, 12, 0, 10727, 34, 0, }, /* 100 */
{ 34, 5, 12, 0, -218, 34, 0, }, /* 101 */
- { 34, 5, 12, 0, 42282, 34, 0, }, /* 102 */
- { 34, 5, 12, 0, -69, 34, 0, }, /* 103 */
- { 34, 5, 12, 0, -217, 34, 0, }, /* 104 */
- { 34, 5, 12, 0, -71, 34, 0, }, /* 105 */
- { 34, 5, 12, 0, -219, 34, 0, }, /* 106 */
- { 34, 5, 12, 0, 42261, 34, 0, }, /* 107 */
- { 34, 5, 12, 0, 42258, 34, 0, }, /* 108 */
- { 34, 6, 12, 0, 0, 34, 0, }, /* 109 */
- { 10, 6, 12, 0, 0, 10, 0, }, /* 110 */
- { 4, 24, 12, 0, 0, 4, 0, }, /* 111 */
- { 28, 12, 3, 0, 0, 28, 0, }, /* 112 */
- { 28, 12, 3, 0, 0, 20, 0, }, /* 113 */
- { 28, 12, 3, 21, 116, 20, 0, }, /* 114 */
- { 28, 12, 3, 0, 0, 34, 0, }, /* 115 */
- { 20, 9, 12, 0, 1, 20, 0, }, /* 116 */
- { 20, 5, 12, 0, -1, 20, 0, }, /* 117 */
- { 20, 24, 12, 0, 0, 20, 0, }, /* 118 */
- { 0, 2, 12, 0, 0, 0, 0, }, /* 119 */
- { 20, 6, 12, 0, 0, 20, 0, }, /* 120 */
- { 20, 5, 12, 0, 130, 20, 0, }, /* 121 */
- { 20, 9, 12, 0, 116, 20, 0, }, /* 122 */
- { 20, 9, 12, 0, 38, 20, 0, }, /* 123 */
- { 20, 9, 12, 0, 37, 20, 0, }, /* 124 */
- { 20, 9, 12, 0, 64, 20, 0, }, /* 125 */
- { 20, 9, 12, 0, 63, 20, 0, }, /* 126 */
- { 20, 5, 12, 0, 0, 20, 0, }, /* 127 */
- { 20, 9, 12, 0, 32, 20, 0, }, /* 128 */
- { 20, 9, 12, 34, 32, 20, 0, }, /* 129 */
- { 20, 9, 12, 59, 32, 20, 0, }, /* 130 */
- { 20, 9, 12, 38, 32, 20, 0, }, /* 131 */
- { 20, 9, 12, 21, 32, 20, 0, }, /* 132 */
- { 20, 9, 12, 51, 32, 20, 0, }, /* 133 */
- { 20, 9, 12, 26, 32, 20, 0, }, /* 134 */
- { 20, 9, 12, 47, 32, 20, 0, }, /* 135 */
- { 20, 9, 12, 55, 32, 20, 0, }, /* 136 */
- { 20, 9, 12, 30, 32, 20, 0, }, /* 137 */
- { 20, 9, 12, 43, 32, 20, 0, }, /* 138 */
- { 20, 9, 12, 96, 32, 20, 0, }, /* 139 */
- { 20, 5, 12, 0, -38, 20, 0, }, /* 140 */
- { 20, 5, 12, 0, -37, 20, 0, }, /* 141 */
- { 20, 5, 12, 0, -32, 20, 0, }, /* 142 */
- { 20, 5, 12, 34, -32, 20, 0, }, /* 143 */
- { 20, 5, 12, 59, -32, 20, 0, }, /* 144 */
- { 20, 5, 12, 38, -32, 20, 0, }, /* 145 */
- { 20, 5, 12, 21, -116, 20, 0, }, /* 146 */
- { 20, 5, 12, 51, -32, 20, 0, }, /* 147 */
- { 20, 5, 12, 26, -775, 20, 0, }, /* 148 */
- { 20, 5, 12, 47, -32, 20, 0, }, /* 149 */
- { 20, 5, 12, 55, -32, 20, 0, }, /* 150 */
- { 20, 5, 12, 30, 1, 20, 0, }, /* 151 */
- { 20, 5, 12, 30, -32, 20, 0, }, /* 152 */
- { 20, 5, 12, 43, -32, 20, 0, }, /* 153 */
- { 20, 5, 12, 96, -32, 20, 0, }, /* 154 */
- { 20, 5, 12, 0, -64, 20, 0, }, /* 155 */
- { 20, 5, 12, 0, -63, 20, 0, }, /* 156 */
- { 20, 9, 12, 0, 8, 20, 0, }, /* 157 */
- { 20, 5, 12, 34, -30, 20, 0, }, /* 158 */
- { 20, 5, 12, 38, -25, 20, 0, }, /* 159 */
- { 20, 9, 12, 0, 0, 20, 0, }, /* 160 */
- { 20, 5, 12, 43, -15, 20, 0, }, /* 161 */
- { 20, 5, 12, 47, -22, 20, 0, }, /* 162 */
- { 20, 5, 12, 0, -8, 20, 0, }, /* 163 */
- { 11, 9, 12, 0, 1, 11, 0, }, /* 164 */
- { 11, 5, 12, 0, -1, 11, 0, }, /* 165 */
- { 20, 5, 12, 51, -54, 20, 0, }, /* 166 */
- { 20, 5, 12, 55, -48, 20, 0, }, /* 167 */
- { 20, 5, 12, 0, 7, 20, 0, }, /* 168 */
- { 20, 5, 12, 0, -116, 20, 0, }, /* 169 */
- { 20, 9, 12, 38, -60, 20, 0, }, /* 170 */
- { 20, 5, 12, 59, -64, 20, 0, }, /* 171 */
- { 20, 25, 12, 0, 0, 20, 0, }, /* 172 */
- { 20, 9, 12, 0, -7, 20, 0, }, /* 173 */
- { 20, 9, 12, 0, -130, 20, 0, }, /* 174 */
- { 13, 9, 12, 0, 80, 13, 0, }, /* 175 */
- { 13, 9, 12, 0, 32, 13, 0, }, /* 176 */
- { 13, 9, 12, 63, 32, 13, 0, }, /* 177 */
- { 13, 9, 12, 67, 32, 13, 0, }, /* 178 */
- { 13, 9, 12, 71, 32, 13, 0, }, /* 179 */
- { 13, 9, 12, 75, 32, 13, 0, }, /* 180 */
- { 13, 9, 12, 79, 32, 13, 0, }, /* 181 */
- { 13, 9, 12, 84, 32, 13, 0, }, /* 182 */
- { 13, 5, 12, 0, -32, 13, 0, }, /* 183 */
- { 13, 5, 12, 63, -32, 13, 0, }, /* 184 */
- { 13, 5, 12, 67, -32, 13, 0, }, /* 185 */
- { 13, 5, 12, 71, -32, 13, 0, }, /* 186 */
- { 13, 5, 12, 75, -32, 13, 0, }, /* 187 */
- { 13, 5, 12, 79, -32, 13, 0, }, /* 188 */
- { 13, 5, 12, 84, -32, 13, 0, }, /* 189 */
- { 13, 5, 12, 0, -80, 13, 0, }, /* 190 */
- { 13, 9, 12, 0, 1, 13, 0, }, /* 191 */
- { 13, 5, 12, 0, -1, 13, 0, }, /* 192 */
- { 13, 9, 12, 88, 1, 13, 0, }, /* 193 */
- { 13, 5, 12, 88, -1, 13, 0, }, /* 194 */
- { 13, 26, 12, 0, 0, 13, 0, }, /* 195 */
- { 13, 12, 3, 0, 0, -34, 0, }, /* 196 */
- { 13, 12, 3, 0, 0, -28, 0, }, /* 197 */
- { 28, 12, 3, 0, 0, -31, 0, }, /* 198 */
- { 13, 11, 3, 0, 0, 13, 0, }, /* 199 */
- { 13, 9, 12, 0, 15, 13, 0, }, /* 200 */
- { 13, 5, 12, 0, -15, 13, 0, }, /* 201 */
- { 2, 9, 12, 0, 48, 2, 0, }, /* 202 */
- { 2, 6, 12, 0, 0, 2, 0, }, /* 203 */
- { 2, 21, 12, 0, 0, 2, 0, }, /* 204 */
- { 2, 5, 12, 0, 0, 2, 0, }, /* 205 */
- { 2, 5, 12, 0, -48, 2, 0, }, /* 206 */
- { 10, 21, 12, 0, 0, -13, 0, }, /* 207 */
- { 2, 17, 12, 0, 0, 2, 0, }, /* 208 */
- { 2, 26, 12, 0, 0, 2, 0, }, /* 209 */
- { 2, 23, 12, 0, 0, 2, 0, }, /* 210 */
- { 26, 12, 3, 0, 0, 26, 0, }, /* 211 */
- { 26, 17, 12, 0, 0, 26, 0, }, /* 212 */
- { 26, 21, 12, 0, 0, 26, 0, }, /* 213 */
- { 26, 7, 12, 0, 0, 26, 0, }, /* 214 */
- { 1, 1, 4, 0, 0, 1, 0, }, /* 215 */
- { 10, 1, 4, 0, 0, 10, 0, }, /* 216 */
- { 1, 25, 12, 0, 0, 1, 0, }, /* 217 */
- { 1, 21, 12, 0, 0, 1, 0, }, /* 218 */
- { 1, 23, 12, 0, 0, 1, 0, }, /* 219 */
- { 10, 21, 12, 0, 0, -96, 0, }, /* 220 */
- { 1, 26, 12, 0, 0, 1, 0, }, /* 221 */
- { 1, 12, 3, 0, 0, 1, 0, }, /* 222 */
- { 1, 1, 2, 0, 0, -64, 0, }, /* 223 */
- { 1, 7, 12, 0, 0, 1, 0, }, /* 224 */
- { 10, 6, 12, 0, 0, -136, 0, }, /* 225 */
- { 28, 12, 3, 0, 0, -7, 0, }, /* 226 */
- { 1, 13, 12, 0, 0, -10, 0, }, /* 227 */
- { 1, 21, 12, 0, 0, -4, 0, }, /* 228 */
- { 1, 6, 12, 0, 0, 1, 0, }, /* 229 */
- { 1, 13, 12, 0, 0, 1, 0, }, /* 230 */
- { 50, 21, 12, 0, 0, 50, 0, }, /* 231 */
- { 50, 1, 4, 0, 0, 50, 0, }, /* 232 */
- { 50, 7, 12, 0, 0, 50, 0, }, /* 233 */
- { 50, 12, 3, 0, 0, 50, 0, }, /* 234 */
- { 56, 7, 12, 0, 0, 56, 0, }, /* 235 */
- { 56, 12, 3, 0, 0, 56, 0, }, /* 236 */
- { 64, 13, 12, 0, 0, 64, 0, }, /* 237 */
- { 64, 7, 12, 0, 0, 64, 0, }, /* 238 */
- { 64, 12, 3, 0, 0, 64, 0, }, /* 239 */
- { 64, 6, 12, 0, 0, 64, 0, }, /* 240 */
- { 64, 26, 12, 0, 0, 64, 0, }, /* 241 */
- { 64, 21, 12, 0, 0, 64, 0, }, /* 242 */
- { 64, 23, 12, 0, 0, 64, 0, }, /* 243 */
- { 90, 7, 12, 0, 0, 90, 0, }, /* 244 */
- { 90, 12, 3, 0, 0, 90, 0, }, /* 245 */
- { 90, 6, 12, 0, 0, 90, 0, }, /* 246 */
- { 90, 21, 12, 0, 0, 90, 0, }, /* 247 */
- { 95, 7, 12, 0, 0, 95, 0, }, /* 248 */
- { 95, 12, 3, 0, 0, 95, 0, }, /* 249 */
- { 95, 21, 12, 0, 0, 95, 0, }, /* 250 */
- { 15, 12, 3, 0, 0, 15, 0, }, /* 251 */
- { 15, 10, 5, 0, 0, 15, 0, }, /* 252 */
- { 15, 7, 12, 0, 0, 15, 0, }, /* 253 */
- { 28, 12, 3, 0, 0, -183, 0, }, /* 254 */
- { 28, 12, 3, 0, 0, -157, 0, }, /* 255 */
- { 10, 21, 12, 0, 0, -211, 0, }, /* 256 */
- { 10, 21, 12, 0, 0, -230, 0, }, /* 257 */
- { 15, 13, 12, 0, 0, -111, 0, }, /* 258 */
- { 15, 21, 12, 0, 0, 15, 0, }, /* 259 */
- { 15, 6, 12, 0, 0, 15, 0, }, /* 260 */
- { 3, 7, 12, 0, 0, 3, 0, }, /* 261 */
- { 3, 12, 3, 0, 0, 3, 0, }, /* 262 */
- { 3, 10, 5, 0, 0, 3, 0, }, /* 263 */
- { 3, 10, 3, 0, 0, 3, 0, }, /* 264 */
- { 3, 13, 12, 0, 0, -68, 0, }, /* 265 */
- { 3, 23, 12, 0, 0, 3, 0, }, /* 266 */
- { 3, 15, 12, 0, 0, 3, 0, }, /* 267 */
- { 3, 26, 12, 0, 0, 3, 0, }, /* 268 */
- { 3, 21, 12, 0, 0, 3, 0, }, /* 269 */
- { 22, 12, 3, 0, 0, 22, 0, }, /* 270 */
- { 22, 10, 5, 0, 0, 22, 0, }, /* 271 */
- { 22, 7, 12, 0, 0, 22, 0, }, /* 272 */
- { 22, 13, 12, 0, 0, -55, 0, }, /* 273 */
- { 22, 21, 12, 0, 0, 22, 0, }, /* 274 */
- { 21, 12, 3, 0, 0, 21, 0, }, /* 275 */
- { 21, 10, 5, 0, 0, 21, 0, }, /* 276 */
- { 21, 7, 12, 0, 0, 21, 0, }, /* 277 */
- { 21, 13, 12, 0, 0, -52, 0, }, /* 278 */
- { 21, 21, 12, 0, 0, 21, 0, }, /* 279 */
- { 21, 23, 12, 0, 0, 21, 0, }, /* 280 */
- { 44, 12, 3, 0, 0, 44, 0, }, /* 281 */
- { 44, 10, 5, 0, 0, 44, 0, }, /* 282 */
- { 44, 7, 12, 0, 0, 44, 0, }, /* 283 */
- { 44, 10, 3, 0, 0, 44, 0, }, /* 284 */
- { 44, 13, 12, 0, 0, 44, 0, }, /* 285 */
- { 44, 26, 12, 0, 0, 44, 0, }, /* 286 */
- { 44, 15, 12, 0, 0, 44, 0, }, /* 287 */
- { 54, 12, 3, 0, 0, 54, 0, }, /* 288 */
- { 54, 7, 12, 0, 0, 54, 0, }, /* 289 */
- { 54, 10, 3, 0, 0, 54, 0, }, /* 290 */
- { 54, 10, 5, 0, 0, 54, 0, }, /* 291 */
- { 54, 13, 12, 0, 0, -49, 0, }, /* 292 */
- { 54, 15, 12, 0, 0, -49, 0, }, /* 293 */
- { 54, 26, 12, 0, 0, -49, 0, }, /* 294 */
- { 54, 26, 12, 0, 0, 54, 0, }, /* 295 */
- { 54, 23, 12, 0, 0, 54, 0, }, /* 296 */
- { 55, 12, 3, 0, 0, 55, 0, }, /* 297 */
- { 55, 10, 5, 0, 0, 55, 0, }, /* 298 */
- { 55, 7, 12, 0, 0, 55, 0, }, /* 299 */
- { 55, 13, 12, 0, 0, 55, 0, }, /* 300 */
- { 55, 15, 12, 0, 0, 55, 0, }, /* 301 */
- { 55, 26, 12, 0, 0, 55, 0, }, /* 302 */
- { 29, 7, 12, 0, 0, 29, 0, }, /* 303 */
- { 29, 12, 3, 0, 0, 29, 0, }, /* 304 */
- { 29, 10, 5, 0, 0, 29, 0, }, /* 305 */
- { 29, 21, 12, 0, 0, 29, 0, }, /* 306 */
- { 29, 10, 3, 0, 0, 29, 0, }, /* 307 */
- { 29, 13, 12, 0, 0, 29, 0, }, /* 308 */
- { 37, 12, 3, 0, 0, 37, 0, }, /* 309 */
- { 37, 10, 5, 0, 0, 37, 0, }, /* 310 */
- { 37, 7, 12, 0, 0, 37, 0, }, /* 311 */
- { 37, 10, 3, 0, 0, 37, 0, }, /* 312 */
- { 37, 7, 4, 0, 0, 37, 0, }, /* 313 */
- { 37, 26, 12, 0, 0, 37, 0, }, /* 314 */
- { 37, 15, 12, 0, 0, 37, 0, }, /* 315 */
- { 37, 13, 12, 0, 0, 37, 0, }, /* 316 */
- { 48, 10, 5, 0, 0, 48, 0, }, /* 317 */
- { 48, 7, 12, 0, 0, 48, 0, }, /* 318 */
- { 48, 12, 3, 0, 0, 48, 0, }, /* 319 */
- { 48, 10, 3, 0, 0, 48, 0, }, /* 320 */
- { 48, 13, 12, 0, 0, 48, 0, }, /* 321 */
- { 48, 21, 12, 0, 0, 48, 0, }, /* 322 */
- { 57, 7, 12, 0, 0, 57, 0, }, /* 323 */
- { 57, 12, 3, 0, 0, 57, 0, }, /* 324 */
- { 57, 7, 5, 0, 0, 57, 0, }, /* 325 */
- { 57, 6, 12, 0, 0, 57, 0, }, /* 326 */
- { 57, 21, 12, 0, 0, 57, 0, }, /* 327 */
- { 57, 13, 12, 0, 0, 57, 0, }, /* 328 */
- { 33, 7, 12, 0, 0, 33, 0, }, /* 329 */
- { 33, 12, 3, 0, 0, 33, 0, }, /* 330 */
- { 33, 7, 5, 0, 0, 33, 0, }, /* 331 */
- { 33, 6, 12, 0, 0, 33, 0, }, /* 332 */
- { 33, 13, 12, 0, 0, 33, 0, }, /* 333 */
- { 58, 7, 12, 0, 0, 58, 0, }, /* 334 */
- { 58, 26, 12, 0, 0, 58, 0, }, /* 335 */
- { 58, 21, 12, 0, 0, 58, 0, }, /* 336 */
- { 58, 12, 3, 0, 0, 58, 0, }, /* 337 */
- { 58, 13, 12, 0, 0, 58, 0, }, /* 338 */
- { 58, 15, 12, 0, 0, 58, 0, }, /* 339 */
- { 58, 22, 12, 0, 0, 58, 0, }, /* 340 */
- { 58, 18, 12, 0, 0, 58, 0, }, /* 341 */
- { 58, 10, 5, 0, 0, 58, 0, }, /* 342 */
- { 39, 7, 12, 0, 0, 39, 0, }, /* 343 */
- { 39, 10, 12, 0, 0, 39, 0, }, /* 344 */
- { 39, 12, 3, 0, 0, 39, 0, }, /* 345 */
- { 39, 10, 5, 0, 0, 39, 0, }, /* 346 */
- { 39, 13, 12, 0, 0, -72, 0, }, /* 347 */
- { 39, 21, 12, 0, 0, 39, 0, }, /* 348 */
- { 39, 13, 12, 0, 0, 39, 0, }, /* 349 */
- { 39, 26, 12, 0, 0, 39, 0, }, /* 350 */
- { 17, 9, 12, 0, 7264, 17, 0, }, /* 351 */
- { 17, 5, 12, 0, 3008, 17, 0, }, /* 352 */
- { 10, 21, 12, 0, 0, -46, 0, }, /* 353 */
- { 17, 6, 12, 0, 0, 17, 0, }, /* 354 */
- { 24, 7, 6, 0, 0, 24, 0, }, /* 355 */
- { 24, 7, 7, 0, 0, 24, 0, }, /* 356 */
- { 24, 7, 8, 0, 0, 24, 0, }, /* 357 */
- { 16, 7, 12, 0, 0, 16, 0, }, /* 358 */
- { 16, 12, 3, 0, 0, 16, 0, }, /* 359 */
- { 16, 21, 12, 0, 0, 16, 0, }, /* 360 */
- { 16, 15, 12, 0, 0, 16, 0, }, /* 361 */
- { 16, 26, 12, 0, 0, 16, 0, }, /* 362 */
- { 9, 9, 12, 0, 38864, 9, 0, }, /* 363 */
- { 9, 9, 12, 0, 8, 9, 0, }, /* 364 */
- { 9, 5, 12, 0, -8, 9, 0, }, /* 365 */
- { 8, 17, 12, 0, 0, 8, 0, }, /* 366 */
- { 8, 7, 12, 0, 0, 8, 0, }, /* 367 */
- { 8, 21, 12, 0, 0, 8, 0, }, /* 368 */
- { 41, 29, 12, 0, 0, 41, 0, }, /* 369 */
- { 41, 7, 12, 0, 0, 41, 0, }, /* 370 */
- { 41, 22, 12, 0, 0, 41, 0, }, /* 371 */
- { 41, 18, 12, 0, 0, 41, 0, }, /* 372 */
- { 46, 7, 12, 0, 0, 46, 0, }, /* 373 */
- { 46, 14, 12, 0, 0, 46, 0, }, /* 374 */
- { 51, 7, 12, 0, 0, 51, 0, }, /* 375 */
- { 51, 12, 3, 0, 0, 51, 0, }, /* 376 */
- { 25, 7, 12, 0, 0, 25, 0, }, /* 377 */
- { 25, 12, 3, 0, 0, 25, 0, }, /* 378 */
- { 10, 21, 12, 0, 0, -106, 0, }, /* 379 */
- { 7, 7, 12, 0, 0, 7, 0, }, /* 380 */
- { 7, 12, 3, 0, 0, 7, 0, }, /* 381 */
- { 52, 7, 12, 0, 0, 52, 0, }, /* 382 */
- { 52, 12, 3, 0, 0, 52, 0, }, /* 383 */
- { 32, 7, 12, 0, 0, 32, 0, }, /* 384 */
- { 32, 12, 3, 0, 0, 32, 0, }, /* 385 */
- { 32, 10, 5, 0, 0, 32, 0, }, /* 386 */
- { 32, 21, 12, 0, 0, 32, 0, }, /* 387 */
- { 32, 6, 12, 0, 0, 32, 0, }, /* 388 */
- { 32, 23, 12, 0, 0, 32, 0, }, /* 389 */
- { 32, 13, 12, 0, 0, 32, 0, }, /* 390 */
- { 32, 15, 12, 0, 0, 32, 0, }, /* 391 */
- { 38, 21, 12, 0, 0, 38, 0, }, /* 392 */
- { 10, 21, 12, 0, 0, -61, 0, }, /* 393 */
- { 38, 17, 12, 0, 0, 38, 0, }, /* 394 */
- { 38, 12, 3, 0, 0, 38, 0, }, /* 395 */
- { 38, 1, 2, 0, 0, 38, 0, }, /* 396 */
- { 38, 13, 12, 0, 0, 38, 0, }, /* 397 */
- { 38, 7, 12, 0, 0, 38, 0, }, /* 398 */
- { 38, 6, 12, 0, 0, 38, 0, }, /* 399 */
- { 35, 7, 12, 0, 0, 35, 0, }, /* 400 */
- { 35, 12, 3, 0, 0, 35, 0, }, /* 401 */
- { 35, 10, 5, 0, 0, 35, 0, }, /* 402 */
- { 35, 26, 12, 0, 0, 35, 0, }, /* 403 */
- { 35, 21, 12, 0, 0, 35, 0, }, /* 404 */
- { 35, 13, 12, 0, 0, 35, 0, }, /* 405 */
- { 53, 7, 12, 0, 0, 53, 0, }, /* 406 */
- { 40, 7, 12, 0, 0, 40, 0, }, /* 407 */
- { 40, 13, 12, 0, 0, 40, 0, }, /* 408 */
- { 40, 15, 12, 0, 0, 40, 0, }, /* 409 */
- { 40, 26, 12, 0, 0, 40, 0, }, /* 410 */
- { 32, 26, 12, 0, 0, 32, 0, }, /* 411 */
- { 6, 7, 12, 0, 0, 6, 0, }, /* 412 */
- { 6, 12, 3, 0, 0, 6, 0, }, /* 413 */
- { 6, 10, 5, 0, 0, 6, 0, }, /* 414 */
- { 6, 21, 12, 0, 0, 6, 0, }, /* 415 */
- { 91, 7, 12, 0, 0, 91, 0, }, /* 416 */
- { 91, 10, 5, 0, 0, 91, 0, }, /* 417 */
- { 91, 12, 3, 0, 0, 91, 0, }, /* 418 */
- { 91, 10, 12, 0, 0, 91, 0, }, /* 419 */
- { 91, 13, 12, 0, 0, 91, 0, }, /* 420 */
- { 91, 21, 12, 0, 0, 91, 0, }, /* 421 */
- { 91, 6, 12, 0, 0, 91, 0, }, /* 422 */
- { 28, 11, 3, 0, 0, 28, 0, }, /* 423 */
- { 62, 12, 3, 0, 0, 62, 0, }, /* 424 */
- { 62, 10, 5, 0, 0, 62, 0, }, /* 425 */
- { 62, 7, 12, 0, 0, 62, 0, }, /* 426 */
- { 62, 13, 12, 0, 0, 62, 0, }, /* 427 */
- { 62, 21, 12, 0, 0, 62, 0, }, /* 428 */
- { 62, 26, 12, 0, 0, 62, 0, }, /* 429 */
- { 76, 12, 3, 0, 0, 76, 0, }, /* 430 */
- { 76, 10, 5, 0, 0, 76, 0, }, /* 431 */
- { 76, 7, 12, 0, 0, 76, 0, }, /* 432 */
- { 76, 13, 12, 0, 0, 76, 0, }, /* 433 */
- { 93, 7, 12, 0, 0, 93, 0, }, /* 434 */
- { 93, 12, 3, 0, 0, 93, 0, }, /* 435 */
- { 93, 10, 5, 0, 0, 93, 0, }, /* 436 */
- { 93, 21, 12, 0, 0, 93, 0, }, /* 437 */
- { 70, 7, 12, 0, 0, 70, 0, }, /* 438 */
- { 70, 10, 5, 0, 0, 70, 0, }, /* 439 */
- { 70, 12, 3, 0, 0, 70, 0, }, /* 440 */
- { 70, 21, 12, 0, 0, 70, 0, }, /* 441 */
- { 70, 13, 12, 0, 0, 70, 0, }, /* 442 */
- { 73, 13, 12, 0, 0, 73, 0, }, /* 443 */
- { 73, 7, 12, 0, 0, 73, 0, }, /* 444 */
- { 73, 6, 12, 0, 0, 73, 0, }, /* 445 */
- { 73, 21, 12, 0, 0, 73, 0, }, /* 446 */
- { 13, 5, 12, 63, -6222, 13, 0, }, /* 447 */
- { 13, 5, 12, 67, -6221, 13, 0, }, /* 448 */
- { 13, 5, 12, 71, -6212, 13, 0, }, /* 449 */
- { 13, 5, 12, 75, -6210, 13, 0, }, /* 450 */
- { 13, 5, 12, 79, -6210, 13, 0, }, /* 451 */
- { 13, 5, 12, 79, -6211, 13, 0, }, /* 452 */
- { 13, 5, 12, 84, -6204, 13, 0, }, /* 453 */
- { 13, 5, 12, 88, -6180, 13, 0, }, /* 454 */
- { 13, 5, 12, 108, 35267, 13, 0, }, /* 455 */
- { 17, 9, 12, 0, -3008, 17, 0, }, /* 456 */
- { 76, 21, 12, 0, 0, 76, 0, }, /* 457 */
- { 28, 12, 3, 0, 0, -101, 0, }, /* 458 */
- { 28, 12, 3, 0, 0, 15, 0, }, /* 459 */
- { 10, 21, 12, 0, 0, -37, 0, }, /* 460 */
- { 28, 12, 3, 0, 0, -16, 0, }, /* 461 */
- { 28, 12, 3, 0, 0, -40, 0, }, /* 462 */
- { 28, 12, 3, 0, 0, -129, 0, }, /* 463 */
- { 10, 10, 5, 0, 0, -16, 0, }, /* 464 */
- { 10, 7, 12, 0, 0, 15, 0, }, /* 465 */
- { 10, 7, 12, 0, 0, -16, 0, }, /* 466 */
- { 10, 10, 5, 0, 0, -37, 0, }, /* 467 */
- { 28, 12, 3, 0, 0, -80, 0, }, /* 468 */
- { 10, 10, 5, 0, 0, 3, 0, }, /* 469 */
- { 28, 12, 3, 0, 0, -37, 0, }, /* 470 */
- { 13, 5, 12, 0, 0, 13, 0, }, /* 471 */
- { 13, 6, 12, 0, 0, 13, 0, }, /* 472 */
- { 34, 5, 12, 0, 35332, 34, 0, }, /* 473 */
- { 34, 5, 12, 0, 3814, 34, 0, }, /* 474 */
- { 34, 9, 12, 92, 1, 34, 0, }, /* 475 */
- { 34, 5, 12, 92, -1, 34, 0, }, /* 476 */
- { 34, 5, 12, 92, -58, 34, 0, }, /* 477 */
- { 34, 9, 12, 0, -7615, 34, 0, }, /* 478 */
- { 20, 5, 12, 0, 8, 20, 0, }, /* 479 */
- { 20, 9, 12, 0, -8, 20, 0, }, /* 480 */
- { 20, 5, 12, 0, 74, 20, 0, }, /* 481 */
- { 20, 5, 12, 0, 86, 20, 0, }, /* 482 */
- { 20, 5, 12, 0, 100, 20, 0, }, /* 483 */
- { 20, 5, 12, 0, 128, 20, 0, }, /* 484 */
- { 20, 5, 12, 0, 112, 20, 0, }, /* 485 */
- { 20, 5, 12, 0, 126, 20, 0, }, /* 486 */
- { 20, 8, 12, 0, -8, 20, 0, }, /* 487 */
- { 20, 5, 12, 0, 9, 20, 0, }, /* 488 */
- { 20, 9, 12, 0, -74, 20, 0, }, /* 489 */
- { 20, 8, 12, 0, -9, 20, 0, }, /* 490 */
- { 20, 5, 12, 21, -7173, 20, 0, }, /* 491 */
- { 20, 9, 12, 0, -86, 20, 0, }, /* 492 */
- { 20, 9, 12, 0, -100, 20, 0, }, /* 493 */
- { 20, 9, 12, 0, -112, 20, 0, }, /* 494 */
- { 20, 9, 12, 0, -128, 20, 0, }, /* 495 */
- { 20, 9, 12, 0, -126, 20, 0, }, /* 496 */
- { 28, 1, 3, 0, 0, 28, 0, }, /* 497 */
- { 28, 1, 13, 0, 0, 28, 0, }, /* 498 */
- { 10, 27, 2, 0, 0, 10, 0, }, /* 499 */
- { 10, 28, 2, 0, 0, 10, 0, }, /* 500 */
- { 10, 21, 14, 0, 0, 10, 0, }, /* 501 */
- { 0, 2, 2, 0, 0, 0, 0, }, /* 502 */
- { 28, 12, 3, 0, 0, -84, 0, }, /* 503 */
- { 10, 9, 12, 0, 0, 10, 0, }, /* 504 */
- { 10, 5, 12, 0, 0, 10, 0, }, /* 505 */
- { 20, 9, 12, 96, -7517, 20, 0, }, /* 506 */
- { 34, 9, 12, 100, -8383, 34, 0, }, /* 507 */
- { 34, 9, 12, 104, -8262, 34, 0, }, /* 508 */
- { 34, 9, 12, 0, 28, 34, 0, }, /* 509 */
- { 10, 7, 12, 0, 0, 10, 0, }, /* 510 */
- { 10, 5, 14, 0, 0, 10, 0, }, /* 511 */
- { 34, 5, 12, 0, -28, 34, 0, }, /* 512 */
- { 34, 14, 12, 0, 16, 34, 0, }, /* 513 */
- { 34, 14, 12, 0, -16, 34, 0, }, /* 514 */
- { 34, 14, 12, 0, 0, 34, 0, }, /* 515 */
- { 10, 25, 14, 0, 0, 10, 0, }, /* 516 */
- { 10, 26, 12, 0, 26, 10, 0, }, /* 517 */
- { 10, 26, 14, 0, 26, 10, 0, }, /* 518 */
- { 10, 26, 12, 0, -26, 10, 0, }, /* 519 */
- { 5, 26, 12, 0, 0, 5, 0, }, /* 520 */
- { 18, 9, 12, 0, 48, 18, 0, }, /* 521 */
- { 18, 5, 12, 0, -48, 18, 0, }, /* 522 */
- { 34, 9, 12, 0, -10743, 34, 0, }, /* 523 */
- { 34, 9, 12, 0, -3814, 34, 0, }, /* 524 */
- { 34, 9, 12, 0, -10727, 34, 0, }, /* 525 */
- { 34, 5, 12, 0, -10795, 34, 0, }, /* 526 */
- { 34, 5, 12, 0, -10792, 34, 0, }, /* 527 */
- { 34, 9, 12, 0, -10780, 34, 0, }, /* 528 */
- { 34, 9, 12, 0, -10749, 34, 0, }, /* 529 */
- { 34, 9, 12, 0, -10783, 34, 0, }, /* 530 */
- { 34, 9, 12, 0, -10782, 34, 0, }, /* 531 */
- { 34, 9, 12, 0, -10815, 34, 0, }, /* 532 */
- { 11, 5, 12, 0, 0, 11, 0, }, /* 533 */
- { 11, 26, 12, 0, 0, 11, 0, }, /* 534 */
- { 11, 12, 3, 0, 0, 11, 0, }, /* 535 */
- { 11, 21, 12, 0, 0, 11, 0, }, /* 536 */
- { 11, 15, 12, 0, 0, 11, 0, }, /* 537 */
- { 17, 5, 12, 0, -7264, 17, 0, }, /* 538 */
- { 59, 7, 12, 0, 0, 59, 0, }, /* 539 */
- { 59, 6, 12, 0, 0, 59, 0, }, /* 540 */
- { 59, 21, 12, 0, 0, 59, 0, }, /* 541 */
- { 59, 12, 3, 0, 0, 59, 0, }, /* 542 */
- { 13, 12, 3, 0, 0, 13, 0, }, /* 543 */
- { 10, 21, 12, 0, 0, -28, 0, }, /* 544 */
- { 23, 26, 12, 0, 0, 23, 0, }, /* 545 */
- { 10, 21, 12, 0, 0, -122, 0, }, /* 546 */
- { 10, 21, 12, 0, 0, -116, 0, }, /* 547 */
- { 23, 6, 12, 0, 0, 23, 0, }, /* 548 */
- { 10, 7, 12, 0, 0, 23, 0, }, /* 549 */
- { 23, 14, 12, 0, 0, 23, 0, }, /* 550 */
- { 10, 22, 12, 0, 0, -122, 0, }, /* 551 */
- { 10, 18, 12, 0, 0, -122, 0, }, /* 552 */
- { 10, 26, 12, 0, 0, -116, 0, }, /* 553 */
- { 10, 17, 12, 0, 0, -116, 0, }, /* 554 */
- { 10, 22, 12, 0, 0, -116, 0, }, /* 555 */
- { 10, 18, 12, 0, 0, -116, 0, }, /* 556 */
- { 28, 12, 3, 0, 0, -19, 0, }, /* 557 */
- { 24, 10, 3, 0, 0, 24, 0, }, /* 558 */
- { 10, 17, 14, 0, 0, -116, 0, }, /* 559 */
- { 10, 6, 12, 0, 0, -58, 0, }, /* 560 */
- { 10, 7, 12, 0, 0, -88, 0, }, /* 561 */
- { 10, 21, 14, 0, 0, -88, 0, }, /* 562 */
- { 10, 26, 12, 0, 0, 23, 0, }, /* 563 */
- { 27, 7, 12, 0, 0, 27, 0, }, /* 564 */
- { 28, 12, 3, 0, 0, -58, 0, }, /* 565 */
- { 10, 24, 12, 0, 0, -58, 0, }, /* 566 */
- { 27, 6, 12, 0, 0, 27, 0, }, /* 567 */
- { 10, 17, 12, 0, 0, -58, 0, }, /* 568 */
- { 30, 7, 12, 0, 0, 30, 0, }, /* 569 */
- { 30, 6, 12, 0, 0, 30, 0, }, /* 570 */
- { 4, 7, 12, 0, 0, 4, 0, }, /* 571 */
- { 24, 7, 12, 0, 0, 24, 0, }, /* 572 */
- { 10, 15, 12, 0, 0, 23, 0, }, /* 573 */
- { 24, 26, 12, 0, 0, 24, 0, }, /* 574 */
- { 10, 26, 14, 0, 0, 23, 0, }, /* 575 */
- { 30, 26, 12, 0, 0, 30, 0, }, /* 576 */
- { 23, 7, 12, 0, 0, 23, 0, }, /* 577 */
- { 61, 7, 12, 0, 0, 61, 0, }, /* 578 */
- { 61, 6, 12, 0, 0, 61, 0, }, /* 579 */
- { 61, 26, 12, 0, 0, 61, 0, }, /* 580 */
- { 86, 7, 12, 0, 0, 86, 0, }, /* 581 */
- { 86, 6, 12, 0, 0, 86, 0, }, /* 582 */
- { 86, 21, 12, 0, 0, 86, 0, }, /* 583 */
- { 77, 7, 12, 0, 0, 77, 0, }, /* 584 */
- { 77, 6, 12, 0, 0, 77, 0, }, /* 585 */
- { 77, 21, 12, 0, 0, 77, 0, }, /* 586 */
- { 77, 13, 12, 0, 0, 77, 0, }, /* 587 */
- { 13, 9, 12, 108, 1, 13, 0, }, /* 588 */
- { 13, 5, 12, 108, -35267, 13, 0, }, /* 589 */
- { 13, 7, 12, 0, 0, 13, 0, }, /* 590 */
- { 13, 21, 12, 0, 0, 13, 0, }, /* 591 */
- { 79, 7, 12, 0, 0, 79, 0, }, /* 592 */
- { 79, 14, 12, 0, 0, 79, 0, }, /* 593 */
- { 79, 12, 3, 0, 0, 79, 0, }, /* 594 */
- { 79, 21, 12, 0, 0, 79, 0, }, /* 595 */
- { 34, 9, 12, 0, -35332, 34, 0, }, /* 596 */
- { 34, 9, 12, 0, -42280, 34, 0, }, /* 597 */
- { 34, 9, 12, 0, -42308, 34, 0, }, /* 598 */
- { 34, 9, 12, 0, -42319, 34, 0, }, /* 599 */
- { 34, 9, 12, 0, -42315, 34, 0, }, /* 600 */
- { 34, 9, 12, 0, -42305, 34, 0, }, /* 601 */
- { 34, 9, 12, 0, -42258, 34, 0, }, /* 602 */
- { 34, 9, 12, 0, -42282, 34, 0, }, /* 603 */
- { 34, 9, 12, 0, -42261, 34, 0, }, /* 604 */
- { 34, 9, 12, 0, 928, 34, 0, }, /* 605 */
- { 49, 7, 12, 0, 0, 49, 0, }, /* 606 */
- { 49, 12, 3, 0, 0, 49, 0, }, /* 607 */
- { 49, 10, 5, 0, 0, 49, 0, }, /* 608 */
- { 49, 26, 12, 0, 0, 49, 0, }, /* 609 */
- { 10, 15, 12, 0, 0, -197, 0, }, /* 610 */
- { 10, 15, 12, 0, 0, -170, 0, }, /* 611 */
- { 10, 26, 12, 0, 0, -145, 0, }, /* 612 */
- { 10, 23, 12, 0, 0, -145, 0, }, /* 613 */
- { 65, 7, 12, 0, 0, 65, 0, }, /* 614 */
- { 65, 21, 12, 0, 0, 65, 0, }, /* 615 */
- { 75, 10, 5, 0, 0, 75, 0, }, /* 616 */
- { 75, 7, 12, 0, 0, 75, 0, }, /* 617 */
- { 75, 12, 3, 0, 0, 75, 0, }, /* 618 */
- { 75, 21, 12, 0, 0, 75, 0, }, /* 619 */
- { 75, 13, 12, 0, 0, 75, 0, }, /* 620 */
- { 15, 12, 3, 0, 0, -16, 0, }, /* 621 */
- { 15, 7, 12, 0, 0, -43, 0, }, /* 622 */
- { 69, 13, 12, 0, 0, 69, 0, }, /* 623 */
- { 69, 7, 12, 0, 0, 69, 0, }, /* 624 */
- { 69, 12, 3, 0, 0, 69, 0, }, /* 625 */
- { 10, 21, 12, 0, 0, -92, 0, }, /* 626 */
- { 69, 21, 12, 0, 0, 69, 0, }, /* 627 */
- { 74, 7, 12, 0, 0, 74, 0, }, /* 628 */
- { 74, 12, 3, 0, 0, 74, 0, }, /* 629 */
- { 74, 10, 5, 0, 0, 74, 0, }, /* 630 */
- { 74, 21, 12, 0, 0, 74, 0, }, /* 631 */
- { 84, 12, 3, 0, 0, 84, 0, }, /* 632 */
- { 84, 10, 5, 0, 0, 84, 0, }, /* 633 */
- { 84, 7, 12, 0, 0, 84, 0, }, /* 634 */
- { 84, 21, 12, 0, 0, 84, 0, }, /* 635 */
- { 10, 6, 12, 0, 0, -22, 0, }, /* 636 */
- { 84, 13, 12, 0, 0, 84, 0, }, /* 637 */
- { 39, 6, 12, 0, 0, 39, 0, }, /* 638 */
- { 68, 7, 12, 0, 0, 68, 0, }, /* 639 */
- { 68, 12, 3, 0, 0, 68, 0, }, /* 640 */
- { 68, 10, 5, 0, 0, 68, 0, }, /* 641 */
- { 68, 13, 12, 0, 0, 68, 0, }, /* 642 */
- { 68, 21, 12, 0, 0, 68, 0, }, /* 643 */
- { 92, 7, 12, 0, 0, 92, 0, }, /* 644 */
- { 92, 12, 3, 0, 0, 92, 0, }, /* 645 */
- { 92, 6, 12, 0, 0, 92, 0, }, /* 646 */
- { 92, 21, 12, 0, 0, 92, 0, }, /* 647 */
- { 87, 7, 12, 0, 0, 87, 0, }, /* 648 */
- { 87, 10, 5, 0, 0, 87, 0, }, /* 649 */
- { 87, 12, 3, 0, 0, 87, 0, }, /* 650 */
- { 87, 21, 12, 0, 0, 87, 0, }, /* 651 */
- { 87, 6, 12, 0, 0, 87, 0, }, /* 652 */
- { 34, 5, 12, 0, -928, 34, 0, }, /* 653 */
- { 9, 5, 12, 0, -38864, 9, 0, }, /* 654 */
- { 87, 13, 12, 0, 0, 87, 0, }, /* 655 */
- { 24, 7, 9, 0, 0, 24, 0, }, /* 656 */
- { 24, 7, 10, 0, 0, 24, 0, }, /* 657 */
- { 0, 4, 2, 0, 0, 0, 0, }, /* 658 */
- { 0, 3, 12, 0, 0, 0, 0, }, /* 659 */
- { 26, 25, 12, 0, 0, 26, 0, }, /* 660 */
- { 1, 24, 12, 0, 0, 1, 0, }, /* 661 */
- { 1, 7, 12, 0, 0, -10, 0, }, /* 662 */
- { 1, 26, 12, 0, 0, -10, 0, }, /* 663 */
- { 10, 6, 3, 0, 0, -58, 0, }, /* 664 */
- { 36, 7, 12, 0, 0, 36, 0, }, /* 665 */
- { 10, 21, 12, 0, 0, -25, 0, }, /* 666 */
- { 10, 15, 12, 0, 0, -76, 0, }, /* 667 */
- { 10, 26, 12, 0, 0, -25, 0, }, /* 668 */
- { 20, 14, 12, 0, 0, 20, 0, }, /* 669 */
- { 20, 15, 12, 0, 0, 20, 0, }, /* 670 */
- { 20, 26, 12, 0, 0, 20, 0, }, /* 671 */
- { 71, 7, 12, 0, 0, 71, 0, }, /* 672 */
- { 67, 7, 12, 0, 0, 67, 0, }, /* 673 */
- { 28, 12, 3, 0, 0, -1, 0, }, /* 674 */
- { 10, 15, 12, 0, 0, -1, 0, }, /* 675 */
- { 42, 7, 12, 0, 0, 42, 0, }, /* 676 */
- { 42, 15, 12, 0, 0, 42, 0, }, /* 677 */
- { 19, 7, 12, 0, 0, 19, 0, }, /* 678 */
- { 19, 14, 12, 0, 0, 19, 0, }, /* 679 */
- { 118, 7, 12, 0, 0, 118, 0, }, /* 680 */
- { 118, 12, 3, 0, 0, 118, 0, }, /* 681 */
- { 60, 7, 12, 0, 0, 60, 0, }, /* 682 */
- { 60, 21, 12, 0, 0, 60, 0, }, /* 683 */
- { 43, 7, 12, 0, 0, 43, 0, }, /* 684 */
- { 43, 21, 12, 0, 0, 43, 0, }, /* 685 */
- { 43, 14, 12, 0, 0, 43, 0, }, /* 686 */
- { 14, 9, 12, 0, 40, 14, 0, }, /* 687 */
- { 14, 5, 12, 0, -40, 14, 0, }, /* 688 */
- { 47, 7, 12, 0, 0, 47, 0, }, /* 689 */
- { 45, 7, 12, 0, 0, 45, 0, }, /* 690 */
- { 45, 13, 12, 0, 0, 45, 0, }, /* 691 */
- { 136, 9, 12, 0, 40, 136, 0, }, /* 692 */
- { 136, 5, 12, 0, -40, 136, 0, }, /* 693 */
- { 106, 7, 12, 0, 0, 106, 0, }, /* 694 */
- { 104, 7, 12, 0, 0, 104, 0, }, /* 695 */
- { 104, 21, 12, 0, 0, 104, 0, }, /* 696 */
- { 110, 7, 12, 0, 0, 110, 0, }, /* 697 */
- { 12, 7, 12, 0, 0, 12, 0, }, /* 698 */
- { 81, 7, 12, 0, 0, 81, 0, }, /* 699 */
- { 81, 21, 12, 0, 0, 81, 0, }, /* 700 */
- { 81, 15, 12, 0, 0, 81, 0, }, /* 701 */
- { 120, 7, 12, 0, 0, 120, 0, }, /* 702 */
- { 120, 26, 12, 0, 0, 120, 0, }, /* 703 */
- { 120, 15, 12, 0, 0, 120, 0, }, /* 704 */
- { 116, 7, 12, 0, 0, 116, 0, }, /* 705 */
- { 116, 15, 12, 0, 0, 116, 0, }, /* 706 */
- { 128, 7, 12, 0, 0, 128, 0, }, /* 707 */
- { 128, 15, 12, 0, 0, 128, 0, }, /* 708 */
- { 66, 7, 12, 0, 0, 66, 0, }, /* 709 */
- { 66, 15, 12, 0, 0, 66, 0, }, /* 710 */
- { 66, 21, 12, 0, 0, 66, 0, }, /* 711 */
- { 72, 7, 12, 0, 0, 72, 0, }, /* 712 */
- { 72, 21, 12, 0, 0, 72, 0, }, /* 713 */
- { 98, 7, 12, 0, 0, 98, 0, }, /* 714 */
- { 97, 7, 12, 0, 0, 97, 0, }, /* 715 */
- { 97, 15, 12, 0, 0, 97, 0, }, /* 716 */
- { 31, 7, 12, 0, 0, 31, 0, }, /* 717 */
- { 31, 12, 3, 0, 0, 31, 0, }, /* 718 */
- { 31, 15, 12, 0, 0, 31, 0, }, /* 719 */
- { 31, 21, 12, 0, 0, 31, 0, }, /* 720 */
- { 88, 7, 12, 0, 0, 88, 0, }, /* 721 */
- { 88, 15, 12, 0, 0, 88, 0, }, /* 722 */
- { 88, 21, 12, 0, 0, 88, 0, }, /* 723 */
- { 117, 7, 12, 0, 0, 117, 0, }, /* 724 */
- { 117, 15, 12, 0, 0, 117, 0, }, /* 725 */
- { 112, 7, 12, 0, 0, 112, 0, }, /* 726 */
- { 112, 26, 12, 0, 0, 112, 0, }, /* 727 */
- { 112, 12, 3, 0, 0, 112, 0, }, /* 728 */
- { 112, 15, 12, 0, 0, 112, 0, }, /* 729 */
- { 112, 21, 12, 0, 0, 112, 0, }, /* 730 */
- { 78, 7, 12, 0, 0, 78, 0, }, /* 731 */
- { 78, 21, 12, 0, 0, 78, 0, }, /* 732 */
- { 83, 7, 12, 0, 0, 83, 0, }, /* 733 */
- { 83, 15, 12, 0, 0, 83, 0, }, /* 734 */
- { 82, 7, 12, 0, 0, 82, 0, }, /* 735 */
- { 82, 15, 12, 0, 0, 82, 0, }, /* 736 */
- { 121, 7, 12, 0, 0, 121, 0, }, /* 737 */
- { 121, 21, 12, 0, 0, 121, 0, }, /* 738 */
- { 121, 15, 12, 0, 0, 121, 0, }, /* 739 */
- { 89, 7, 12, 0, 0, 89, 0, }, /* 740 */
- { 130, 9, 12, 0, 64, 130, 0, }, /* 741 */
- { 130, 5, 12, 0, -64, 130, 0, }, /* 742 */
- { 130, 15, 12, 0, 0, 130, 0, }, /* 743 */
- { 144, 7, 12, 0, 0, 144, 0, }, /* 744 */
- { 144, 12, 3, 0, 0, 144, 0, }, /* 745 */
- { 144, 13, 12, 0, 0, 144, 0, }, /* 746 */
- { 1, 15, 12, 0, 0, 1, 0, }, /* 747 */
- { 147, 7, 12, 0, 0, 147, 0, }, /* 748 */
- { 147, 15, 12, 0, 0, 147, 0, }, /* 749 */
- { 148, 7, 12, 0, 0, 148, 0, }, /* 750 */
- { 148, 12, 3, 0, 0, 148, 0, }, /* 751 */
- { 148, 15, 12, 0, 0, 148, 0, }, /* 752 */
- { 148, 21, 12, 0, 0, 148, 0, }, /* 753 */
- { 94, 10, 5, 0, 0, 94, 0, }, /* 754 */
- { 94, 12, 3, 0, 0, 94, 0, }, /* 755 */
- { 94, 7, 12, 0, 0, 94, 0, }, /* 756 */
- { 94, 21, 12, 0, 0, 94, 0, }, /* 757 */
- { 94, 15, 12, 0, 0, 94, 0, }, /* 758 */
- { 94, 13, 12, 0, 0, 94, 0, }, /* 759 */
- { 85, 12, 3, 0, 0, 85, 0, }, /* 760 */
- { 85, 10, 5, 0, 0, 85, 0, }, /* 761 */
- { 85, 7, 12, 0, 0, 85, 0, }, /* 762 */
- { 85, 21, 12, 0, 0, 85, 0, }, /* 763 */
- { 85, 1, 4, 0, 0, 85, 0, }, /* 764 */
- { 101, 7, 12, 0, 0, 101, 0, }, /* 765 */
- { 101, 13, 12, 0, 0, 101, 0, }, /* 766 */
- { 96, 12, 3, 0, 0, 96, 0, }, /* 767 */
- { 96, 7, 12, 0, 0, 96, 0, }, /* 768 */
- { 96, 10, 5, 0, 0, 96, 0, }, /* 769 */
- { 96, 13, 12, 0, 0, 96, 0, }, /* 770 */
- { 96, 21, 12, 0, 0, 96, 0, }, /* 771 */
- { 111, 7, 12, 0, 0, 111, 0, }, /* 772 */
- { 111, 12, 3, 0, 0, 111, 0, }, /* 773 */
- { 111, 21, 12, 0, 0, 111, 0, }, /* 774 */
- { 100, 12, 3, 0, 0, 100, 0, }, /* 775 */
- { 100, 10, 5, 0, 0, 100, 0, }, /* 776 */
- { 100, 7, 12, 0, 0, 100, 0, }, /* 777 */
- { 100, 7, 4, 0, 0, 100, 0, }, /* 778 */
- { 100, 21, 12, 0, 0, 100, 0, }, /* 779 */
- { 100, 13, 12, 0, 0, 100, 0, }, /* 780 */
- { 48, 15, 12, 0, 0, 48, 0, }, /* 781 */
- { 108, 7, 12, 0, 0, 108, 0, }, /* 782 */
- { 108, 10, 5, 0, 0, 108, 0, }, /* 783 */
- { 108, 12, 3, 0, 0, 108, 0, }, /* 784 */
- { 108, 21, 12, 0, 0, 108, 0, }, /* 785 */
- { 129, 7, 12, 0, 0, 129, 0, }, /* 786 */
- { 129, 21, 12, 0, 0, 129, 0, }, /* 787 */
- { 109, 7, 12, 0, 0, 109, 0, }, /* 788 */
- { 109, 12, 3, 0, 0, 109, 0, }, /* 789 */
- { 109, 10, 5, 0, 0, 109, 0, }, /* 790 */
- { 109, 13, 12, 0, 0, 109, 0, }, /* 791 */
- { 107, 12, 3, 0, 0, 107, 0, }, /* 792 */
- { 107, 12, 3, 0, 0, -49, 0, }, /* 793 */
- { 107, 10, 5, 0, 0, 107, 0, }, /* 794 */
- { 107, 10, 5, 0, 0, -49, 0, }, /* 795 */
- { 107, 7, 12, 0, 0, 107, 0, }, /* 796 */
- { 28, 12, 3, 0, 0, -49, 0, }, /* 797 */
- { 107, 10, 3, 0, 0, 107, 0, }, /* 798 */
- { 135, 7, 12, 0, 0, 135, 0, }, /* 799 */
- { 135, 10, 5, 0, 0, 135, 0, }, /* 800 */
- { 135, 12, 3, 0, 0, 135, 0, }, /* 801 */
- { 135, 21, 12, 0, 0, 135, 0, }, /* 802 */
- { 135, 13, 12, 0, 0, 135, 0, }, /* 803 */
- { 124, 7, 12, 0, 0, 124, 0, }, /* 804 */
- { 124, 10, 3, 0, 0, 124, 0, }, /* 805 */
- { 124, 10, 5, 0, 0, 124, 0, }, /* 806 */
- { 124, 12, 3, 0, 0, 124, 0, }, /* 807 */
- { 124, 21, 12, 0, 0, 124, 0, }, /* 808 */
- { 124, 13, 12, 0, 0, 124, 0, }, /* 809 */
- { 123, 7, 12, 0, 0, 123, 0, }, /* 810 */
- { 123, 10, 3, 0, 0, 123, 0, }, /* 811 */
- { 123, 10, 5, 0, 0, 123, 0, }, /* 812 */
- { 123, 12, 3, 0, 0, 123, 0, }, /* 813 */
- { 123, 21, 12, 0, 0, 123, 0, }, /* 814 */
- { 114, 7, 12, 0, 0, 114, 0, }, /* 815 */
- { 114, 10, 5, 0, 0, 114, 0, }, /* 816 */
- { 114, 12, 3, 0, 0, 114, 0, }, /* 817 */
- { 114, 21, 12, 0, 0, 114, 0, }, /* 818 */
- { 114, 13, 12, 0, 0, 114, 0, }, /* 819 */
- { 102, 7, 12, 0, 0, 102, 0, }, /* 820 */
- { 102, 12, 3, 0, 0, 102, 0, }, /* 821 */
- { 102, 10, 5, 0, 0, 102, 0, }, /* 822 */
- { 102, 13, 12, 0, 0, 102, 0, }, /* 823 */
- { 126, 7, 12, 0, 0, 126, 0, }, /* 824 */
- { 126, 12, 3, 0, 0, 126, 0, }, /* 825 */
- { 126, 10, 5, 0, 0, 126, 0, }, /* 826 */
- { 126, 13, 12, 0, 0, 126, 0, }, /* 827 */
- { 126, 15, 12, 0, 0, 126, 0, }, /* 828 */
- { 126, 21, 12, 0, 0, 126, 0, }, /* 829 */
- { 126, 26, 12, 0, 0, 126, 0, }, /* 830 */
- { 142, 7, 12, 0, 0, 142, 0, }, /* 831 */
- { 142, 10, 5, 0, 0, 142, 0, }, /* 832 */
- { 142, 12, 3, 0, 0, 142, 0, }, /* 833 */
- { 142, 21, 12, 0, 0, 142, 0, }, /* 834 */
- { 125, 9, 12, 0, 32, 125, 0, }, /* 835 */
- { 125, 5, 12, 0, -32, 125, 0, }, /* 836 */
- { 125, 13, 12, 0, 0, 125, 0, }, /* 837 */
- { 125, 15, 12, 0, 0, 125, 0, }, /* 838 */
- { 125, 7, 12, 0, 0, 125, 0, }, /* 839 */
- { 141, 7, 12, 0, 0, 141, 0, }, /* 840 */
- { 141, 12, 3, 0, 0, 141, 0, }, /* 841 */
- { 141, 10, 5, 0, 0, 141, 0, }, /* 842 */
- { 141, 7, 4, 0, 0, 141, 0, }, /* 843 */
- { 141, 21, 12, 0, 0, 141, 0, }, /* 844 */
- { 140, 7, 12, 0, 0, 140, 0, }, /* 845 */
- { 140, 12, 3, 0, 0, 140, 0, }, /* 846 */
- { 140, 10, 5, 0, 0, 140, 0, }, /* 847 */
- { 140, 7, 4, 0, 0, 140, 0, }, /* 848 */
- { 140, 21, 12, 0, 0, 140, 0, }, /* 849 */
- { 122, 7, 12, 0, 0, 122, 0, }, /* 850 */
- { 133, 7, 12, 0, 0, 133, 0, }, /* 851 */
- { 133, 10, 5, 0, 0, 133, 0, }, /* 852 */
- { 133, 12, 3, 0, 0, 133, 0, }, /* 853 */
- { 133, 21, 12, 0, 0, 133, 0, }, /* 854 */
- { 133, 13, 12, 0, 0, 133, 0, }, /* 855 */
- { 133, 15, 12, 0, 0, 133, 0, }, /* 856 */
- { 134, 21, 12, 0, 0, 134, 0, }, /* 857 */
- { 134, 7, 12, 0, 0, 134, 0, }, /* 858 */
- { 134, 12, 3, 0, 0, 134, 0, }, /* 859 */
- { 134, 10, 5, 0, 0, 134, 0, }, /* 860 */
- { 138, 7, 12, 0, 0, 138, 0, }, /* 861 */
- { 138, 12, 3, 0, 0, 138, 0, }, /* 862 */
- { 138, 7, 4, 0, 0, 138, 0, }, /* 863 */
- { 138, 13, 12, 0, 0, 138, 0, }, /* 864 */
- { 143, 7, 12, 0, 0, 143, 0, }, /* 865 */
- { 143, 10, 5, 0, 0, 143, 0, }, /* 866 */
- { 143, 12, 3, 0, 0, 143, 0, }, /* 867 */
- { 143, 13, 12, 0, 0, 143, 0, }, /* 868 */
- { 145, 7, 12, 0, 0, 145, 0, }, /* 869 */
- { 145, 12, 3, 0, 0, 145, 0, }, /* 870 */
- { 145, 10, 5, 0, 0, 145, 0, }, /* 871 */
- { 145, 21, 12, 0, 0, 145, 0, }, /* 872 */
- { 63, 7, 12, 0, 0, 63, 0, }, /* 873 */
- { 63, 14, 12, 0, 0, 63, 0, }, /* 874 */
- { 63, 21, 12, 0, 0, 63, 0, }, /* 875 */
- { 80, 7, 12, 0, 0, 80, 0, }, /* 876 */
- { 127, 7, 12, 0, 0, 127, 0, }, /* 877 */
- { 115, 7, 12, 0, 0, 115, 0, }, /* 878 */
- { 115, 13, 12, 0, 0, 115, 0, }, /* 879 */
- { 115, 21, 12, 0, 0, 115, 0, }, /* 880 */
- { 103, 7, 12, 0, 0, 103, 0, }, /* 881 */
- { 103, 12, 3, 0, 0, 103, 0, }, /* 882 */
- { 103, 21, 12, 0, 0, 103, 0, }, /* 883 */
- { 119, 7, 12, 0, 0, 119, 0, }, /* 884 */
- { 119, 12, 3, 0, 0, 119, 0, }, /* 885 */
- { 119, 21, 12, 0, 0, 119, 0, }, /* 886 */
- { 119, 26, 12, 0, 0, 119, 0, }, /* 887 */
- { 119, 6, 12, 0, 0, 119, 0, }, /* 888 */
- { 119, 13, 12, 0, 0, 119, 0, }, /* 889 */
- { 119, 15, 12, 0, 0, 119, 0, }, /* 890 */
- { 146, 9, 12, 0, 32, 146, 0, }, /* 891 */
- { 146, 5, 12, 0, -32, 146, 0, }, /* 892 */
- { 146, 15, 12, 0, 0, 146, 0, }, /* 893 */
- { 146, 21, 12, 0, 0, 146, 0, }, /* 894 */
- { 99, 7, 12, 0, 0, 99, 0, }, /* 895 */
- { 99, 10, 5, 0, 0, 99, 0, }, /* 896 */
- { 99, 12, 3, 0, 0, 99, 0, }, /* 897 */
- { 99, 6, 12, 0, 0, 99, 0, }, /* 898 */
- { 137, 6, 12, 0, 0, 137, 0, }, /* 899 */
- { 139, 6, 12, 0, 0, 139, 0, }, /* 900 */
- { 137, 7, 12, 0, 0, 137, 0, }, /* 901 */
- { 139, 7, 12, 0, 0, 139, 0, }, /* 902 */
- { 105, 7, 12, 0, 0, 105, 0, }, /* 903 */
- { 105, 26, 12, 0, 0, 105, 0, }, /* 904 */
- { 105, 12, 3, 0, 0, 105, 0, }, /* 905 */
- { 105, 21, 12, 0, 0, 105, 0, }, /* 906 */
- { 10, 1, 2, 0, 0, 105, 0, }, /* 907 */
- { 10, 10, 3, 0, 0, 10, 0, }, /* 908 */
- { 10, 10, 5, 0, 0, 10, 0, }, /* 909 */
- { 20, 12, 3, 0, 0, 20, 0, }, /* 910 */
- { 131, 26, 12, 0, 0, 131, 0, }, /* 911 */
- { 131, 12, 3, 0, 0, 131, 0, }, /* 912 */
- { 131, 21, 12, 0, 0, 131, 0, }, /* 913 */
- { 18, 12, 3, 0, 0, 18, 0, }, /* 914 */
- { 113, 7, 12, 0, 0, 113, 0, }, /* 915 */
- { 113, 15, 12, 0, 0, 113, 0, }, /* 916 */
- { 113, 12, 3, 0, 0, 113, 0, }, /* 917 */
- { 132, 9, 12, 0, 34, 132, 0, }, /* 918 */
- { 132, 5, 12, 0, -34, 132, 0, }, /* 919 */
- { 132, 12, 3, 0, 0, 132, 0, }, /* 920 */
- { 132, 13, 12, 0, 0, 132, 0, }, /* 921 */
- { 132, 21, 12, 0, 0, 132, 0, }, /* 922 */
- { 0, 2, 14, 0, 0, 0, 0, }, /* 923 */
- { 10, 26, 11, 0, 0, 10, 0, }, /* 924 */
- { 27, 26, 12, 0, 0, 27, 0, }, /* 925 */
- { 10, 24, 3, 0, 0, 10, 0, }, /* 926 */
- { 10, 1, 3, 0, 0, 10, 0, }, /* 927 */
+ { 34, 5, 12, 0, 42307, 34, 0, }, /* 102 */
+ { 34, 5, 12, 0, 42282, 34, 0, }, /* 103 */
+ { 34, 5, 12, 0, -69, 34, 0, }, /* 104 */
+ { 34, 5, 12, 0, -217, 34, 0, }, /* 105 */
+ { 34, 5, 12, 0, -71, 34, 0, }, /* 106 */
+ { 34, 5, 12, 0, -219, 34, 0, }, /* 107 */
+ { 34, 5, 12, 0, 42261, 34, 0, }, /* 108 */
+ { 34, 5, 12, 0, 42258, 34, 0, }, /* 109 */
+ { 34, 6, 12, 0, 0, 34, 0, }, /* 110 */
+ { 10, 6, 12, 0, 0, 10, 0, }, /* 111 */
+ { 4, 24, 12, 0, 0, 4, 0, }, /* 112 */
+ { 28, 12, 3, 0, 0, 28, 0, }, /* 113 */
+ { 28, 12, 3, 0, 0, 20, 0, }, /* 114 */
+ { 28, 12, 3, 21, 116, 20, 0, }, /* 115 */
+ { 28, 12, 3, 0, 0, 34, 0, }, /* 116 */
+ { 20, 9, 12, 0, 1, 20, 0, }, /* 117 */
+ { 20, 5, 12, 0, -1, 20, 0, }, /* 118 */
+ { 20, 24, 12, 0, 0, 20, 0, }, /* 119 */
+ { 0, 2, 12, 0, 0, 0, 0, }, /* 120 */
+ { 20, 6, 12, 0, 0, 20, 0, }, /* 121 */
+ { 20, 5, 12, 0, 130, 20, 0, }, /* 122 */
+ { 20, 9, 12, 0, 116, 20, 0, }, /* 123 */
+ { 20, 9, 12, 0, 38, 20, 0, }, /* 124 */
+ { 20, 9, 12, 0, 37, 20, 0, }, /* 125 */
+ { 20, 9, 12, 0, 64, 20, 0, }, /* 126 */
+ { 20, 9, 12, 0, 63, 20, 0, }, /* 127 */
+ { 20, 5, 12, 0, 0, 20, 0, }, /* 128 */
+ { 20, 9, 12, 0, 32, 20, 0, }, /* 129 */
+ { 20, 9, 12, 34, 32, 20, 0, }, /* 130 */
+ { 20, 9, 12, 59, 32, 20, 0, }, /* 131 */
+ { 20, 9, 12, 38, 32, 20, 0, }, /* 132 */
+ { 20, 9, 12, 21, 32, 20, 0, }, /* 133 */
+ { 20, 9, 12, 51, 32, 20, 0, }, /* 134 */
+ { 20, 9, 12, 26, 32, 20, 0, }, /* 135 */
+ { 20, 9, 12, 47, 32, 20, 0, }, /* 136 */
+ { 20, 9, 12, 55, 32, 20, 0, }, /* 137 */
+ { 20, 9, 12, 30, 32, 20, 0, }, /* 138 */
+ { 20, 9, 12, 43, 32, 20, 0, }, /* 139 */
+ { 20, 9, 12, 96, 32, 20, 0, }, /* 140 */
+ { 20, 5, 12, 0, -38, 20, 0, }, /* 141 */
+ { 20, 5, 12, 0, -37, 20, 0, }, /* 142 */
+ { 20, 5, 12, 0, -32, 20, 0, }, /* 143 */
+ { 20, 5, 12, 34, -32, 20, 0, }, /* 144 */
+ { 20, 5, 12, 59, -32, 20, 0, }, /* 145 */
+ { 20, 5, 12, 38, -32, 20, 0, }, /* 146 */
+ { 20, 5, 12, 21, -116, 20, 0, }, /* 147 */
+ { 20, 5, 12, 51, -32, 20, 0, }, /* 148 */
+ { 20, 5, 12, 26, -775, 20, 0, }, /* 149 */
+ { 20, 5, 12, 47, -32, 20, 0, }, /* 150 */
+ { 20, 5, 12, 55, -32, 20, 0, }, /* 151 */
+ { 20, 5, 12, 30, 1, 20, 0, }, /* 152 */
+ { 20, 5, 12, 30, -32, 20, 0, }, /* 153 */
+ { 20, 5, 12, 43, -32, 20, 0, }, /* 154 */
+ { 20, 5, 12, 96, -32, 20, 0, }, /* 155 */
+ { 20, 5, 12, 0, -64, 20, 0, }, /* 156 */
+ { 20, 5, 12, 0, -63, 20, 0, }, /* 157 */
+ { 20, 9, 12, 0, 8, 20, 0, }, /* 158 */
+ { 20, 5, 12, 34, -30, 20, 0, }, /* 159 */
+ { 20, 5, 12, 38, -25, 20, 0, }, /* 160 */
+ { 20, 9, 12, 0, 0, 20, 0, }, /* 161 */
+ { 20, 5, 12, 43, -15, 20, 0, }, /* 162 */
+ { 20, 5, 12, 47, -22, 20, 0, }, /* 163 */
+ { 20, 5, 12, 0, -8, 20, 0, }, /* 164 */
+ { 11, 9, 12, 0, 1, 11, 0, }, /* 165 */
+ { 11, 5, 12, 0, -1, 11, 0, }, /* 166 */
+ { 20, 5, 12, 51, -54, 20, 0, }, /* 167 */
+ { 20, 5, 12, 55, -48, 20, 0, }, /* 168 */
+ { 20, 5, 12, 0, 7, 20, 0, }, /* 169 */
+ { 20, 5, 12, 0, -116, 20, 0, }, /* 170 */
+ { 20, 9, 12, 38, -60, 20, 0, }, /* 171 */
+ { 20, 5, 12, 59, -64, 20, 0, }, /* 172 */
+ { 20, 25, 12, 0, 0, 20, 0, }, /* 173 */
+ { 20, 9, 12, 0, -7, 20, 0, }, /* 174 */
+ { 20, 9, 12, 0, -130, 20, 0, }, /* 175 */
+ { 13, 9, 12, 0, 80, 13, 0, }, /* 176 */
+ { 13, 9, 12, 0, 32, 13, 0, }, /* 177 */
+ { 13, 9, 12, 63, 32, 13, 0, }, /* 178 */
+ { 13, 9, 12, 67, 32, 13, 0, }, /* 179 */
+ { 13, 9, 12, 71, 32, 13, 0, }, /* 180 */
+ { 13, 9, 12, 75, 32, 13, 0, }, /* 181 */
+ { 13, 9, 12, 79, 32, 13, 0, }, /* 182 */
+ { 13, 9, 12, 84, 32, 13, 0, }, /* 183 */
+ { 13, 5, 12, 0, -32, 13, 0, }, /* 184 */
+ { 13, 5, 12, 63, -32, 13, 0, }, /* 185 */
+ { 13, 5, 12, 67, -32, 13, 0, }, /* 186 */
+ { 13, 5, 12, 71, -32, 13, 0, }, /* 187 */
+ { 13, 5, 12, 75, -32, 13, 0, }, /* 188 */
+ { 13, 5, 12, 79, -32, 13, 0, }, /* 189 */
+ { 13, 5, 12, 84, -32, 13, 0, }, /* 190 */
+ { 13, 5, 12, 0, -80, 13, 0, }, /* 191 */
+ { 13, 9, 12, 0, 1, 13, 0, }, /* 192 */
+ { 13, 5, 12, 0, -1, 13, 0, }, /* 193 */
+ { 13, 9, 12, 88, 1, 13, 0, }, /* 194 */
+ { 13, 5, 12, 88, -1, 13, 0, }, /* 195 */
+ { 13, 26, 12, 0, 0, 13, 0, }, /* 196 */
+ { 13, 12, 3, 0, 0, -34, 0, }, /* 197 */
+ { 13, 12, 3, 0, 0, -28, 0, }, /* 198 */
+ { 28, 12, 3, 0, 0, -31, 0, }, /* 199 */
+ { 13, 11, 3, 0, 0, 13, 0, }, /* 200 */
+ { 13, 9, 12, 0, 15, 13, 0, }, /* 201 */
+ { 13, 5, 12, 0, -15, 13, 0, }, /* 202 */
+ { 2, 9, 12, 0, 48, 2, 0, }, /* 203 */
+ { 2, 6, 12, 0, 0, 2, 0, }, /* 204 */
+ { 2, 21, 12, 0, 0, 2, 0, }, /* 205 */
+ { 2, 5, 12, 0, 0, 2, 0, }, /* 206 */
+ { 2, 5, 12, 0, -48, 2, 0, }, /* 207 */
+ { 10, 21, 12, 0, 0, -13, 0, }, /* 208 */
+ { 2, 17, 12, 0, 0, 2, 0, }, /* 209 */
+ { 2, 26, 12, 0, 0, 2, 0, }, /* 210 */
+ { 2, 23, 12, 0, 0, 2, 0, }, /* 211 */
+ { 26, 12, 3, 0, 0, 26, 0, }, /* 212 */
+ { 26, 17, 12, 0, 0, 26, 0, }, /* 213 */
+ { 26, 21, 12, 0, 0, 26, 0, }, /* 214 */
+ { 26, 7, 12, 0, 0, 26, 0, }, /* 215 */
+ { 1, 1, 4, 0, 0, 1, 0, }, /* 216 */
+ { 10, 1, 4, 0, 0, 10, 0, }, /* 217 */
+ { 1, 25, 12, 0, 0, 1, 0, }, /* 218 */
+ { 1, 21, 12, 0, 0, 1, 0, }, /* 219 */
+ { 1, 23, 12, 0, 0, 1, 0, }, /* 220 */
+ { 10, 21, 12, 0, 0, -105, 0, }, /* 221 */
+ { 1, 26, 12, 0, 0, 1, 0, }, /* 222 */
+ { 1, 12, 3, 0, 0, 1, 0, }, /* 223 */
+ { 1, 1, 2, 0, 0, -73, 0, }, /* 224 */
+ { 1, 7, 12, 0, 0, 1, 0, }, /* 225 */
+ { 10, 6, 12, 0, 0, -145, 0, }, /* 226 */
+ { 28, 12, 3, 0, 0, -7, 0, }, /* 227 */
+ { 1, 13, 12, 0, 0, -10, 0, }, /* 228 */
+ { 1, 21, 12, 0, 0, -4, 0, }, /* 229 */
+ { 1, 6, 12, 0, 0, 1, 0, }, /* 230 */
+ { 1, 13, 12, 0, 0, 1, 0, }, /* 231 */
+ { 50, 21, 12, 0, 0, 50, 0, }, /* 232 */
+ { 50, 1, 4, 0, 0, 50, 0, }, /* 233 */
+ { 50, 7, 12, 0, 0, 50, 0, }, /* 234 */
+ { 50, 12, 3, 0, 0, 50, 0, }, /* 235 */
+ { 56, 7, 12, 0, 0, 56, 0, }, /* 236 */
+ { 56, 12, 3, 0, 0, 56, 0, }, /* 237 */
+ { 64, 13, 12, 0, 0, 64, 0, }, /* 238 */
+ { 64, 7, 12, 0, 0, 64, 0, }, /* 239 */
+ { 64, 12, 3, 0, 0, 64, 0, }, /* 240 */
+ { 64, 6, 12, 0, 0, 64, 0, }, /* 241 */
+ { 64, 26, 12, 0, 0, 64, 0, }, /* 242 */
+ { 64, 21, 12, 0, 0, 64, 0, }, /* 243 */
+ { 64, 23, 12, 0, 0, 64, 0, }, /* 244 */
+ { 90, 7, 12, 0, 0, 90, 0, }, /* 245 */
+ { 90, 12, 3, 0, 0, 90, 0, }, /* 246 */
+ { 90, 6, 12, 0, 0, 90, 0, }, /* 247 */
+ { 90, 21, 12, 0, 0, 90, 0, }, /* 248 */
+ { 95, 7, 12, 0, 0, 95, 0, }, /* 249 */
+ { 95, 12, 3, 0, 0, 95, 0, }, /* 250 */
+ { 95, 21, 12, 0, 0, 95, 0, }, /* 251 */
+ { 15, 12, 3, 0, 0, 15, 0, }, /* 252 */
+ { 15, 10, 5, 0, 0, 15, 0, }, /* 253 */
+ { 15, 7, 12, 0, 0, 15, 0, }, /* 254 */
+ { 28, 12, 3, 0, 0, -188, 0, }, /* 255 */
+ { 28, 12, 3, 0, 0, -175, 0, }, /* 256 */
+ { 10, 21, 12, 0, 0, -231, 0, }, /* 257 */
+ { 10, 21, 12, 0, 0, -252, 0, }, /* 258 */
+ { 15, 13, 12, 0, 0, -120, 0, }, /* 259 */
+ { 15, 21, 12, 0, 0, 15, 0, }, /* 260 */
+ { 15, 6, 12, 0, 0, 15, 0, }, /* 261 */
+ { 3, 7, 12, 0, 0, 3, 0, }, /* 262 */
+ { 3, 12, 3, 0, 0, 3, 0, }, /* 263 */
+ { 3, 10, 5, 0, 0, 3, 0, }, /* 264 */
+ { 3, 10, 3, 0, 0, 3, 0, }, /* 265 */
+ { 3, 13, 12, 0, 0, -77, 0, }, /* 266 */
+ { 3, 23, 12, 0, 0, 3, 0, }, /* 267 */
+ { 3, 15, 12, 0, 0, 3, 0, }, /* 268 */
+ { 3, 26, 12, 0, 0, 3, 0, }, /* 269 */
+ { 3, 21, 12, 0, 0, 3, 0, }, /* 270 */
+ { 22, 12, 3, 0, 0, 22, 0, }, /* 271 */
+ { 22, 10, 5, 0, 0, 22, 0, }, /* 272 */
+ { 22, 7, 12, 0, 0, 22, 0, }, /* 273 */
+ { 22, 13, 12, 0, 0, -58, 0, }, /* 274 */
+ { 22, 21, 12, 0, 0, 22, 0, }, /* 275 */
+ { 21, 12, 3, 0, 0, 21, 0, }, /* 276 */
+ { 21, 10, 5, 0, 0, 21, 0, }, /* 277 */
+ { 21, 7, 12, 0, 0, 21, 0, }, /* 278 */
+ { 21, 13, 12, 0, 0, -55, 0, }, /* 279 */
+ { 21, 21, 12, 0, 0, 21, 0, }, /* 280 */
+ { 21, 23, 12, 0, 0, 21, 0, }, /* 281 */
+ { 44, 12, 3, 0, 0, 44, 0, }, /* 282 */
+ { 44, 10, 5, 0, 0, 44, 0, }, /* 283 */
+ { 44, 7, 12, 0, 0, 44, 0, }, /* 284 */
+ { 44, 10, 3, 0, 0, 44, 0, }, /* 285 */
+ { 44, 13, 12, 0, 0, 44, 0, }, /* 286 */
+ { 44, 26, 12, 0, 0, 44, 0, }, /* 287 */
+ { 44, 15, 12, 0, 0, 44, 0, }, /* 288 */
+ { 54, 12, 3, 0, 0, 54, 0, }, /* 289 */
+ { 54, 7, 12, 0, 0, 54, 0, }, /* 290 */
+ { 54, 10, 3, 0, 0, 54, 0, }, /* 291 */
+ { 54, 10, 5, 0, 0, 54, 0, }, /* 292 */
+ { 54, 13, 12, 0, 0, -52, 0, }, /* 293 */
+ { 54, 15, 12, 0, 0, -52, 0, }, /* 294 */
+ { 54, 26, 12, 0, 0, -52, 0, }, /* 295 */
+ { 54, 26, 12, 0, 0, 54, 0, }, /* 296 */
+ { 54, 23, 12, 0, 0, 54, 0, }, /* 297 */
+ { 55, 12, 3, 0, 0, 55, 0, }, /* 298 */
+ { 55, 10, 5, 0, 0, 55, 0, }, /* 299 */
+ { 55, 7, 12, 0, 0, 55, 0, }, /* 300 */
+ { 55, 13, 12, 0, 0, 55, 0, }, /* 301 */
+ { 55, 21, 12, 0, 0, 55, 0, }, /* 302 */
+ { 55, 15, 12, 0, 0, 55, 0, }, /* 303 */
+ { 55, 26, 12, 0, 0, 55, 0, }, /* 304 */
+ { 29, 7, 12, 0, 0, 29, 0, }, /* 305 */
+ { 29, 12, 3, 0, 0, 29, 0, }, /* 306 */
+ { 29, 10, 5, 0, 0, 29, 0, }, /* 307 */
+ { 29, 21, 12, 0, 0, 29, 0, }, /* 308 */
+ { 29, 10, 3, 0, 0, 29, 0, }, /* 309 */
+ { 29, 13, 12, 0, 0, -64, 0, }, /* 310 */
+ { 37, 12, 3, 0, 0, 37, 0, }, /* 311 */
+ { 37, 10, 5, 0, 0, 37, 0, }, /* 312 */
+ { 37, 7, 12, 0, 0, 37, 0, }, /* 313 */
+ { 37, 10, 3, 0, 0, 37, 0, }, /* 314 */
+ { 37, 7, 4, 0, 0, 37, 0, }, /* 315 */
+ { 37, 26, 12, 0, 0, 37, 0, }, /* 316 */
+ { 37, 15, 12, 0, 0, 37, 0, }, /* 317 */
+ { 37, 13, 12, 0, 0, 37, 0, }, /* 318 */
+ { 48, 10, 5, 0, 0, 48, 0, }, /* 319 */
+ { 48, 7, 12, 0, 0, 48, 0, }, /* 320 */
+ { 48, 12, 3, 0, 0, 48, 0, }, /* 321 */
+ { 48, 10, 3, 0, 0, 48, 0, }, /* 322 */
+ { 48, 13, 12, 0, 0, 48, 0, }, /* 323 */
+ { 48, 21, 12, 0, 0, 48, 0, }, /* 324 */
+ { 57, 7, 12, 0, 0, 57, 0, }, /* 325 */
+ { 57, 12, 3, 0, 0, 57, 0, }, /* 326 */
+ { 57, 7, 5, 0, 0, 57, 0, }, /* 327 */
+ { 57, 6, 12, 0, 0, 57, 0, }, /* 328 */
+ { 57, 21, 12, 0, 0, 57, 0, }, /* 329 */
+ { 57, 13, 12, 0, 0, 57, 0, }, /* 330 */
+ { 33, 7, 12, 0, 0, 33, 0, }, /* 331 */
+ { 33, 12, 3, 0, 0, 33, 0, }, /* 332 */
+ { 33, 7, 5, 0, 0, 33, 0, }, /* 333 */
+ { 33, 6, 12, 0, 0, 33, 0, }, /* 334 */
+ { 33, 13, 12, 0, 0, 33, 0, }, /* 335 */
+ { 58, 7, 12, 0, 0, 58, 0, }, /* 336 */
+ { 58, 26, 12, 0, 0, 58, 0, }, /* 337 */
+ { 58, 21, 12, 0, 0, 58, 0, }, /* 338 */
+ { 58, 12, 3, 0, 0, 58, 0, }, /* 339 */
+ { 58, 13, 12, 0, 0, 58, 0, }, /* 340 */
+ { 58, 15, 12, 0, 0, 58, 0, }, /* 341 */
+ { 58, 22, 12, 0, 0, 58, 0, }, /* 342 */
+ { 58, 18, 12, 0, 0, 58, 0, }, /* 343 */
+ { 58, 10, 5, 0, 0, 58, 0, }, /* 344 */
+ { 39, 7, 12, 0, 0, 39, 0, }, /* 345 */
+ { 39, 10, 12, 0, 0, 39, 0, }, /* 346 */
+ { 39, 12, 3, 0, 0, 39, 0, }, /* 347 */
+ { 39, 10, 5, 0, 0, 39, 0, }, /* 348 */
+ { 39, 13, 12, 0, 0, -81, 0, }, /* 349 */
+ { 39, 21, 12, 0, 0, 39, 0, }, /* 350 */
+ { 39, 13, 12, 0, 0, 39, 0, }, /* 351 */
+ { 39, 26, 12, 0, 0, 39, 0, }, /* 352 */
+ { 17, 9, 12, 0, 7264, 17, 0, }, /* 353 */
+ { 17, 5, 12, 0, 3008, 17, 0, }, /* 354 */
+ { 10, 21, 12, 0, 0, -49, 0, }, /* 355 */
+ { 17, 6, 12, 0, 0, 17, 0, }, /* 356 */
+ { 24, 7, 6, 0, 0, 24, 0, }, /* 357 */
+ { 24, 7, 7, 0, 0, 24, 0, }, /* 358 */
+ { 24, 7, 8, 0, 0, 24, 0, }, /* 359 */
+ { 16, 7, 12, 0, 0, 16, 0, }, /* 360 */
+ { 16, 12, 3, 0, 0, 16, 0, }, /* 361 */
+ { 16, 21, 12, 0, 0, 16, 0, }, /* 362 */
+ { 16, 15, 12, 0, 0, 16, 0, }, /* 363 */
+ { 16, 26, 12, 0, 0, 16, 0, }, /* 364 */
+ { 9, 9, 12, 0, 38864, 9, 0, }, /* 365 */
+ { 9, 9, 12, 0, 8, 9, 0, }, /* 366 */
+ { 9, 5, 12, 0, -8, 9, 0, }, /* 367 */
+ { 8, 17, 12, 0, 0, 8, 0, }, /* 368 */
+ { 8, 7, 12, 0, 0, 8, 0, }, /* 369 */
+ { 8, 26, 12, 0, 0, 8, 0, }, /* 370 */
+ { 8, 21, 12, 0, 0, 8, 0, }, /* 371 */
+ { 41, 29, 12, 0, 0, 41, 0, }, /* 372 */
+ { 41, 7, 12, 0, 0, 41, 0, }, /* 373 */
+ { 41, 22, 12, 0, 0, 41, 0, }, /* 374 */
+ { 41, 18, 12, 0, 0, 41, 0, }, /* 375 */
+ { 46, 7, 12, 0, 0, 46, 0, }, /* 376 */
+ { 46, 14, 12, 0, 0, 46, 0, }, /* 377 */
+ { 51, 7, 12, 0, 0, 51, 0, }, /* 378 */
+ { 51, 12, 3, 0, 0, 51, 0, }, /* 379 */
+ { 25, 7, 12, 0, 0, 25, 0, }, /* 380 */
+ { 25, 12, 3, 0, 0, 25, 0, }, /* 381 */
+ { 10, 21, 12, 0, 0, -115, 0, }, /* 382 */
+ { 7, 7, 12, 0, 0, 7, 0, }, /* 383 */
+ { 7, 12, 3, 0, 0, 7, 0, }, /* 384 */
+ { 52, 7, 12, 0, 0, 52, 0, }, /* 385 */
+ { 52, 12, 3, 0, 0, 52, 0, }, /* 386 */
+ { 32, 7, 12, 0, 0, 32, 0, }, /* 387 */
+ { 32, 12, 3, 0, 0, 32, 0, }, /* 388 */
+ { 32, 10, 5, 0, 0, 32, 0, }, /* 389 */
+ { 32, 21, 12, 0, 0, 32, 0, }, /* 390 */
+ { 32, 6, 12, 0, 0, 32, 0, }, /* 391 */
+ { 32, 23, 12, 0, 0, 32, 0, }, /* 392 */
+ { 32, 13, 12, 0, 0, 32, 0, }, /* 393 */
+ { 32, 15, 12, 0, 0, 32, 0, }, /* 394 */
+ { 38, 21, 12, 0, 0, 38, 0, }, /* 395 */
+ { 10, 21, 12, 0, 0, -70, 0, }, /* 396 */
+ { 38, 17, 12, 0, 0, 38, 0, }, /* 397 */
+ { 38, 12, 3, 0, 0, 38, 0, }, /* 398 */
+ { 38, 1, 2, 0, 0, 38, 0, }, /* 399 */
+ { 38, 13, 12, 0, 0, 38, 0, }, /* 400 */
+ { 38, 7, 12, 0, 0, 38, 0, }, /* 401 */
+ { 38, 6, 12, 0, 0, 38, 0, }, /* 402 */
+ { 35, 7, 12, 0, 0, 35, 0, }, /* 403 */
+ { 35, 12, 3, 0, 0, 35, 0, }, /* 404 */
+ { 35, 10, 5, 0, 0, 35, 0, }, /* 405 */
+ { 35, 26, 12, 0, 0, 35, 0, }, /* 406 */
+ { 35, 21, 12, 0, 0, 35, 0, }, /* 407 */
+ { 35, 13, 12, 0, 0, 35, 0, }, /* 408 */
+ { 53, 7, 12, 0, 0, 53, 0, }, /* 409 */
+ { 40, 7, 12, 0, 0, 40, 0, }, /* 410 */
+ { 40, 13, 12, 0, 0, 40, 0, }, /* 411 */
+ { 40, 15, 12, 0, 0, 40, 0, }, /* 412 */
+ { 40, 26, 12, 0, 0, 40, 0, }, /* 413 */
+ { 32, 26, 12, 0, 0, 32, 0, }, /* 414 */
+ { 6, 7, 12, 0, 0, 6, 0, }, /* 415 */
+ { 6, 12, 3, 0, 0, 6, 0, }, /* 416 */
+ { 6, 10, 5, 0, 0, 6, 0, }, /* 417 */
+ { 6, 21, 12, 0, 0, 6, 0, }, /* 418 */
+ { 91, 7, 12, 0, 0, 91, 0, }, /* 419 */
+ { 91, 10, 5, 0, 0, 91, 0, }, /* 420 */
+ { 91, 12, 3, 0, 0, 91, 0, }, /* 421 */
+ { 91, 10, 12, 0, 0, 91, 0, }, /* 422 */
+ { 91, 13, 12, 0, 0, 91, 0, }, /* 423 */
+ { 91, 21, 12, 0, 0, 91, 0, }, /* 424 */
+ { 91, 6, 12, 0, 0, 91, 0, }, /* 425 */
+ { 28, 11, 3, 0, 0, 28, 0, }, /* 426 */
+ { 62, 12, 3, 0, 0, 62, 0, }, /* 427 */
+ { 62, 10, 5, 0, 0, 62, 0, }, /* 428 */
+ { 62, 7, 12, 0, 0, 62, 0, }, /* 429 */
+ { 62, 10, 3, 0, 0, 62, 0, }, /* 430 */
+ { 62, 13, 12, 0, 0, 62, 0, }, /* 431 */
+ { 62, 21, 12, 0, 0, 62, 0, }, /* 432 */
+ { 62, 26, 12, 0, 0, 62, 0, }, /* 433 */
+ { 76, 12, 3, 0, 0, 76, 0, }, /* 434 */
+ { 76, 10, 5, 0, 0, 76, 0, }, /* 435 */
+ { 76, 7, 12, 0, 0, 76, 0, }, /* 436 */
+ { 76, 13, 12, 0, 0, 76, 0, }, /* 437 */
+ { 93, 7, 12, 0, 0, 93, 0, }, /* 438 */
+ { 93, 12, 3, 0, 0, 93, 0, }, /* 439 */
+ { 93, 10, 5, 0, 0, 93, 0, }, /* 440 */
+ { 93, 21, 12, 0, 0, 93, 0, }, /* 441 */
+ { 70, 7, 12, 0, 0, 70, 0, }, /* 442 */
+ { 70, 10, 5, 0, 0, 70, 0, }, /* 443 */
+ { 70, 12, 3, 0, 0, 70, 0, }, /* 444 */
+ { 70, 21, 12, 0, 0, 70, 0, }, /* 445 */
+ { 70, 13, 12, 0, 0, 70, 0, }, /* 446 */
+ { 73, 13, 12, 0, 0, 73, 0, }, /* 447 */
+ { 73, 7, 12, 0, 0, 73, 0, }, /* 448 */
+ { 73, 6, 12, 0, 0, 73, 0, }, /* 449 */
+ { 73, 21, 12, 0, 0, 73, 0, }, /* 450 */
+ { 13, 5, 12, 63, -6222, 13, 0, }, /* 451 */
+ { 13, 5, 12, 67, -6221, 13, 0, }, /* 452 */
+ { 13, 5, 12, 71, -6212, 13, 0, }, /* 453 */
+ { 13, 5, 12, 75, -6210, 13, 0, }, /* 454 */
+ { 13, 5, 12, 79, -6210, 13, 0, }, /* 455 */
+ { 13, 5, 12, 79, -6211, 13, 0, }, /* 456 */
+ { 13, 5, 12, 84, -6204, 13, 0, }, /* 457 */
+ { 13, 5, 12, 88, -6180, 13, 0, }, /* 458 */
+ { 13, 5, 12, 108, 35267, 13, 0, }, /* 459 */
+ { 17, 9, 12, 0, -3008, 17, 0, }, /* 460 */
+ { 76, 21, 12, 0, 0, 76, 0, }, /* 461 */
+ { 28, 12, 3, 0, 0, -110, 0, }, /* 462 */
+ { 28, 12, 3, 0, 0, 15, 0, }, /* 463 */
+ { 10, 21, 12, 0, 0, -37, 0, }, /* 464 */
+ { 28, 12, 3, 0, 0, -16, 0, }, /* 465 */
+ { 28, 12, 3, 0, 0, -43, 0, }, /* 466 */
+ { 28, 12, 3, 0, 0, -138, 0, }, /* 467 */
+ { 10, 10, 5, 0, 0, -16, 0, }, /* 468 */
+ { 10, 7, 12, 0, 0, -40, 0, }, /* 469 */
+ { 10, 7, 12, 0, 0, -16, 0, }, /* 470 */
+ { 10, 7, 12, 0, 0, 15, 0, }, /* 471 */
+ { 10, 7, 12, 0, 0, -154, 0, }, /* 472 */
+ { 10, 7, 12, 0, 0, -37, 0, }, /* 473 */
+ { 28, 12, 3, 0, 0, -89, 0, }, /* 474 */
+ { 10, 10, 5, 0, 0, 3, 0, }, /* 475 */
+ { 28, 12, 3, 0, 0, -37, 0, }, /* 476 */
+ { 10, 7, 12, 0, 0, 150, 0, }, /* 477 */
+ { 13, 5, 12, 0, 0, 13, 0, }, /* 478 */
+ { 13, 6, 12, 0, 0, 13, 0, }, /* 479 */
+ { 34, 5, 12, 0, 35332, 34, 0, }, /* 480 */
+ { 34, 5, 12, 0, 3814, 34, 0, }, /* 481 */
+ { 34, 5, 12, 0, 35384, 34, 0, }, /* 482 */
+ { 34, 9, 12, 92, 1, 34, 0, }, /* 483 */
+ { 34, 5, 12, 92, -1, 34, 0, }, /* 484 */
+ { 34, 5, 12, 92, -58, 34, 0, }, /* 485 */
+ { 34, 9, 12, 0, -7615, 34, 0, }, /* 486 */
+ { 20, 5, 12, 0, 8, 20, 0, }, /* 487 */
+ { 20, 9, 12, 0, -8, 20, 0, }, /* 488 */
+ { 20, 5, 12, 0, 74, 20, 0, }, /* 489 */
+ { 20, 5, 12, 0, 86, 20, 0, }, /* 490 */
+ { 20, 5, 12, 0, 100, 20, 0, }, /* 491 */
+ { 20, 5, 12, 0, 128, 20, 0, }, /* 492 */
+ { 20, 5, 12, 0, 112, 20, 0, }, /* 493 */
+ { 20, 5, 12, 0, 126, 20, 0, }, /* 494 */
+ { 20, 8, 12, 0, -8, 20, 0, }, /* 495 */
+ { 20, 5, 12, 0, 9, 20, 0, }, /* 496 */
+ { 20, 9, 12, 0, -74, 20, 0, }, /* 497 */
+ { 20, 8, 12, 0, -9, 20, 0, }, /* 498 */
+ { 20, 5, 12, 21, -7173, 20, 0, }, /* 499 */
+ { 20, 9, 12, 0, -86, 20, 0, }, /* 500 */
+ { 20, 9, 12, 0, -100, 20, 0, }, /* 501 */
+ { 20, 9, 12, 0, -112, 20, 0, }, /* 502 */
+ { 20, 9, 12, 0, -128, 20, 0, }, /* 503 */
+ { 20, 9, 12, 0, -126, 20, 0, }, /* 504 */
+ { 28, 1, 3, 0, 0, 28, 0, }, /* 505 */
+ { 28, 1, 13, 0, 0, 28, 0, }, /* 506 */
+ { 10, 27, 2, 0, 0, 10, 0, }, /* 507 */
+ { 10, 28, 2, 0, 0, 10, 0, }, /* 508 */
+ { 10, 29, 12, 0, 0, -67, 0, }, /* 509 */
+ { 10, 21, 14, 0, 0, 10, 0, }, /* 510 */
+ { 0, 2, 2, 0, 0, 0, 0, }, /* 511 */
+ { 28, 12, 3, 0, 0, -93, 0, }, /* 512 */
+ { 10, 9, 12, 0, 0, 10, 0, }, /* 513 */
+ { 10, 5, 12, 0, 0, 10, 0, }, /* 514 */
+ { 20, 9, 12, 96, -7517, 20, 0, }, /* 515 */
+ { 34, 9, 12, 100, -8383, 34, 0, }, /* 516 */
+ { 34, 9, 12, 104, -8262, 34, 0, }, /* 517 */
+ { 34, 9, 12, 0, 28, 34, 0, }, /* 518 */
+ { 10, 7, 12, 0, 0, 10, 0, }, /* 519 */
+ { 10, 5, 14, 0, 0, 10, 0, }, /* 520 */
+ { 34, 5, 12, 0, -28, 34, 0, }, /* 521 */
+ { 34, 14, 12, 0, 16, 34, 0, }, /* 522 */
+ { 34, 14, 12, 0, -16, 34, 0, }, /* 523 */
+ { 34, 14, 12, 0, 0, 34, 0, }, /* 524 */
+ { 10, 25, 14, 0, 0, 10, 0, }, /* 525 */
+ { 10, 26, 12, 0, 26, 10, 0, }, /* 526 */
+ { 10, 26, 14, 0, 26, 10, 0, }, /* 527 */
+ { 10, 26, 12, 0, -26, 10, 0, }, /* 528 */
+ { 5, 26, 12, 0, 0, 5, 0, }, /* 529 */
+ { 18, 9, 12, 0, 48, 18, 0, }, /* 530 */
+ { 18, 5, 12, 0, -48, 18, 0, }, /* 531 */
+ { 34, 9, 12, 0, -10743, 34, 0, }, /* 532 */
+ { 34, 9, 12, 0, -3814, 34, 0, }, /* 533 */
+ { 34, 9, 12, 0, -10727, 34, 0, }, /* 534 */
+ { 34, 5, 12, 0, -10795, 34, 0, }, /* 535 */
+ { 34, 5, 12, 0, -10792, 34, 0, }, /* 536 */
+ { 34, 9, 12, 0, -10780, 34, 0, }, /* 537 */
+ { 34, 9, 12, 0, -10749, 34, 0, }, /* 538 */
+ { 34, 9, 12, 0, -10783, 34, 0, }, /* 539 */
+ { 34, 9, 12, 0, -10782, 34, 0, }, /* 540 */
+ { 34, 9, 12, 0, -10815, 34, 0, }, /* 541 */
+ { 11, 5, 12, 0, 0, 11, 0, }, /* 542 */
+ { 11, 26, 12, 0, 0, 11, 0, }, /* 543 */
+ { 11, 12, 3, 0, 0, 11, 0, }, /* 544 */
+ { 11, 21, 12, 0, 0, 11, 0, }, /* 545 */
+ { 11, 15, 12, 0, 0, 11, 0, }, /* 546 */
+ { 17, 5, 12, 0, -7264, 17, 0, }, /* 547 */
+ { 59, 7, 12, 0, 0, 59, 0, }, /* 548 */
+ { 59, 6, 12, 0, 0, 59, 0, }, /* 549 */
+ { 59, 21, 12, 0, 0, 59, 0, }, /* 550 */
+ { 59, 12, 3, 0, 0, 59, 0, }, /* 551 */
+ { 13, 12, 3, 0, 0, 13, 0, }, /* 552 */
+ { 10, 21, 12, 0, 0, -28, 0, }, /* 553 */
+ { 23, 26, 12, 0, 0, 23, 0, }, /* 554 */
+ { 10, 21, 12, 0, 0, -131, 0, }, /* 555 */
+ { 10, 21, 12, 0, 0, -125, 0, }, /* 556 */
+ { 23, 6, 12, 0, 0, 23, 0, }, /* 557 */
+ { 10, 7, 12, 0, 0, 23, 0, }, /* 558 */
+ { 23, 14, 12, 0, 0, 23, 0, }, /* 559 */
+ { 10, 22, 12, 0, 0, -131, 0, }, /* 560 */
+ { 10, 18, 12, 0, 0, -131, 0, }, /* 561 */
+ { 10, 26, 12, 0, 0, -125, 0, }, /* 562 */
+ { 10, 17, 12, 0, 0, -125, 0, }, /* 563 */
+ { 10, 22, 12, 0, 0, -125, 0, }, /* 564 */
+ { 10, 18, 12, 0, 0, -125, 0, }, /* 565 */
+ { 28, 12, 3, 0, 0, -19, 0, }, /* 566 */
+ { 24, 10, 3, 0, 0, 24, 0, }, /* 567 */
+ { 10, 17, 14, 0, 0, -125, 0, }, /* 568 */
+ { 10, 6, 12, 0, 0, -61, 0, }, /* 569 */
+ { 10, 7, 12, 0, 0, -97, 0, }, /* 570 */
+ { 10, 21, 14, 0, 0, -97, 0, }, /* 571 */
+ { 10, 26, 12, 0, 0, 23, 0, }, /* 572 */
+ { 27, 7, 12, 0, 0, 27, 0, }, /* 573 */
+ { 28, 12, 3, 0, 0, -61, 0, }, /* 574 */
+ { 10, 24, 12, 0, 0, -61, 0, }, /* 575 */
+ { 27, 6, 12, 0, 0, 27, 0, }, /* 576 */
+ { 10, 17, 12, 0, 0, -61, 0, }, /* 577 */
+ { 30, 7, 12, 0, 0, 30, 0, }, /* 578 */
+ { 30, 6, 12, 0, 0, 30, 0, }, /* 579 */
+ { 4, 7, 12, 0, 0, 4, 0, }, /* 580 */
+ { 24, 7, 12, 0, 0, 24, 0, }, /* 581 */
+ { 10, 15, 12, 0, 0, 23, 0, }, /* 582 */
+ { 24, 26, 12, 0, 0, 24, 0, }, /* 583 */
+ { 10, 26, 14, 0, 0, 23, 0, }, /* 584 */
+ { 30, 26, 12, 0, 0, 30, 0, }, /* 585 */
+ { 23, 7, 12, 0, 0, 23, 0, }, /* 586 */
+ { 61, 7, 12, 0, 0, 61, 0, }, /* 587 */
+ { 61, 6, 12, 0, 0, 61, 0, }, /* 588 */
+ { 61, 26, 12, 0, 0, 61, 0, }, /* 589 */
+ { 86, 7, 12, 0, 0, 86, 0, }, /* 590 */
+ { 86, 6, 12, 0, 0, 86, 0, }, /* 591 */
+ { 86, 21, 12, 0, 0, 86, 0, }, /* 592 */
+ { 77, 7, 12, 0, 0, 77, 0, }, /* 593 */
+ { 77, 6, 12, 0, 0, 77, 0, }, /* 594 */
+ { 77, 21, 12, 0, 0, 77, 0, }, /* 595 */
+ { 77, 13, 12, 0, 0, 77, 0, }, /* 596 */
+ { 13, 9, 12, 108, 1, 13, 0, }, /* 597 */
+ { 13, 5, 12, 108, -35267, 13, 0, }, /* 598 */
+ { 13, 7, 12, 0, 0, 13, 0, }, /* 599 */
+ { 13, 21, 12, 0, 0, 13, 0, }, /* 600 */
+ { 79, 7, 12, 0, 0, 79, 0, }, /* 601 */
+ { 79, 14, 12, 0, 0, 79, 0, }, /* 602 */
+ { 79, 12, 3, 0, 0, 79, 0, }, /* 603 */
+ { 79, 21, 12, 0, 0, 79, 0, }, /* 604 */
+ { 34, 9, 12, 0, -35332, 34, 0, }, /* 605 */
+ { 34, 9, 12, 0, -42280, 34, 0, }, /* 606 */
+ { 34, 5, 12, 0, 48, 34, 0, }, /* 607 */
+ { 34, 9, 12, 0, -42308, 34, 0, }, /* 608 */
+ { 34, 9, 12, 0, -42319, 34, 0, }, /* 609 */
+ { 34, 9, 12, 0, -42315, 34, 0, }, /* 610 */
+ { 34, 9, 12, 0, -42305, 34, 0, }, /* 611 */
+ { 34, 9, 12, 0, -42258, 34, 0, }, /* 612 */
+ { 34, 9, 12, 0, -42282, 34, 0, }, /* 613 */
+ { 34, 9, 12, 0, -42261, 34, 0, }, /* 614 */
+ { 34, 9, 12, 0, 928, 34, 0, }, /* 615 */
+ { 34, 9, 12, 0, -48, 34, 0, }, /* 616 */
+ { 34, 9, 12, 0, -42307, 34, 0, }, /* 617 */
+ { 34, 9, 12, 0, -35384, 34, 0, }, /* 618 */
+ { 49, 7, 12, 0, 0, 49, 0, }, /* 619 */
+ { 49, 12, 3, 0, 0, 49, 0, }, /* 620 */
+ { 49, 10, 5, 0, 0, 49, 0, }, /* 621 */
+ { 49, 26, 12, 0, 0, 49, 0, }, /* 622 */
+ { 10, 15, 12, 0, 0, -216, 0, }, /* 623 */
+ { 10, 15, 12, 0, 0, -202, 0, }, /* 624 */
+ { 10, 26, 12, 0, 0, -163, 0, }, /* 625 */
+ { 10, 23, 12, 0, 0, -163, 0, }, /* 626 */
+ { 65, 7, 12, 0, 0, 65, 0, }, /* 627 */
+ { 65, 21, 12, 0, 0, 65, 0, }, /* 628 */
+ { 75, 10, 5, 0, 0, 75, 0, }, /* 629 */
+ { 75, 7, 12, 0, 0, 75, 0, }, /* 630 */
+ { 75, 12, 3, 0, 0, 75, 0, }, /* 631 */
+ { 75, 21, 12, 0, 0, 75, 0, }, /* 632 */
+ { 75, 13, 12, 0, 0, 75, 0, }, /* 633 */
+ { 15, 12, 3, 0, 0, -16, 0, }, /* 634 */
+ { 15, 7, 12, 0, 0, -46, 0, }, /* 635 */
+ { 69, 13, 12, 0, 0, 69, 0, }, /* 636 */
+ { 69, 7, 12, 0, 0, 69, 0, }, /* 637 */
+ { 69, 12, 3, 0, 0, 69, 0, }, /* 638 */
+ { 10, 21, 12, 0, 0, -101, 0, }, /* 639 */
+ { 69, 21, 12, 0, 0, 69, 0, }, /* 640 */
+ { 74, 7, 12, 0, 0, 74, 0, }, /* 641 */
+ { 74, 12, 3, 0, 0, 74, 0, }, /* 642 */
+ { 74, 10, 5, 0, 0, 74, 0, }, /* 643 */
+ { 74, 21, 12, 0, 0, 74, 0, }, /* 644 */
+ { 84, 12, 3, 0, 0, 84, 0, }, /* 645 */
+ { 84, 10, 5, 0, 0, 84, 0, }, /* 646 */
+ { 84, 7, 12, 0, 0, 84, 0, }, /* 647 */
+ { 84, 21, 12, 0, 0, 84, 0, }, /* 648 */
+ { 10, 6, 12, 0, 0, -22, 0, }, /* 649 */
+ { 84, 13, 12, 0, 0, 84, 0, }, /* 650 */
+ { 39, 6, 12, 0, 0, 39, 0, }, /* 651 */
+ { 68, 7, 12, 0, 0, 68, 0, }, /* 652 */
+ { 68, 12, 3, 0, 0, 68, 0, }, /* 653 */
+ { 68, 10, 5, 0, 0, 68, 0, }, /* 654 */
+ { 68, 13, 12, 0, 0, 68, 0, }, /* 655 */
+ { 68, 21, 12, 0, 0, 68, 0, }, /* 656 */
+ { 92, 7, 12, 0, 0, 92, 0, }, /* 657 */
+ { 92, 12, 3, 0, 0, 92, 0, }, /* 658 */
+ { 92, 6, 12, 0, 0, 92, 0, }, /* 659 */
+ { 92, 21, 12, 0, 0, 92, 0, }, /* 660 */
+ { 87, 7, 12, 0, 0, 87, 0, }, /* 661 */
+ { 87, 10, 5, 0, 0, 87, 0, }, /* 662 */
+ { 87, 12, 3, 0, 0, 87, 0, }, /* 663 */
+ { 87, 21, 12, 0, 0, 87, 0, }, /* 664 */
+ { 87, 6, 12, 0, 0, 87, 0, }, /* 665 */
+ { 34, 5, 12, 0, -928, 34, 0, }, /* 666 */
+ { 9, 5, 12, 0, -38864, 9, 0, }, /* 667 */
+ { 87, 13, 12, 0, 0, 87, 0, }, /* 668 */
+ { 24, 7, 9, 0, 0, 24, 0, }, /* 669 */
+ { 24, 7, 10, 0, 0, 24, 0, }, /* 670 */
+ { 0, 4, 12, 0, 0, 0, 0, }, /* 671 */
+ { 0, 3, 12, 0, 0, 0, 0, }, /* 672 */
+ { 26, 25, 12, 0, 0, 26, 0, }, /* 673 */
+ { 1, 24, 12, 0, 0, 1, 0, }, /* 674 */
+ { 1, 7, 12, 0, 0, -10, 0, }, /* 675 */
+ { 1, 26, 12, 0, 0, -10, 0, }, /* 676 */
+ { 10, 6, 3, 0, 0, -61, 0, }, /* 677 */
+ { 36, 7, 12, 0, 0, 36, 0, }, /* 678 */
+ { 10, 21, 12, 0, 0, -25, 0, }, /* 679 */
+ { 10, 15, 12, 0, 0, -85, 0, }, /* 680 */
+ { 10, 26, 12, 0, 0, -25, 0, }, /* 681 */
+ { 20, 14, 12, 0, 0, 20, 0, }, /* 682 */
+ { 20, 15, 12, 0, 0, 20, 0, }, /* 683 */
+ { 20, 26, 12, 0, 0, 20, 0, }, /* 684 */
+ { 71, 7, 12, 0, 0, 71, 0, }, /* 685 */
+ { 67, 7, 12, 0, 0, 67, 0, }, /* 686 */
+ { 28, 12, 3, 0, 0, -1, 0, }, /* 687 */
+ { 10, 15, 12, 0, 0, -1, 0, }, /* 688 */
+ { 42, 7, 12, 0, 0, 42, 0, }, /* 689 */
+ { 42, 15, 12, 0, 0, 42, 0, }, /* 690 */
+ { 19, 7, 12, 0, 0, 19, 0, }, /* 691 */
+ { 19, 14, 12, 0, 0, 19, 0, }, /* 692 */
+ { 118, 7, 12, 0, 0, 118, 0, }, /* 693 */
+ { 118, 12, 3, 0, 0, 118, 0, }, /* 694 */
+ { 60, 7, 12, 0, 0, 60, 0, }, /* 695 */
+ { 60, 21, 12, 0, 0, 60, 0, }, /* 696 */
+ { 43, 7, 12, 0, 0, 43, 0, }, /* 697 */
+ { 43, 21, 12, 0, 0, 43, 0, }, /* 698 */
+ { 43, 14, 12, 0, 0, 43, 0, }, /* 699 */
+ { 14, 9, 12, 0, 40, 14, 0, }, /* 700 */
+ { 14, 5, 12, 0, -40, 14, 0, }, /* 701 */
+ { 47, 7, 12, 0, 0, 47, 0, }, /* 702 */
+ { 45, 7, 12, 0, 0, 45, 0, }, /* 703 */
+ { 45, 13, 12, 0, 0, 45, 0, }, /* 704 */
+ { 136, 9, 12, 0, 40, 136, 0, }, /* 705 */
+ { 136, 5, 12, 0, -40, 136, 0, }, /* 706 */
+ { 106, 7, 12, 0, 0, 106, 0, }, /* 707 */
+ { 104, 7, 12, 0, 0, 104, 0, }, /* 708 */
+ { 104, 21, 12, 0, 0, 104, 0, }, /* 709 */
+ { 110, 7, 12, 0, 0, 110, 0, }, /* 710 */
+ { 12, 7, 12, 0, 0, 12, 0, }, /* 711 */
+ { 81, 7, 12, 0, 0, 81, 0, }, /* 712 */
+ { 81, 21, 12, 0, 0, 81, 0, }, /* 713 */
+ { 81, 15, 12, 0, 0, 81, 0, }, /* 714 */
+ { 120, 7, 12, 0, 0, 120, 0, }, /* 715 */
+ { 120, 26, 12, 0, 0, 120, 0, }, /* 716 */
+ { 120, 15, 12, 0, 0, 120, 0, }, /* 717 */
+ { 116, 7, 12, 0, 0, 116, 0, }, /* 718 */
+ { 116, 15, 12, 0, 0, 116, 0, }, /* 719 */
+ { 128, 7, 12, 0, 0, 128, 0, }, /* 720 */
+ { 128, 15, 12, 0, 0, 128, 0, }, /* 721 */
+ { 66, 7, 12, 0, 0, 66, 0, }, /* 722 */
+ { 66, 15, 12, 0, 0, 66, 0, }, /* 723 */
+ { 66, 21, 12, 0, 0, 66, 0, }, /* 724 */
+ { 72, 7, 12, 0, 0, 72, 0, }, /* 725 */
+ { 72, 21, 12, 0, 0, 72, 0, }, /* 726 */
+ { 98, 7, 12, 0, 0, 98, 0, }, /* 727 */
+ { 97, 7, 12, 0, 0, 97, 0, }, /* 728 */
+ { 97, 15, 12, 0, 0, 97, 0, }, /* 729 */
+ { 31, 7, 12, 0, 0, 31, 0, }, /* 730 */
+ { 31, 12, 3, 0, 0, 31, 0, }, /* 731 */
+ { 31, 15, 12, 0, 0, 31, 0, }, /* 732 */
+ { 31, 21, 12, 0, 0, 31, 0, }, /* 733 */
+ { 88, 7, 12, 0, 0, 88, 0, }, /* 734 */
+ { 88, 15, 12, 0, 0, 88, 0, }, /* 735 */
+ { 88, 21, 12, 0, 0, 88, 0, }, /* 736 */
+ { 117, 7, 12, 0, 0, 117, 0, }, /* 737 */
+ { 117, 15, 12, 0, 0, 117, 0, }, /* 738 */
+ { 112, 7, 12, 0, 0, 112, 0, }, /* 739 */
+ { 112, 26, 12, 0, 0, 112, 0, }, /* 740 */
+ { 112, 12, 3, 0, 0, 112, 0, }, /* 741 */
+ { 112, 15, 12, 0, 0, 112, 0, }, /* 742 */
+ { 112, 21, 12, 0, 0, 112, 0, }, /* 743 */
+ { 78, 7, 12, 0, 0, 78, 0, }, /* 744 */
+ { 78, 21, 12, 0, 0, 78, 0, }, /* 745 */
+ { 83, 7, 12, 0, 0, 83, 0, }, /* 746 */
+ { 83, 15, 12, 0, 0, 83, 0, }, /* 747 */
+ { 82, 7, 12, 0, 0, 82, 0, }, /* 748 */
+ { 82, 15, 12, 0, 0, 82, 0, }, /* 749 */
+ { 121, 7, 12, 0, 0, 121, 0, }, /* 750 */
+ { 121, 21, 12, 0, 0, 121, 0, }, /* 751 */
+ { 121, 15, 12, 0, 0, 121, 0, }, /* 752 */
+ { 89, 7, 12, 0, 0, 89, 0, }, /* 753 */
+ { 130, 9, 12, 0, 64, 130, 0, }, /* 754 */
+ { 130, 5, 12, 0, -64, 130, 0, }, /* 755 */
+ { 130, 15, 12, 0, 0, 130, 0, }, /* 756 */
+ { 144, 7, 12, 0, 0, 144, 0, }, /* 757 */
+ { 144, 12, 3, 0, 0, 144, 0, }, /* 758 */
+ { 144, 13, 12, 0, 0, 144, 0, }, /* 759 */
+ { 1, 15, 12, 0, 0, 1, 0, }, /* 760 */
+ { 147, 7, 12, 0, 0, 147, 0, }, /* 761 */
+ { 147, 15, 12, 0, 0, 147, 0, }, /* 762 */
+ { 148, 7, 12, 0, 0, 148, 0, }, /* 763 */
+ { 148, 12, 3, 0, 0, 148, 0, }, /* 764 */
+ { 148, 15, 12, 0, 0, 148, 0, }, /* 765 */
+ { 148, 21, 12, 0, 0, 148, 0, }, /* 766 */
+ { 149, 7, 12, 0, 0, 149, 0, }, /* 767 */
+ { 94, 10, 5, 0, 0, 94, 0, }, /* 768 */
+ { 94, 12, 3, 0, 0, 94, 0, }, /* 769 */
+ { 94, 7, 12, 0, 0, 94, 0, }, /* 770 */
+ { 94, 21, 12, 0, 0, 94, 0, }, /* 771 */
+ { 94, 15, 12, 0, 0, 94, 0, }, /* 772 */
+ { 94, 13, 12, 0, 0, 94, 0, }, /* 773 */
+ { 85, 12, 3, 0, 0, 85, 0, }, /* 774 */
+ { 85, 10, 5, 0, 0, 85, 0, }, /* 775 */
+ { 85, 7, 12, 0, 0, 85, 0, }, /* 776 */
+ { 85, 21, 12, 0, 0, 85, 0, }, /* 777 */
+ { 85, 1, 4, 0, 0, 85, 0, }, /* 778 */
+ { 101, 7, 12, 0, 0, 101, 0, }, /* 779 */
+ { 101, 13, 12, 0, 0, 101, 0, }, /* 780 */
+ { 96, 12, 3, 0, 0, 96, 0, }, /* 781 */
+ { 96, 7, 12, 0, 0, 96, 0, }, /* 782 */
+ { 96, 10, 5, 0, 0, 96, 0, }, /* 783 */
+ { 96, 13, 12, 0, 0, 96, 0, }, /* 784 */
+ { 96, 21, 12, 0, 0, 96, 0, }, /* 785 */
+ { 111, 7, 12, 0, 0, 111, 0, }, /* 786 */
+ { 111, 12, 3, 0, 0, 111, 0, }, /* 787 */
+ { 111, 21, 12, 0, 0, 111, 0, }, /* 788 */
+ { 100, 12, 3, 0, 0, 100, 0, }, /* 789 */
+ { 100, 10, 5, 0, 0, 100, 0, }, /* 790 */
+ { 100, 7, 12, 0, 0, 100, 0, }, /* 791 */
+ { 100, 7, 4, 0, 0, 100, 0, }, /* 792 */
+ { 100, 21, 12, 0, 0, 100, 0, }, /* 793 */
+ { 100, 13, 12, 0, 0, 100, 0, }, /* 794 */
+ { 48, 15, 12, 0, 0, 48, 0, }, /* 795 */
+ { 108, 7, 12, 0, 0, 108, 0, }, /* 796 */
+ { 108, 10, 5, 0, 0, 108, 0, }, /* 797 */
+ { 108, 12, 3, 0, 0, 108, 0, }, /* 798 */
+ { 108, 21, 12, 0, 0, 108, 0, }, /* 799 */
+ { 129, 7, 12, 0, 0, 129, 0, }, /* 800 */
+ { 129, 21, 12, 0, 0, 129, 0, }, /* 801 */
+ { 109, 7, 12, 0, 0, 109, 0, }, /* 802 */
+ { 109, 12, 3, 0, 0, 109, 0, }, /* 803 */
+ { 109, 10, 5, 0, 0, 109, 0, }, /* 804 */
+ { 109, 13, 12, 0, 0, 109, 0, }, /* 805 */
+ { 107, 12, 3, 0, 0, 107, 0, }, /* 806 */
+ { 107, 12, 3, 0, 0, -52, 0, }, /* 807 */
+ { 107, 10, 5, 0, 0, 107, 0, }, /* 808 */
+ { 107, 10, 5, 0, 0, -52, 0, }, /* 809 */
+ { 107, 7, 12, 0, 0, 107, 0, }, /* 810 */
+ { 28, 12, 3, 0, 0, -52, 0, }, /* 811 */
+ { 107, 10, 3, 0, 0, 107, 0, }, /* 812 */
+ { 135, 7, 12, 0, 0, 135, 0, }, /* 813 */
+ { 135, 10, 5, 0, 0, 135, 0, }, /* 814 */
+ { 135, 12, 3, 0, 0, 135, 0, }, /* 815 */
+ { 135, 21, 12, 0, 0, 135, 0, }, /* 816 */
+ { 135, 13, 12, 0, 0, 135, 0, }, /* 817 */
+ { 124, 7, 12, 0, 0, 124, 0, }, /* 818 */
+ { 124, 10, 3, 0, 0, 124, 0, }, /* 819 */
+ { 124, 10, 5, 0, 0, 124, 0, }, /* 820 */
+ { 124, 12, 3, 0, 0, 124, 0, }, /* 821 */
+ { 124, 21, 12, 0, 0, 124, 0, }, /* 822 */
+ { 124, 13, 12, 0, 0, 124, 0, }, /* 823 */
+ { 123, 7, 12, 0, 0, 123, 0, }, /* 824 */
+ { 123, 10, 3, 0, 0, 123, 0, }, /* 825 */
+ { 123, 10, 5, 0, 0, 123, 0, }, /* 826 */
+ { 123, 12, 3, 0, 0, 123, 0, }, /* 827 */
+ { 123, 21, 12, 0, 0, 123, 0, }, /* 828 */
+ { 114, 7, 12, 0, 0, 114, 0, }, /* 829 */
+ { 114, 10, 5, 0, 0, 114, 0, }, /* 830 */
+ { 114, 12, 3, 0, 0, 114, 0, }, /* 831 */
+ { 114, 21, 12, 0, 0, 114, 0, }, /* 832 */
+ { 114, 13, 12, 0, 0, 114, 0, }, /* 833 */
+ { 102, 7, 12, 0, 0, 102, 0, }, /* 834 */
+ { 102, 12, 3, 0, 0, 102, 0, }, /* 835 */
+ { 102, 10, 5, 0, 0, 102, 0, }, /* 836 */
+ { 102, 13, 12, 0, 0, 102, 0, }, /* 837 */
+ { 126, 7, 12, 0, 0, 126, 0, }, /* 838 */
+ { 126, 12, 3, 0, 0, 126, 0, }, /* 839 */
+ { 126, 10, 5, 0, 0, 126, 0, }, /* 840 */
+ { 126, 13, 12, 0, 0, 126, 0, }, /* 841 */
+ { 126, 15, 12, 0, 0, 126, 0, }, /* 842 */
+ { 126, 21, 12, 0, 0, 126, 0, }, /* 843 */
+ { 126, 26, 12, 0, 0, 126, 0, }, /* 844 */
+ { 142, 7, 12, 0, 0, 142, 0, }, /* 845 */
+ { 142, 10, 5, 0, 0, 142, 0, }, /* 846 */
+ { 142, 12, 3, 0, 0, 142, 0, }, /* 847 */
+ { 142, 21, 12, 0, 0, 142, 0, }, /* 848 */
+ { 125, 9, 12, 0, 32, 125, 0, }, /* 849 */
+ { 125, 5, 12, 0, -32, 125, 0, }, /* 850 */
+ { 125, 13, 12, 0, 0, 125, 0, }, /* 851 */
+ { 125, 15, 12, 0, 0, 125, 0, }, /* 852 */
+ { 125, 7, 12, 0, 0, 125, 0, }, /* 853 */
+ { 150, 7, 12, 0, 0, 150, 0, }, /* 854 */
+ { 150, 10, 5, 0, 0, 150, 0, }, /* 855 */
+ { 150, 12, 3, 0, 0, 150, 0, }, /* 856 */
+ { 150, 21, 12, 0, 0, 150, 0, }, /* 857 */
+ { 141, 7, 12, 0, 0, 141, 0, }, /* 858 */
+ { 141, 12, 3, 0, 0, 141, 0, }, /* 859 */
+ { 141, 10, 5, 0, 0, 141, 0, }, /* 860 */
+ { 141, 7, 4, 0, 0, 141, 0, }, /* 861 */
+ { 141, 21, 12, 0, 0, 141, 0, }, /* 862 */
+ { 140, 7, 12, 0, 0, 140, 0, }, /* 863 */
+ { 140, 12, 3, 0, 0, 140, 0, }, /* 864 */
+ { 140, 10, 5, 0, 0, 140, 0, }, /* 865 */
+ { 140, 7, 4, 0, 0, 140, 0, }, /* 866 */
+ { 140, 21, 12, 0, 0, 140, 0, }, /* 867 */
+ { 122, 7, 12, 0, 0, 122, 0, }, /* 868 */
+ { 133, 7, 12, 0, 0, 133, 0, }, /* 869 */
+ { 133, 10, 5, 0, 0, 133, 0, }, /* 870 */
+ { 133, 12, 3, 0, 0, 133, 0, }, /* 871 */
+ { 133, 21, 12, 0, 0, 133, 0, }, /* 872 */
+ { 133, 13, 12, 0, 0, 133, 0, }, /* 873 */
+ { 133, 15, 12, 0, 0, 133, 0, }, /* 874 */
+ { 134, 21, 12, 0, 0, 134, 0, }, /* 875 */
+ { 134, 7, 12, 0, 0, 134, 0, }, /* 876 */
+ { 134, 12, 3, 0, 0, 134, 0, }, /* 877 */
+ { 134, 10, 5, 0, 0, 134, 0, }, /* 878 */
+ { 138, 7, 12, 0, 0, 138, 0, }, /* 879 */
+ { 138, 12, 3, 0, 0, 138, 0, }, /* 880 */
+ { 138, 7, 4, 0, 0, 138, 0, }, /* 881 */
+ { 138, 13, 12, 0, 0, 138, 0, }, /* 882 */
+ { 143, 7, 12, 0, 0, 143, 0, }, /* 883 */
+ { 143, 10, 5, 0, 0, 143, 0, }, /* 884 */
+ { 143, 12, 3, 0, 0, 143, 0, }, /* 885 */
+ { 143, 13, 12, 0, 0, 143, 0, }, /* 886 */
+ { 145, 7, 12, 0, 0, 145, 0, }, /* 887 */
+ { 145, 12, 3, 0, 0, 145, 0, }, /* 888 */
+ { 145, 10, 5, 0, 0, 145, 0, }, /* 889 */
+ { 145, 21, 12, 0, 0, 145, 0, }, /* 890 */
+ { 54, 15, 12, 0, 0, 54, 0, }, /* 891 */
+ { 54, 21, 12, 0, 0, 54, 0, }, /* 892 */
+ { 63, 7, 12, 0, 0, 63, 0, }, /* 893 */
+ { 63, 14, 12, 0, 0, 63, 0, }, /* 894 */
+ { 63, 21, 12, 0, 0, 63, 0, }, /* 895 */
+ { 80, 7, 12, 0, 0, 80, 0, }, /* 896 */
+ { 80, 1, 2, 0, 0, 80, 0, }, /* 897 */
+ { 127, 7, 12, 0, 0, 127, 0, }, /* 898 */
+ { 115, 7, 12, 0, 0, 115, 0, }, /* 899 */
+ { 115, 13, 12, 0, 0, 115, 0, }, /* 900 */
+ { 115, 21, 12, 0, 0, 115, 0, }, /* 901 */
+ { 103, 7, 12, 0, 0, 103, 0, }, /* 902 */
+ { 103, 12, 3, 0, 0, 103, 0, }, /* 903 */
+ { 103, 21, 12, 0, 0, 103, 0, }, /* 904 */
+ { 119, 7, 12, 0, 0, 119, 0, }, /* 905 */
+ { 119, 12, 3, 0, 0, 119, 0, }, /* 906 */
+ { 119, 21, 12, 0, 0, 119, 0, }, /* 907 */
+ { 119, 26, 12, 0, 0, 119, 0, }, /* 908 */
+ { 119, 6, 12, 0, 0, 119, 0, }, /* 909 */
+ { 119, 13, 12, 0, 0, 119, 0, }, /* 910 */
+ { 119, 15, 12, 0, 0, 119, 0, }, /* 911 */
+ { 146, 9, 12, 0, 32, 146, 0, }, /* 912 */
+ { 146, 5, 12, 0, -32, 146, 0, }, /* 913 */
+ { 146, 15, 12, 0, 0, 146, 0, }, /* 914 */
+ { 146, 21, 12, 0, 0, 146, 0, }, /* 915 */
+ { 99, 7, 12, 0, 0, 99, 0, }, /* 916 */
+ { 99, 12, 3, 0, 0, 99, 0, }, /* 917 */
+ { 99, 10, 5, 0, 0, 99, 0, }, /* 918 */
+ { 99, 6, 12, 0, 0, 99, 0, }, /* 919 */
+ { 137, 6, 12, 0, 0, 137, 0, }, /* 920 */
+ { 139, 6, 12, 0, 0, 139, 0, }, /* 921 */
+ { 137, 7, 12, 0, 0, 137, 0, }, /* 922 */
+ { 139, 7, 12, 0, 0, 139, 0, }, /* 923 */
+ { 105, 7, 12, 0, 0, 105, 0, }, /* 924 */
+ { 105, 26, 12, 0, 0, 105, 0, }, /* 925 */
+ { 105, 12, 3, 0, 0, 105, 0, }, /* 926 */
+ { 105, 21, 12, 0, 0, 105, 0, }, /* 927 */
+ { 10, 1, 2, 0, 0, 105, 0, }, /* 928 */
+ { 10, 10, 3, 0, 0, 10, 0, }, /* 929 */
+ { 10, 10, 5, 0, 0, 10, 0, }, /* 930 */
+ { 20, 12, 3, 0, 0, 20, 0, }, /* 931 */
+ { 131, 26, 12, 0, 0, 131, 0, }, /* 932 */
+ { 131, 12, 3, 0, 0, 131, 0, }, /* 933 */
+ { 131, 21, 12, 0, 0, 131, 0, }, /* 934 */
+ { 18, 12, 3, 0, 0, 18, 0, }, /* 935 */
+ { 151, 7, 12, 0, 0, 151, 0, }, /* 936 */
+ { 151, 12, 3, 0, 0, 151, 0, }, /* 937 */
+ { 151, 6, 12, 0, 0, 151, 0, }, /* 938 */
+ { 151, 13, 12, 0, 0, 151, 0, }, /* 939 */
+ { 151, 26, 12, 0, 0, 151, 0, }, /* 940 */
+ { 152, 7, 12, 0, 0, 152, 0, }, /* 941 */
+ { 152, 12, 3, 0, 0, 152, 0, }, /* 942 */
+ { 152, 13, 12, 0, 0, 152, 0, }, /* 943 */
+ { 152, 23, 12, 0, 0, 152, 0, }, /* 944 */
+ { 113, 7, 12, 0, 0, 113, 0, }, /* 945 */
+ { 113, 15, 12, 0, 0, 113, 0, }, /* 946 */
+ { 113, 12, 3, 0, 0, 113, 0, }, /* 947 */
+ { 132, 9, 12, 0, 34, 132, 0, }, /* 948 */
+ { 132, 5, 12, 0, -34, 132, 0, }, /* 949 */
+ { 132, 12, 3, 0, 0, 132, 0, }, /* 950 */
+ { 132, 6, 12, 0, 0, 132, 0, }, /* 951 */
+ { 132, 13, 12, 0, 0, 132, 0, }, /* 952 */
+ { 132, 21, 12, 0, 0, 132, 0, }, /* 953 */
+ { 0, 2, 14, 0, 0, 0, 0, }, /* 954 */
+ { 10, 26, 11, 0, 0, 10, 0, }, /* 955 */
+ { 27, 26, 12, 0, 0, 27, 0, }, /* 956 */
+ { 10, 24, 3, 0, 0, 10, 0, }, /* 957 */
+ { 10, 1, 3, 0, 0, 10, 0, }, /* 958 */
};
const uint16_t PRIV(ucd_stage1)[] = { /* 17408 bytes */
@@ -1150,37 +1185,37 @@ const uint16_t PRIV(ucd_stage1)[] = { /* 17408 bytes */
126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F000 */
126,126, 98, 98,127,128,129,130,131,131,132,133,134,135,136,137, /* U+F800 */
138,139,140,141,142,143,144,145,146,147,148,142,149,149,150,142, /* U+10000 */
-151,152,153,154,155,156,157,158,159,160,161,142,162,142,163,142, /* U+10800 */
-164,165,166,167,168,169,170,142,171,172,142,173,174,175,176,142, /* U+11000 */
-177,178,142,142,179,180,142,142,181,182,183,184,142,185,142,142, /* U+11800 */
-186,186,186,186,186,186,186,187,188,186,189,142,142,142,142,142, /* U+12000 */
+151,152,153,154,155,156,157,158,159,160,161,142,162,142,163,164, /* U+10800 */
+165,166,167,168,169,170,171,142,172,173,142,174,175,176,177,142, /* U+11000 */
+178,179,142,180,181,182,142,142,183,184,185,186,142,187,142,188, /* U+11800 */
+189,189,189,189,189,189,189,190,191,189,192,142,142,142,142,142, /* U+12000 */
142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+12800 */
-190,190,190,190,190,190,190,190,191,142,142,142,142,142,142,142, /* U+13000 */
+193,193,193,193,193,193,193,193,194,142,142,142,142,142,142,142, /* U+13000 */
142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+13800 */
-142,142,142,142,142,142,142,142,192,192,192,192,193,142,142,142, /* U+14000 */
+142,142,142,142,142,142,142,142,195,195,195,195,196,142,142,142, /* U+14000 */
142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+14800 */
142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+15000 */
142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+15800 */
142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+16000 */
-194,194,194,194,195,196,197,198,142,142,142,142,199,200,201,202, /* U+16800 */
-203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203, /* U+17000 */
-203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203, /* U+17800 */
-203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,204, /* U+18000 */
-203,203,203,203,203,205,142,142,142,142,142,142,142,142,142,142, /* U+18800 */
+197,197,197,197,198,199,200,201,142,142,142,142,202,203,204,205, /* U+16800 */
+206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206, /* U+17000 */
+206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206, /* U+17800 */
+206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,207, /* U+18000 */
+206,206,206,206,206,208,142,142,142,142,142,142,142,142,142,142, /* U+18800 */
142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+19000 */
142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+19800 */
142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+1A000 */
142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+1A800 */
-206,207,208,209,209,210,142,142,142,142,142,142,142,142,142,142, /* U+1B000 */
-142,142,142,142,142,142,142,142,211,212,142,142,142,142,142,142, /* U+1B800 */
+209,210,211,212,212,213,142,142,142,142,142,142,142,142,142,142, /* U+1B000 */
+142,142,142,142,142,142,142,142,214,215,142,142,142,142,142,142, /* U+1B800 */
142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+1C000 */
142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+1C800 */
- 71,213,214,215,216,217,218,142,219,220,221,222,223,224,225,226, /* U+1D000 */
-227,227,227,227,228,229,142,142,142,142,142,142,142,142,142,142, /* U+1D800 */
-230,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+1E000 */
-231,232,233,142,142,142,142,142,234,235,142,142,236,237,142,142, /* U+1E800 */
-238,239,240,241,242,243,244,245,244,244,246,244,247,248,249,250, /* U+1F000 */
-251,252,253,254,255,243,243,243,243,243,243,243,243,243,243,256, /* U+1F800 */
+ 71,216,217,218,219,220,221,142,222,223,224,225,226,227,228,229, /* U+1D000 */
+230,230,230,230,231,232,142,142,142,142,142,142,142,142,142,142, /* U+1D800 */
+233,142,234,142,142,235,142,142,142,142,142,142,142,142,142,142, /* U+1E000 */
+236,237,238,142,142,142,142,142,239,240,241,142,242,243,142,142, /* U+1E800 */
+244,245,246,247,248,249,250,251,250,250,252,250,253,254,255,256, /* U+1F000 */
+257,258,259,260,261,262,249,249,249,249,249,249,249,249,249,263, /* U+1F800 */
98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+20000 */
98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+20800 */
98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+21000 */
@@ -1201,18 +1236,18 @@ const uint16_t PRIV(ucd_stage1)[] = { /* 17408 bytes */
98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+28800 */
98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+29000 */
98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+29800 */
- 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,257, 98, 98, /* U+2A000 */
+ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,264, 98, 98, /* U+2A000 */
98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+2A800 */
- 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,258, 98, /* U+2B000 */
-259, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+2B800 */
+ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,265, 98, /* U+2B000 */
+266, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+2B800 */
98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+2C000 */
- 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,260, 98, 98, /* U+2C800 */
+ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,267, 98, 98, /* U+2C800 */
98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+2D000 */
98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+2D800 */
98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+2E000 */
- 98, 98, 98, 98, 98, 98, 98,261,142,142,142,142,142,142,142,142, /* U+2E800 */
+ 98, 98, 98, 98, 98, 98, 98,268,142,142,142,142,142,142,142,142, /* U+2E800 */
142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+2F000 */
- 98, 98, 98, 98,262,142,142,142,142,142,142,142,142,142,142,142, /* U+2F800 */
+ 98, 98, 98, 98,269,142,142,142,142,142,142,142,142,142,142,142, /* U+2F800 */
142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+30000 */
142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+30800 */
142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+31000 */
@@ -1565,8 +1600,8 @@ const uint16_t PRIV(ucd_stage1)[] = { /* 17408 bytes */
142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DE800 */
142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DF000 */
142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DF800 */
-263,264,265,266,264,264,264,264,264,264,264,264,264,264,264,264, /* U+E0000 */
-264,264,264,264,264,264,264,264,264,264,264,264,264,264,264,264, /* U+E0800 */
+270,271,272,273,271,271,271,271,271,271,271,271,271,271,271,271, /* U+E0000 */
+271,271,271,271,271,271,271,271,271,271,271,271,271,271,271,271, /* U+E0800 */
142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E1000 */
142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E1800 */
142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E2000 */
@@ -1628,7 +1663,7 @@ const uint16_t PRIV(ucd_stage1)[] = { /* 17408 bytes */
126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+FE000 */
126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+FE800 */
126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+FF000 */
-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,267, /* U+FF800 */
+126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,274, /* U+FF800 */
126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+100000 */
126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+100800 */
126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+101000 */
@@ -1660,10 +1695,10 @@ const uint16_t PRIV(ucd_stage1)[] = { /* 17408 bytes */
126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+10E000 */
126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+10E800 */
126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+10F000 */
-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,267, /* U+10F800 */
+126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,274, /* U+10F800 */
};
-const uint16_t PRIV(ucd_stage2)[] = { /* 68608 bytes, block = 128 */
+const uint16_t PRIV(ucd_stage2)[] = { /* 70400 bytes, block = 128 */
/* block 0 */
0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 3, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -1715,534 +1750,534 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 68608 bytes, block = 128 */
35, 97, 98, 35, 35, 99, 35, 35, 35, 35, 35, 35, 35,100, 35, 35,
/* block 5 */
-101, 35, 35,101, 35, 35, 35,102,101,103,104,104,105, 35, 35, 35,
- 35, 35,106, 35, 22, 35, 35, 35, 35, 35, 35, 35, 35,107,108, 35,
+101, 35,102,101, 35, 35, 35,103,101,104,105,105,106, 35, 35, 35,
+ 35, 35,107, 35, 22, 35, 35, 35, 35, 35, 35, 35, 35,108,109, 35,
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-109,109,109,109,109,109,109,109,109,110,110,110,110,110,110,110,
-110,110, 15, 15, 15, 15,110,110,110,110,110,110,110,110,110,110,
-110,110, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-109,109,109,109,109, 15, 15, 15, 15, 15,111,111,110, 15,110, 15,
+110,110,110,110,110,110,110,110,110,111,111,111,111,111,111,111,
+111,111, 15, 15, 15, 15,111,111,111,111,111,111,111,111,111,111,
+111,111, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+110,110,110,110,110, 15, 15, 15, 15, 15,112,112,111, 15,111, 15,
15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
/* block 6 */
-112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,
-112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,
-112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,
-112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,
-112,112,113,112,112,114,112,112,112,112,112,112,112,112,112,112,
-112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,
-112,112,112,115,115,115,115,115,115,115,115,115,115,115,115,115,
-116,117,116,117,110,118,116,117,119,119,120,121,121,121, 5,122,
+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,
+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,
+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,
+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,
+113,113,114,113,113,115,113,113,113,113,113,113,113,113,113,113,
+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,
+113,113,113,116,116,116,116,116,116,116,116,116,116,116,116,116,
+117,118,117,118,111,119,117,118,120,120,121,122,122,122, 5,123,
/* block 7 */
-119,119,119,119,118, 15,123, 5,124,124,124,119,125,119,126,126,
-127,128,129,128,128,130,128,128,131,132,133,128,134,128,128,128,
-135,136,119,137,128,128,138,128,128,139,128,128,140,141,141,141,
-127,142,143,142,142,144,142,142,145,146,147,142,148,142,142,142,
-149,150,151,152,142,142,153,142,142,154,142,142,155,156,156,157,
-158,159,160,160,160,161,162,163,116,117,116,117,116,117,116,117,
-116,117,164,165,164,165,164,165,164,165,164,165,164,165,164,165,
-166,167,168,169,170,171,172,116,117,173,116,117,127,174,174,174,
+120,120,120,120,119, 15,124, 5,125,125,125,120,126,120,127,127,
+128,129,130,129,129,131,129,129,132,133,134,129,135,129,129,129,
+136,137,120,138,129,129,139,129,129,140,129,129,141,142,142,142,
+128,143,144,143,143,145,143,143,146,147,148,143,149,143,143,143,
+150,151,152,153,143,143,154,143,143,155,143,143,156,157,157,158,
+159,160,161,161,161,162,163,164,117,118,117,118,117,118,117,118,
+117,118,165,166,165,166,165,166,165,166,165,166,165,166,165,166,
+167,168,169,170,171,172,173,117,118,174,117,118,128,175,175,175,
/* block 8 */
-175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,
-176,176,177,176,178,176,176,176,176,176,176,176,176,176,179,176,
-176,180,181,176,176,176,176,176,176,176,182,176,176,176,176,176,
-183,183,184,183,185,183,183,183,183,183,183,183,183,183,186,183,
-183,187,188,183,183,183,183,183,183,183,189,183,183,183,183,183,
-190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,
-191,192,193,194,191,192,191,192,191,192,191,192,191,192,191,192,
-191,192,191,192,191,192,191,192,191,192,191,192,191,192,191,192,
+176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,
+177,177,178,177,179,177,177,177,177,177,177,177,177,177,180,177,
+177,181,182,177,177,177,177,177,177,177,183,177,177,177,177,177,
+184,184,185,184,186,184,184,184,184,184,184,184,184,184,187,184,
+184,188,189,184,184,184,184,184,184,184,190,184,184,184,184,184,
+191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,
+192,193,194,195,192,193,192,193,192,193,192,193,192,193,192,193,
+192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193,
/* block 9 */
-191,192,195,196,197,198,198,197,199,199,191,192,191,192,191,192,
-191,192,191,192,191,192,191,192,191,192,191,192,191,192,191,192,
-191,192,191,192,191,192,191,192,191,192,191,192,191,192,191,192,
-191,192,191,192,191,192,191,192,191,192,191,192,191,192,191,192,
-200,191,192,191,192,191,192,191,192,191,192,191,192,191,192,201,
-191,192,191,192,191,192,191,192,191,192,191,192,191,192,191,192,
-191,192,191,192,191,192,191,192,191,192,191,192,191,192,191,192,
-191,192,191,192,191,192,191,192,191,192,191,192,191,192,191,192,
+192,193,196,197,198,199,199,198,200,200,192,193,192,193,192,193,
+192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193,
+192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193,
+192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193,
+201,192,193,192,193,192,193,192,193,192,193,192,193,192,193,202,
+192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193,
+192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193,
+192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193,
/* block 10 */
-191,192,191,192,191,192,191,192,191,192,191,192,191,192,191,192,
-191,192,191,192,191,192,191,192,191,192,191,192,191,192,191,192,
-191,192,191,192,191,192,191,192,191,192,191,192,191,192,191,192,
-119,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,
-202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,
-202,202,202,202,202,202,202,119,119,203,204,204,204,204,204,204,
-205,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,
-206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,
+192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193,
+192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193,
+192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193,
+120,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,
+203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,
+203,203,203,203,203,203,203,120,120,204,205,205,205,205,205,205,
+206,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,
+207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,
/* block 11 */
-206,206,206,206,206,206,206,205,205,207,208,119,119,209,209,210,
-119,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,
-211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,
-211,211,211,211,211,211,211,211,211,211,211,211,211,211,212,211,
-213,211,211,213,211,211,213,211,119,119,119,119,119,119,119,119,
-214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,
-214,214,214,214,214,214,214,214,214,214,214,119,119,119,119,214,
-214,214,214,213,213,119,119,119,119,119,119,119,119,119,119,119,
+207,207,207,207,207,207,207,206,206,208,209,120,120,210,210,211,
+120,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,
+212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,
+212,212,212,212,212,212,212,212,212,212,212,212,212,212,213,212,
+214,212,212,214,212,212,214,212,120,120,120,120,120,120,120,120,
+215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+215,215,215,215,215,215,215,215,215,215,215,120,120,120,120,215,
+215,215,215,214,214,120,120,120,120,120,120,120,120,120,120,120,
/* block 12 */
-215,215,215,215,215,216,217,217,217,218,218,219,220,218,221,221,
-222,222,222,222,222,222,222,222,222,222,222,220,223,119,218,220,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-225,224,224,224,224,224,224,224,224,224,224,226,226,226,226,226,
-226,226,226,226,226,226,222,222,222,222,222,222,222,222,222,222,
-227,227,227,227,227,227,227,227,227,227,218,218,218,218,224,224,
-226,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
+216,216,216,216,216,217,218,218,218,219,219,220,221,219,222,222,
+223,223,223,223,223,223,223,223,223,223,223,221,224,120,219,221,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+226,225,225,225,225,225,225,225,225,225,225,227,227,227,227,227,
+227,227,227,227,227,227,223,223,223,223,223,223,223,223,223,223,
+228,228,228,228,228,228,228,228,228,228,219,219,219,219,225,225,
+227,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
/* block 13 */
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,228,224,222,222,222,222,222,222,222,216,221,222,
-222,222,222,222,222,229,229,222,222,221,222,222,222,222,224,224,
-230,230,230,230,230,230,230,230,230,230,224,224,224,221,221,224,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,229,225,223,223,223,223,223,223,223,217,222,223,
+223,223,223,223,223,230,230,223,223,222,223,223,223,223,225,225,
+231,231,231,231,231,231,231,231,231,231,225,225,225,222,222,225,
/* block 14 */
-231,231,231,231,231,231,231,231,231,231,231,231,231,231,119,232,
-233,234,233,233,233,233,233,233,233,233,233,233,233,233,233,233,
-233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,
+232,232,232,232,232,232,232,232,232,232,232,232,232,232,120,233,
+234,235,234,234,234,234,234,234,234,234,234,234,234,234,234,234,
234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,
-234,234,234,234,234,234,234,234,234,234,234,119,119,233,233,233,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
+235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,
+235,235,235,235,235,235,235,235,235,235,235,120,120,234,234,234,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
/* block 15 */
-235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,
-235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,
-235,235,235,235,235,235,236,236,236,236,236,236,236,236,236,236,
-236,235,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-237,237,237,237,237,237,237,237,237,237,238,238,238,238,238,238,
-238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,
-238,238,238,238,238,238,238,238,238,238,238,239,239,239,239,239,
-239,239,239,239,240,240,241,242,242,242,240,119,119,239,243,243,
+236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,
+236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,
+236,236,236,236,236,236,237,237,237,237,237,237,237,237,237,237,
+237,236,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+238,238,238,238,238,238,238,238,238,238,239,239,239,239,239,239,
+239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,
+239,239,239,239,239,239,239,239,239,239,239,240,240,240,240,240,
+240,240,240,240,241,241,242,243,243,243,241,120,120,240,244,244,
/* block 16 */
-244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,
-244,244,244,244,244,244,245,245,245,245,246,245,245,245,245,245,
-245,245,245,245,246,245,245,245,246,245,245,245,245,245,119,119,
-247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,119,
-248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,
-248,248,248,248,248,248,248,248,248,249,249,249,119,119,250,119,
-233,233,233,233,233,233,233,233,233,233,233,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,
+245,245,245,245,245,245,246,246,246,246,247,246,246,246,246,246,
+246,246,246,246,247,246,246,246,247,246,246,246,246,246,120,120,
+248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,120,
+249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,
+249,249,249,249,249,249,249,249,249,250,250,250,120,120,251,120,
+234,234,234,234,234,234,234,234,234,234,234,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
/* block 17 */
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,119,224,224,224,224,224,224,224,224,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,222,222,222,222,222,222,222,222,222,222,222,222,222,
-222,222,216,222,222,222,222,222,222,222,222,222,222,222,222,222,
-222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,120,225,225,225,225,225,225,225,225,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,223,223,223,223,223,223,223,223,223,223,223,223,223,
+223,223,217,223,223,223,223,223,223,223,223,223,223,223,223,223,
+223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,
/* block 18 */
-251,251,251,252,253,253,253,253,253,253,253,253,253,253,253,253,
-253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,
-253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,
-253,253,253,253,253,253,253,253,253,253,251,252,251,253,252,252,
-252,251,251,251,251,251,251,251,251,252,252,252,252,251,252,252,
-253,254,255,251,251,251,251,251,253,253,253,253,253,253,253,253,
-253,253,251,251,256,257,258,258,258,258,258,258,258,258,258,258,
-259,260,253,253,253,253,253,253,253,253,253,253,253,253,253,253,
+252,252,252,253,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,252,253,252,254,253,253,
+253,252,252,252,252,252,252,252,252,253,253,253,253,252,253,253,
+254,255,256,113,113,252,252,252,254,254,254,254,254,254,254,254,
+254,254,252,252,257,258,259,259,259,259,259,259,259,259,259,259,
+260,261,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
/* block 19 */
-261,262,263,263,119,261,261,261,261,261,261,261,261,119,119,261,
-261,119,119,261,261,261,261,261,261,261,261,261,261,261,261,261,
-261,261,261,261,261,261,261,261,261,119,261,261,261,261,261,261,
-261,119,261,119,119,119,261,261,261,261,119,119,262,261,264,263,
-263,262,262,262,262,119,119,263,263,119,119,263,263,262,261,119,
-119,119,119,119,119,119,119,264,119,119,119,119,261,261,119,261,
-261,261,262,262,119,119,265,265,265,265,265,265,265,265,265,265,
-261,261,266,266,267,267,267,267,267,267,268,266,261,269,262,119,
+262,263,264,264,120,262,262,262,262,262,262,262,262,120,120,262,
+262,120,120,262,262,262,262,262,262,262,262,262,262,262,262,262,
+262,262,262,262,262,262,262,262,262,120,262,262,262,262,262,262,
+262,120,262,120,120,120,262,262,262,262,120,120,263,262,265,264,
+264,263,263,263,263,120,120,264,264,120,120,264,264,263,262,120,
+120,120,120,120,120,120,120,265,120,120,120,120,262,262,120,262,
+262,262,263,263,120,120,266,266,266,266,266,266,266,266,266,266,
+262,262,267,267,268,268,268,268,268,268,269,267,262,270,263,120,
/* block 20 */
-119,270,270,271,119,272,272,272,272,272,272,119,119,119,119,272,
-272,119,119,272,272,272,272,272,272,272,272,272,272,272,272,272,
-272,272,272,272,272,272,272,272,272,119,272,272,272,272,272,272,
-272,119,272,272,119,272,272,119,272,272,119,119,270,119,271,271,
-271,270,270,119,119,119,119,270,270,119,119,270,270,270,119,119,
-119,270,119,119,119,119,119,119,119,272,272,272,272,119,272,119,
-119,119,119,119,119,119,273,273,273,273,273,273,273,273,273,273,
-270,270,272,272,272,270,274,119,119,119,119,119,119,119,119,119,
+120,271,271,272,120,273,273,273,273,273,273,120,120,120,120,273,
+273,120,120,273,273,273,273,273,273,273,273,273,273,273,273,273,
+273,273,273,273,273,273,273,273,273,120,273,273,273,273,273,273,
+273,120,273,273,120,273,273,120,273,273,120,120,271,120,272,272,
+272,271,271,120,120,120,120,271,271,120,120,271,271,271,120,120,
+120,271,120,120,120,120,120,120,120,273,273,273,273,120,273,120,
+120,120,120,120,120,120,274,274,274,274,274,274,274,274,274,274,
+271,271,273,273,273,271,275,120,120,120,120,120,120,120,120,120,
/* block 21 */
-119,275,275,276,119,277,277,277,277,277,277,277,277,277,119,277,
-277,277,119,277,277,277,277,277,277,277,277,277,277,277,277,277,
-277,277,277,277,277,277,277,277,277,119,277,277,277,277,277,277,
-277,119,277,277,119,277,277,277,277,277,119,119,275,277,276,276,
-276,275,275,275,275,275,119,275,275,276,119,276,276,275,119,119,
-277,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-277,277,275,275,119,119,278,278,278,278,278,278,278,278,278,278,
-279,280,119,119,119,119,119,119,119,277,275,275,275,275,275,275,
+120,276,276,277,120,278,278,278,278,278,278,278,278,278,120,278,
+278,278,120,278,278,278,278,278,278,278,278,278,278,278,278,278,
+278,278,278,278,278,278,278,278,278,120,278,278,278,278,278,278,
+278,120,278,278,120,278,278,278,278,278,120,120,276,278,277,277,
+277,276,276,276,276,276,120,276,276,277,120,277,277,276,120,120,
+278,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+278,278,276,276,120,120,279,279,279,279,279,279,279,279,279,279,
+280,281,120,120,120,120,120,120,120,278,276,276,276,276,276,276,
/* block 22 */
-119,281,282,282,119,283,283,283,283,283,283,283,283,119,119,283,
-283,119,119,283,283,283,283,283,283,283,283,283,283,283,283,283,
-283,283,283,283,283,283,283,283,283,119,283,283,283,283,283,283,
-283,119,283,283,119,283,283,283,283,283,119,119,281,283,284,281,
-282,281,281,281,281,119,119,282,282,119,119,282,282,281,119,119,
-119,119,119,119,119,119,281,284,119,119,119,119,283,283,119,283,
-283,283,281,281,119,119,285,285,285,285,285,285,285,285,285,285,
-286,283,287,287,287,287,287,287,119,119,119,119,119,119,119,119,
+120,282,283,283,120,284,284,284,284,284,284,284,284,120,120,284,
+284,120,120,284,284,284,284,284,284,284,284,284,284,284,284,284,
+284,284,284,284,284,284,284,284,284,120,284,284,284,284,284,284,
+284,120,284,284,120,284,284,284,284,284,120,120,282,284,285,282,
+283,282,282,282,282,120,120,283,283,120,120,283,283,282,120,120,
+120,120,120,120,120,120,282,285,120,120,120,120,284,284,120,284,
+284,284,282,282,120,120,286,286,286,286,286,286,286,286,286,286,
+287,284,288,288,288,288,288,288,120,120,120,120,120,120,120,120,
/* block 23 */
-119,119,288,289,119,289,289,289,289,289,289,119,119,119,289,289,
-289,119,289,289,289,289,119,119,119,289,289,119,289,119,289,289,
-119,119,119,289,289,119,119,119,289,289,289,119,119,119,289,289,
-289,289,289,289,289,289,289,289,289,289,119,119,119,119,290,291,
-288,291,291,119,119,119,291,291,291,119,291,291,291,288,119,119,
-289,119,119,119,119,119,119,290,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,292,292,292,292,292,292,292,292,292,292,
-293,293,293,294,295,295,295,295,295,296,295,119,119,119,119,119,
+120,120,289,290,120,290,290,290,290,290,290,120,120,120,290,290,
+290,120,290,290,290,290,120,120,120,290,290,120,290,120,290,290,
+120,120,120,290,290,120,120,120,290,290,290,120,120,120,290,290,
+290,290,290,290,290,290,290,290,290,290,120,120,120,120,291,292,
+289,292,292,120,120,120,292,292,292,120,292,292,292,289,120,120,
+290,120,120,120,120,120,120,291,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,293,293,293,293,293,293,293,293,293,293,
+294,294,294,295,296,296,296,296,296,297,296,120,120,120,120,120,
/* block 24 */
-297,298,298,298,297,299,299,299,299,299,299,299,299,119,299,299,
-299,119,299,299,299,299,299,299,299,299,299,299,299,299,299,299,
-299,299,299,299,299,299,299,299,299,119,299,299,299,299,299,299,
-299,299,299,299,299,299,299,299,299,299,119,119,119,299,297,297,
-297,298,298,298,298,119,297,297,297,119,297,297,297,297,119,119,
-119,119,119,119,119,297,297,119,299,299,299,119,119,119,119,119,
-299,299,297,297,119,119,300,300,300,300,300,300,300,300,300,300,
-119,119,119,119,119,119,119,119,301,301,301,301,301,301,301,302,
+298,299,299,299,298,300,300,300,300,300,300,300,300,120,300,300,
+300,120,300,300,300,300,300,300,300,300,300,300,300,300,300,300,
+300,300,300,300,300,300,300,300,300,120,300,300,300,300,300,300,
+300,300,300,300,300,300,300,300,300,300,120,120,120,300,298,298,
+298,299,299,299,299,120,298,298,298,120,298,298,298,298,120,120,
+120,120,120,120,120,298,298,120,300,300,300,120,120,120,120,120,
+300,300,298,298,120,120,301,301,301,301,301,301,301,301,301,301,
+120,120,120,120,120,120,120,302,303,303,303,303,303,303,303,304,
/* block 25 */
-303,304,305,305,306,303,303,303,303,303,303,303,303,119,303,303,
-303,119,303,303,303,303,303,303,303,303,303,303,303,303,303,303,
-303,303,303,303,303,303,303,303,303,119,303,303,303,303,303,303,
-303,303,303,303,119,303,303,303,303,303,119,119,304,303,305,304,
-305,305,307,305,305,119,304,305,305,119,305,305,304,304,119,119,
-119,119,119,119,119,307,307,119,119,119,119,119,119,119,303,119,
-303,303,304,304,119,119,308,308,308,308,308,308,308,308,308,308,
-119,303,303,119,119,119,119,119,119,119,119,119,119,119,119,119,
+305,306,307,307,308,305,305,305,305,305,305,305,305,120,305,305,
+305,120,305,305,305,305,305,305,305,305,305,305,305,305,305,305,
+305,305,305,305,305,305,305,305,305,120,305,305,305,305,305,305,
+305,305,305,305,120,305,305,305,305,305,120,120,306,305,307,306,
+307,307,309,307,307,120,306,307,307,120,307,307,306,306,120,120,
+120,120,120,120,120,309,309,120,120,120,120,120,120,120,305,120,
+305,305,306,306,120,120,310,310,310,310,310,310,310,310,310,310,
+120,305,305,120,120,120,120,120,120,120,120,120,120,120,120,120,
/* block 26 */
-309,309,310,310,119,311,311,311,311,311,311,311,311,119,311,311,
-311,119,311,311,311,311,311,311,311,311,311,311,311,311,311,311,
-311,311,311,311,311,311,311,311,311,311,311,311,311,311,311,311,
-311,311,311,311,311,311,311,311,311,311,311,309,309,311,312,310,
-310,309,309,309,309,119,310,310,310,119,310,310,310,309,313,314,
-119,119,119,119,311,311,311,312,315,315,315,315,315,315,315,311,
-311,311,309,309,119,119,316,316,316,316,316,316,316,316,316,316,
-315,315,315,315,315,315,315,315,315,314,311,311,311,311,311,311,
+311,311,312,312,120,313,313,313,313,313,313,313,313,120,313,313,
+313,120,313,313,313,313,313,313,313,313,313,313,313,313,313,313,
+313,313,313,313,313,313,313,313,313,313,313,313,313,313,313,313,
+313,313,313,313,313,313,313,313,313,313,313,311,311,313,314,312,
+312,311,311,311,311,120,312,312,312,120,312,312,312,311,315,316,
+120,120,120,120,313,313,313,314,317,317,317,317,317,317,317,313,
+313,313,311,311,120,120,318,318,318,318,318,318,318,318,318,318,
+317,317,317,317,317,317,317,317,317,316,313,313,313,313,313,313,
/* block 27 */
-119,119,317,317,119,318,318,318,318,318,318,318,318,318,318,318,
-318,318,318,318,318,318,318,119,119,119,318,318,318,318,318,318,
-318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,
-318,318,119,318,318,318,318,318,318,318,318,318,119,318,119,119,
-318,318,318,318,318,318,318,119,119,119,319,119,119,119,119,320,
-317,317,319,319,319,119,319,119,317,317,317,317,317,317,317,320,
-119,119,119,119,119,119,321,321,321,321,321,321,321,321,321,321,
-119,119,317,317,322,119,119,119,119,119,119,119,119,119,119,119,
+120,120,319,319,120,320,320,320,320,320,320,320,320,320,320,320,
+320,320,320,320,320,320,320,120,120,120,320,320,320,320,320,320,
+320,320,320,320,320,320,320,320,320,320,320,320,320,320,320,320,
+320,320,120,320,320,320,320,320,320,320,320,320,120,320,120,120,
+320,320,320,320,320,320,320,120,120,120,321,120,120,120,120,322,
+319,319,321,321,321,120,321,120,319,319,319,319,319,319,319,322,
+120,120,120,120,120,120,323,323,323,323,323,323,323,323,323,323,
+120,120,319,319,324,120,120,120,120,120,120,120,120,120,120,120,
/* block 28 */
-119,323,323,323,323,323,323,323,323,323,323,323,323,323,323,323,
-323,323,323,323,323,323,323,323,323,323,323,323,323,323,323,323,
-323,323,323,323,323,323,323,323,323,323,323,323,323,323,323,323,
-323,324,323,325,324,324,324,324,324,324,324,119,119,119,119, 6,
-323,323,323,323,323,323,326,324,324,324,324,324,324,324,324,327,
-328,328,328,328,328,328,328,328,328,328,327,327,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+120,325,325,325,325,325,325,325,325,325,325,325,325,325,325,325,
+325,325,325,325,325,325,325,325,325,325,325,325,325,325,325,325,
+325,325,325,325,325,325,325,325,325,325,325,325,325,325,325,325,
+325,326,325,327,326,326,326,326,326,326,326,120,120,120,120, 6,
+325,325,325,325,325,325,328,326,326,326,326,326,326,326,326,329,
+330,330,330,330,330,330,330,330,330,330,329,329,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
/* block 29 */
-119,329,329,119,329,119,119,329,329,119,329,119,119,329,119,119,
-119,119,119,119,329,329,329,329,119,329,329,329,329,329,329,329,
-119,329,329,329,119,329,119,329,119,119,329,329,119,329,329,329,
-329,330,329,331,330,330,330,330,330,330,119,330,330,329,119,119,
-329,329,329,329,329,119,332,119,330,330,330,330,330,330,119,119,
-333,333,333,333,333,333,333,333,333,333,119,119,329,329,329,329,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+120,331,331,120,331,120,331,331,331,331,331,120,331,331,331,331,
+331,331,331,331,331,331,331,331,331,331,331,331,331,331,331,331,
+331,331,331,331,120,331,120,331,331,331,331,331,331,331,331,331,
+331,332,331,333,332,332,332,332,332,332,332,332,332,331,120,120,
+331,331,331,331,331,120,334,120,332,332,332,332,332,332,120,120,
+335,335,335,335,335,335,335,335,335,335,120,120,331,331,331,331,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
/* block 30 */
-334,335,335,335,336,336,336,336,336,336,336,336,336,336,336,336,
-336,336,336,335,336,335,335,335,337,337,335,335,335,335,335,335,
-338,338,338,338,338,338,338,338,338,338,339,339,339,339,339,339,
-339,339,339,339,335,337,335,337,335,337,340,341,340,341,342,342,
-334,334,334,334,334,334,334,334,119,334,334,334,334,334,334,334,
-334,334,334,334,334,334,334,334,334,334,334,334,334,334,334,334,
-334,334,334,334,334,334,334,334,334,334,334,334,334,119,119,119,
-119,337,337,337,337,337,337,337,337,337,337,337,337,337,337,342,
+336,337,337,337,338,338,338,338,338,338,338,338,338,338,338,338,
+338,338,338,337,338,337,337,337,339,339,337,337,337,337,337,337,
+340,340,340,340,340,340,340,340,340,340,341,341,341,341,341,341,
+341,341,341,341,337,339,337,339,337,339,342,343,342,343,344,344,
+336,336,336,336,336,336,336,336,120,336,336,336,336,336,336,336,
+336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,
+336,336,336,336,336,336,336,336,336,336,336,336,336,120,120,120,
+120,339,339,339,339,339,339,339,339,339,339,339,339,339,339,344,
/* block 31 */
-337,337,337,337,337,336,337,337,334,334,334,334,334,337,337,337,
-337,337,337,337,337,337,337,337,119,337,337,337,337,337,337,337,
-337,337,337,337,337,337,337,337,337,337,337,337,337,337,337,337,
-337,337,337,337,337,337,337,337,337,337,337,337,337,119,335,335,
-335,335,335,335,335,335,337,335,335,335,335,335,335,119,335,335,
-336,336,336,336,336, 20, 20, 20, 20,336,336,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+339,339,339,339,339,338,339,339,336,336,336,336,336,339,339,339,
+339,339,339,339,339,339,339,339,120,339,339,339,339,339,339,339,
+339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,
+339,339,339,339,339,339,339,339,339,339,339,339,339,120,337,337,
+337,337,337,337,337,337,339,337,337,337,337,337,337,120,337,337,
+338,338,338,338,338, 20, 20, 20, 20,338,338,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
/* block 32 */
-343,343,343,343,343,343,343,343,343,343,343,343,343,343,343,343,
-343,343,343,343,343,343,343,343,343,343,343,343,343,343,343,343,
-343,343,343,343,343,343,343,343,343,343,343,344,344,345,345,345,
-345,346,345,345,345,345,345,345,344,345,345,346,346,345,345,343,
-347,347,347,347,347,347,347,347,347,347,348,348,348,348,348,348,
-343,343,343,343,343,343,346,346,345,345,343,343,343,343,345,345,
-345,343,344,344,344,343,343,344,344,344,344,344,344,344,343,343,
-343,345,345,345,345,343,343,343,343,343,343,343,343,343,343,343,
+345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,
+345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,
+345,345,345,345,345,345,345,345,345,345,345,346,346,347,347,347,
+347,348,347,347,347,347,347,347,346,347,347,348,348,347,347,345,
+349,349,349,349,349,349,349,349,349,349,350,350,350,350,350,350,
+345,345,345,345,345,345,348,348,347,347,345,345,345,345,347,347,
+347,345,346,346,346,345,345,346,346,346,346,346,346,346,345,345,
+345,347,347,347,347,345,345,345,345,345,345,345,345,345,345,345,
/* block 33 */
-343,343,345,344,346,345,345,344,344,344,344,344,344,345,343,344,
-349,349,349,349,349,349,349,349,349,349,344,344,344,345,350,350,
-351,351,351,351,351,351,351,351,351,351,351,351,351,351,351,351,
-351,351,351,351,351,351,351,351,351,351,351,351,351,351,351,351,
-351,351,351,351,351,351,119,351,119,119,119,119,119,351,119,119,
-352,352,352,352,352,352,352,352,352,352,352,352,352,352,352,352,
-352,352,352,352,352,352,352,352,352,352,352,352,352,352,352,352,
-352,352,352,352,352,352,352,352,352,352,352,353,354,352,352,352,
+345,345,347,346,348,347,347,346,346,346,346,346,346,347,345,346,
+351,351,351,351,351,351,351,351,351,351,346,346,346,347,352,352,
+353,353,353,353,353,353,353,353,353,353,353,353,353,353,353,353,
+353,353,353,353,353,353,353,353,353,353,353,353,353,353,353,353,
+353,353,353,353,353,353,120,353,120,120,120,120,120,353,120,120,
+354,354,354,354,354,354,354,354,354,354,354,354,354,354,354,354,
+354,354,354,354,354,354,354,354,354,354,354,354,354,354,354,354,
+354,354,354,354,354,354,354,354,354,354,354,355,356,354,354,354,
/* block 34 */
-355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,
-355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,
-355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,
-355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,
-355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,
-355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,
-356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,
-356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,
-
-/* block 35 */
-356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,
-356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,
-356,356,356,356,356,356,356,356,357,357,357,357,357,357,357,357,
357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,
357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,
357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,
357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,
357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,
-
-/* block 36 */
-358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,
-358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,
+357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,
358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,
358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,
-358,358,358,358,358,358,358,358,358,119,358,358,358,358,119,119,
-358,358,358,358,358,358,358,119,358,119,358,358,358,358,119,119,
+
+/* block 35 */
358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,
358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,
+358,358,358,358,358,358,358,358,359,359,359,359,359,359,359,359,
+359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,
+359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,
+359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,
+359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,
+359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,
+
+/* block 36 */
+360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,
+360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,
+360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,
+360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,
+360,360,360,360,360,360,360,360,360,120,360,360,360,360,120,120,
+360,360,360,360,360,360,360,120,360,120,360,360,360,360,120,120,
+360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,
+360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,
/* block 37 */
-358,358,358,358,358,358,358,358,358,119,358,358,358,358,119,119,
-358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,
-358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,
-358,119,358,358,358,358,119,119,358,358,358,358,358,358,358,119,
-358,119,358,358,358,358,119,119,358,358,358,358,358,358,358,358,
-358,358,358,358,358,358,358,119,358,358,358,358,358,358,358,358,
-358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,
-358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,
+360,360,360,360,360,360,360,360,360,120,360,360,360,360,120,120,
+360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,
+360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,
+360,120,360,360,360,360,120,120,360,360,360,360,360,360,360,120,
+360,120,360,360,360,360,120,120,360,360,360,360,360,360,360,360,
+360,360,360,360,360,360,360,120,360,360,360,360,360,360,360,360,
+360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,
+360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,
/* block 38 */
-358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,
-358,119,358,358,358,358,119,119,358,358,358,358,358,358,358,358,
-358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,
-358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,
-358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,
-358,358,358,358,358,358,358,358,358,358,358,119,119,359,359,359,
-360,360,360,360,360,360,360,360,360,361,361,361,361,361,361,361,
-361,361,361,361,361,361,361,361,361,361,361,361,361,119,119,119,
+360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,
+360,120,360,360,360,360,120,120,360,360,360,360,360,360,360,360,
+360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,
+360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,
+360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,
+360,360,360,360,360,360,360,360,360,360,360,120,120,361,361,361,
+362,362,362,362,362,362,362,362,362,363,363,363,363,363,363,363,
+363,363,363,363,363,363,363,363,363,363,363,363,363,120,120,120,
/* block 39 */
-358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,
-362,362,362,362,362,362,362,362,362,362,119,119,119,119,119,119,
-363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,
-363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,
-363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,
-363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,
-363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,
-364,364,364,364,364,364,119,119,365,365,365,365,365,365,119,119,
+360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,
+364,364,364,364,364,364,364,364,364,364,120,120,120,120,120,120,
+365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,
+365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,
+365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,
+365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,
+365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,
+366,366,366,366,366,366,120,120,367,367,367,367,367,367,120,120,
/* block 40 */
-366,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,
-367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,
-367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,
-367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,
-367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,
-367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,
-367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,
-367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,
+368,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
/* block 41 */
-367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,
-367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,
-367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,
-367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,
-367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,
-367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,
-367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,
-367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
/* block 42 */
-367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,
-367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,
-367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,
-367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,
-367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,
-367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,
-367,367,367,367,367,367,367,367,367,367,367,367,367,368,368,367,
-367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
+369,369,369,369,369,369,369,369,369,369,369,369,369,370,371,369,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
/* block 43 */
-369,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,
-370,370,370,370,370,370,370,370,370,370,370,371,372,119,119,119,
-373,373,373,373,373,373,373,373,373,373,373,373,373,373,373,373,
-373,373,373,373,373,373,373,373,373,373,373,373,373,373,373,373,
-373,373,373,373,373,373,373,373,373,373,373,373,373,373,373,373,
-373,373,373,373,373,373,373,373,373,373,373,373,373,373,373,373,
-373,373,373,373,373,373,373,373,373,373,373, 5, 5, 5,374,374,
-374,373,373,373,373,373,373,373,373,119,119,119,119,119,119,119,
+372,373,373,373,373,373,373,373,373,373,373,373,373,373,373,373,
+373,373,373,373,373,373,373,373,373,373,373,374,375,120,120,120,
+376,376,376,376,376,376,376,376,376,376,376,376,376,376,376,376,
+376,376,376,376,376,376,376,376,376,376,376,376,376,376,376,376,
+376,376,376,376,376,376,376,376,376,376,376,376,376,376,376,376,
+376,376,376,376,376,376,376,376,376,376,376,376,376,376,376,376,
+376,376,376,376,376,376,376,376,376,376,376, 5, 5, 5,377,377,
+377,376,376,376,376,376,376,376,376,120,120,120,120,120,120,120,
/* block 44 */
-375,375,375,375,375,375,375,375,375,375,375,375,375,119,375,375,
-375,375,376,376,376,119,119,119,119,119,119,119,119,119,119,119,
-377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,
-377,377,378,378,378,379,379,119,119,119,119,119,119,119,119,119,
+378,378,378,378,378,378,378,378,378,378,378,378,378,120,378,378,
+378,378,379,379,379,120,120,120,120,120,120,120,120,120,120,120,
380,380,380,380,380,380,380,380,380,380,380,380,380,380,380,380,
-380,380,381,381,119,119,119,119,119,119,119,119,119,119,119,119,
-382,382,382,382,382,382,382,382,382,382,382,382,382,119,382,382,
-382,119,383,383,119,119,119,119,119,119,119,119,119,119,119,119,
+380,380,381,381,381,382,382,120,120,120,120,120,120,120,120,120,
+383,383,383,383,383,383,383,383,383,383,383,383,383,383,383,383,
+383,383,384,384,120,120,120,120,120,120,120,120,120,120,120,120,
+385,385,385,385,385,385,385,385,385,385,385,385,385,120,385,385,
+385,120,386,386,120,120,120,120,120,120,120,120,120,120,120,120,
/* block 45 */
-384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,
-384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,
-384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,
-384,384,384,384,385,385,386,385,385,385,385,385,385,385,386,386,
-386,386,386,386,386,386,385,386,386,385,385,385,385,385,385,385,
-385,385,385,385,387,387,387,388,387,387,387,389,384,385,119,119,
-390,390,390,390,390,390,390,390,390,390,119,119,119,119,119,119,
-391,391,391,391,391,391,391,391,391,391,119,119,119,119,119,119,
+387,387,387,387,387,387,387,387,387,387,387,387,387,387,387,387,
+387,387,387,387,387,387,387,387,387,387,387,387,387,387,387,387,
+387,387,387,387,387,387,387,387,387,387,387,387,387,387,387,387,
+387,387,387,387,388,388,389,388,388,388,388,388,388,388,389,389,
+389,389,389,389,389,389,388,389,389,388,388,388,388,388,388,388,
+388,388,388,388,390,390,390,391,390,390,390,392,387,388,120,120,
+393,393,393,393,393,393,393,393,393,393,120,120,120,120,120,120,
+394,394,394,394,394,394,394,394,394,394,120,120,120,120,120,120,
/* block 46 */
-392,392,393,393,392,393,394,392,392,392,392,395,395,395,396,119,
-397,397,397,397,397,397,397,397,397,397,119,119,119,119,119,119,
-398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,
-398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,
-398,398,398,399,398,398,398,398,398,398,398,398,398,398,398,398,
-398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,
-398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,
-398,398,398,398,398,398,398,398,398,119,119,119,119,119,119,119,
+395,395,396,396,395,396,397,395,395,395,395,398,398,398,399,120,
+400,400,400,400,400,400,400,400,400,400,120,120,120,120,120,120,
+401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,
+401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,
+401,401,401,402,401,401,401,401,401,401,401,401,401,401,401,401,
+401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,
+401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,
+401,401,401,401,401,401,401,401,401,120,120,120,120,120,120,120,
/* block 47 */
-398,398,398,398,398,395,395,398,398,398,398,398,398,398,398,398,
-398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,
-398,398,398,398,398,398,398,398,398,395,398,119,119,119,119,119,
-367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,
-367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,
-367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,
-367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,
-367,367,367,367,367,367,119,119,119,119,119,119,119,119,119,119,
+401,401,401,401,401,398,398,401,401,401,401,401,401,401,401,401,
+401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,
+401,401,401,401,401,401,401,401,401,398,401,120,120,120,120,120,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
+369,369,369,369,369,369,120,120,120,120,120,120,120,120,120,120,
/* block 48 */
-400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,
-400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,119,
-401,401,401,402,402,402,402,401,401,402,402,402,119,119,119,119,
-402,402,401,402,402,402,402,402,402,401,401,401,119,119,119,119,
-403,119,119,119,404,404,405,405,405,405,405,405,405,405,405,405,
-406,406,406,406,406,406,406,406,406,406,406,406,406,406,406,406,
-406,406,406,406,406,406,406,406,406,406,406,406,406,406,119,119,
-406,406,406,406,406,119,119,119,119,119,119,119,119,119,119,119,
+403,403,403,403,403,403,403,403,403,403,403,403,403,403,403,403,
+403,403,403,403,403,403,403,403,403,403,403,403,403,403,403,120,
+404,404,404,405,405,405,405,404,404,405,405,405,120,120,120,120,
+405,405,404,405,405,405,405,405,405,404,404,404,120,120,120,120,
+406,120,120,120,407,407,408,408,408,408,408,408,408,408,408,408,
+409,409,409,409,409,409,409,409,409,409,409,409,409,409,409,409,
+409,409,409,409,409,409,409,409,409,409,409,409,409,409,120,120,
+409,409,409,409,409,120,120,120,120,120,120,120,120,120,120,120,
/* block 49 */
-407,407,407,407,407,407,407,407,407,407,407,407,407,407,407,407,
-407,407,407,407,407,407,407,407,407,407,407,407,407,407,407,407,
-407,407,407,407,407,407,407,407,407,407,407,407,119,119,119,119,
-407,407,407,407,407,407,407,407,407,407,407,407,407,407,407,407,
-407,407,407,407,407,407,407,407,407,407,119,119,119,119,119,119,
-408,408,408,408,408,408,408,408,408,408,409,119,119,119,410,410,
-411,411,411,411,411,411,411,411,411,411,411,411,411,411,411,411,
-411,411,411,411,411,411,411,411,411,411,411,411,411,411,411,411,
+410,410,410,410,410,410,410,410,410,410,410,410,410,410,410,410,
+410,410,410,410,410,410,410,410,410,410,410,410,410,410,410,410,
+410,410,410,410,410,410,410,410,410,410,410,410,120,120,120,120,
+410,410,410,410,410,410,410,410,410,410,410,410,410,410,410,410,
+410,410,410,410,410,410,410,410,410,410,120,120,120,120,120,120,
+411,411,411,411,411,411,411,411,411,411,412,120,120,120,413,413,
+414,414,414,414,414,414,414,414,414,414,414,414,414,414,414,414,
+414,414,414,414,414,414,414,414,414,414,414,414,414,414,414,414,
/* block 50 */
-412,412,412,412,412,412,412,412,412,412,412,412,412,412,412,412,
-412,412,412,412,412,412,412,413,413,414,414,413,119,119,415,415,
-416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,
-416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,
-416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,
-416,416,416,416,416,417,418,417,418,418,418,418,418,418,418,119,
-418,419,418,419,419,418,418,418,418,418,418,418,418,417,417,417,
-417,417,417,418,418,418,418,418,418,418,418,418,418,119,119,418,
+415,415,415,415,415,415,415,415,415,415,415,415,415,415,415,415,
+415,415,415,415,415,415,415,416,416,417,417,416,120,120,418,418,
+419,419,419,419,419,419,419,419,419,419,419,419,419,419,419,419,
+419,419,419,419,419,419,419,419,419,419,419,419,419,419,419,419,
+419,419,419,419,419,419,419,419,419,419,419,419,419,419,419,419,
+419,419,419,419,419,420,421,420,421,421,421,421,421,421,421,120,
+421,422,421,422,422,421,421,421,421,421,421,421,421,420,420,420,
+420,420,420,421,421,421,421,421,421,421,421,421,421,120,120,421,
/* block 51 */
-420,420,420,420,420,420,420,420,420,420,119,119,119,119,119,119,
-420,420,420,420,420,420,420,420,420,420,119,119,119,119,119,119,
-421,421,421,421,421,421,421,422,421,421,421,421,421,421,119,119,
-112,112,112,112,112,112,112,112,112,112,112,112,112,112,423,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+423,423,423,423,423,423,423,423,423,423,120,120,120,120,120,120,
+423,423,423,423,423,423,423,423,423,423,120,120,120,120,120,120,
+424,424,424,424,424,424,424,425,424,424,424,424,424,424,120,120,
+113,113,113,113,113,113,113,113,113,113,113,113,113,113,426,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
/* block 52 */
-424,424,424,424,425,426,426,426,426,426,426,426,426,426,426,426,
-426,426,426,426,426,426,426,426,426,426,426,426,426,426,426,426,
-426,426,426,426,426,426,426,426,426,426,426,426,426,426,426,426,
-426,426,426,426,424,425,424,424,424,424,424,425,424,425,425,425,
-425,425,424,425,425,426,426,426,426,426,426,426,119,119,119,119,
-427,427,427,427,427,427,427,427,427,427,428,428,428,428,428,428,
-428,429,429,429,429,429,429,429,429,429,429,424,424,424,424,424,
-424,424,424,424,429,429,429,429,429,429,429,429,429,119,119,119,
+427,427,427,427,428,429,429,429,429,429,429,429,429,429,429,429,
+429,429,429,429,429,429,429,429,429,429,429,429,429,429,429,429,
+429,429,429,429,429,429,429,429,429,429,429,429,429,429,429,429,
+429,429,429,429,427,430,427,427,427,427,427,428,427,428,428,428,
+428,428,427,428,428,429,429,429,429,429,429,429,120,120,120,120,
+431,431,431,431,431,431,431,431,431,431,432,432,432,432,432,432,
+432,433,433,433,433,433,433,433,433,433,433,427,427,427,427,427,
+427,427,427,427,433,433,433,433,433,433,433,433,433,120,120,120,
/* block 53 */
-430,430,431,432,432,432,432,432,432,432,432,432,432,432,432,432,
-432,432,432,432,432,432,432,432,432,432,432,432,432,432,432,432,
-432,431,430,430,430,430,431,431,430,430,431,430,430,430,432,432,
-433,433,433,433,433,433,433,433,433,433,432,432,432,432,432,432,
-434,434,434,434,434,434,434,434,434,434,434,434,434,434,434,434,
-434,434,434,434,434,434,434,434,434,434,434,434,434,434,434,434,
-434,434,434,434,434,434,435,436,435,435,436,436,436,435,436,435,
-435,435,436,436,119,119,119,119,119,119,119,119,437,437,437,437,
-
-/* block 54 */
+434,434,435,436,436,436,436,436,436,436,436,436,436,436,436,436,
+436,436,436,436,436,436,436,436,436,436,436,436,436,436,436,436,
+436,435,434,434,434,434,435,435,434,434,435,434,434,434,436,436,
+437,437,437,437,437,437,437,437,437,437,436,436,436,436,436,436,
438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,
438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,
-438,438,438,438,439,439,439,439,439,439,439,439,440,440,440,440,
-440,440,440,440,439,439,440,440,119,119,119,441,441,441,441,441,
-442,442,442,442,442,442,442,442,442,442,119,119,119,438,438,438,
-443,443,443,443,443,443,443,443,443,443,444,444,444,444,444,444,
-444,444,444,444,444,444,444,444,444,444,444,444,444,444,444,444,
-444,444,444,444,444,444,444,444,445,445,445,445,445,445,446,446,
+438,438,438,438,438,438,439,440,439,439,440,440,440,439,440,439,
+439,439,440,440,120,120,120,120,120,120,120,120,441,441,441,441,
+
+/* block 54 */
+442,442,442,442,442,442,442,442,442,442,442,442,442,442,442,442,
+442,442,442,442,442,442,442,442,442,442,442,442,442,442,442,442,
+442,442,442,442,443,443,443,443,443,443,443,443,444,444,444,444,
+444,444,444,444,443,443,444,444,120,120,120,445,445,445,445,445,
+446,446,446,446,446,446,446,446,446,446,120,120,120,442,442,442,
+447,447,447,447,447,447,447,447,447,447,448,448,448,448,448,448,
+448,448,448,448,448,448,448,448,448,448,448,448,448,448,448,448,
+448,448,448,448,448,448,448,448,449,449,449,449,449,449,450,450,
/* block 55 */
-447,448,449,450,451,452,453,454,455,119,119,119,119,119,119,119,
-456,456,456,456,456,456,456,456,456,456,456,456,456,456,456,456,
-456,456,456,456,456,456,456,456,456,456,456,456,456,456,456,456,
-456,456,456,456,456,456,456,456,456,456,456,119,119,456,456,456,
-457,457,457,457,457,457,457,457,119,119,119,119,119,119,119,119,
-458,459,458,460,459,461,461,462,461,462,463,459,462,462,459,459,
-462,464,459,459,459,459,459,459,459,465,466,465,465,461,465,465,
-465,465,467,467,468,466,466,469,470,470,119,119,119,119,119,119,
+451,452,453,454,455,456,457,458,459,120,120,120,120,120,120,120,
+460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,
+460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,
+460,460,460,460,460,460,460,460,460,460,460,120,120,460,460,460,
+461,461,461,461,461,461,461,461,120,120,120,120,120,120,120,120,
+462,463,462,464,463,465,465,466,465,466,467,463,466,466,463,463,
+466,468,463,463,463,463,463,463,463,469,470,471,471,465,471,471,
+471,471,472,473,474,470,470,475,476,476,477,120,120,120,120,120,
/* block 56 */
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 35, 35,127,127,127,127,127,471,109,109,109,109,
-109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,
-109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,
-109,109,109,109,109,109,109,109,109,109,109,109,109,120,120,120,
-120,120,109,109,109,109,120,120,120,120,120, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 35, 35, 35, 35,472,473, 35, 35, 35,474, 35, 35,
+ 35, 35, 35, 35, 35, 35,128,128,128,128,128,478,110,110,110,110,
+110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,
+110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,
+110,110,110,110,110,110,110,110,110,110,110,110,110,121,121,121,
+121,121,110,110,110,110,121,121,121,121,121, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,479,480, 35, 35, 35,481, 35, 35,
/* block 57 */
- 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,109,109,109,109,109,
-109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,
-109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,120,
-113,113,112,112,112,112,112,112,112,112,112,112,112,112,112,112,
-112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,
-112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,
-112,112,112,112,112,112,112,112,112,112,119,112,112,112,112,112,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,482, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,110,110,110,110,110,
+110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,
+110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,121,
+114,114,113,113,113,113,113,113,113,113,113,113,113,113,113,113,
+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,
+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,
+113,113,113,113,113,113,113,113,113,113,120,113,113,113,113,113,
/* block 58 */
32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,
@@ -2251,12 +2286,12 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 68608 bytes, block = 128 */
32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,
32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,
32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,
-475,476, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,
+483,484, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,
32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,
/* block 59 */
32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,
- 32, 33, 32, 33, 32, 33, 35, 35, 35, 35, 35,477, 35, 35,478, 35,
+ 32, 33, 32, 33, 32, 33, 35, 35, 35, 35, 35,485, 35, 35,486, 35,
32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,
32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,
32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,
@@ -2265,58 +2300,58 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 68608 bytes, block = 128 */
32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,
/* block 60 */
-479,479,479,479,479,479,479,479,480,480,480,480,480,480,480,480,
-479,479,479,479,479,479,119,119,480,480,480,480,480,480,119,119,
-479,479,479,479,479,479,479,479,480,480,480,480,480,480,480,480,
-479,479,479,479,479,479,479,479,480,480,480,480,480,480,480,480,
-479,479,479,479,479,479,119,119,480,480,480,480,480,480,119,119,
-127,479,127,479,127,479,127,479,119,480,119,480,119,480,119,480,
-479,479,479,479,479,479,479,479,480,480,480,480,480,480,480,480,
-481,481,482,482,482,482,483,483,484,484,485,485,486,486,119,119,
+487,487,487,487,487,487,487,487,488,488,488,488,488,488,488,488,
+487,487,487,487,487,487,120,120,488,488,488,488,488,488,120,120,
+487,487,487,487,487,487,487,487,488,488,488,488,488,488,488,488,
+487,487,487,487,487,487,487,487,488,488,488,488,488,488,488,488,
+487,487,487,487,487,487,120,120,488,488,488,488,488,488,120,120,
+128,487,128,487,128,487,128,487,120,488,120,488,120,488,120,488,
+487,487,487,487,487,487,487,487,488,488,488,488,488,488,488,488,
+489,489,490,490,490,490,491,491,492,492,493,493,494,494,120,120,
/* block 61 */
-479,479,479,479,479,479,479,479,487,487,487,487,487,487,487,487,
-479,479,479,479,479,479,479,479,487,487,487,487,487,487,487,487,
-479,479,479,479,479,479,479,479,487,487,487,487,487,487,487,487,
-479,479,127,488,127,119,127,127,480,480,489,489,490,118,491,118,
-118,118,127,488,127,119,127,127,492,492,492,492,490,118,118,118,
-479,479,127,127,119,119,127,127,480,480,493,493,119,118,118,118,
-479,479,127,127,127,168,127,127,480,480,494,494,173,118,118,118,
-119,119,127,488,127,119,127,127,495,495,496,496,490,118,118,119,
+487,487,487,487,487,487,487,487,495,495,495,495,495,495,495,495,
+487,487,487,487,487,487,487,487,495,495,495,495,495,495,495,495,
+487,487,487,487,487,487,487,487,495,495,495,495,495,495,495,495,
+487,487,128,496,128,120,128,128,488,488,497,497,498,119,499,119,
+119,119,128,496,128,120,128,128,500,500,500,500,498,119,119,119,
+487,487,128,128,120,120,128,128,488,488,501,501,120,119,119,119,
+487,487,128,128,128,169,128,128,488,488,502,502,174,119,119,119,
+120,120,128,496,128,120,128,128,503,503,504,504,498,119,119,120,
/* block 62 */
- 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 24,497,498, 24, 24,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 24,505,506, 24, 24,
10, 10, 10, 10, 10, 10, 5, 5, 23, 27, 7, 23, 23, 27, 7, 23,
- 5, 5, 5, 5, 5, 5, 5, 5,499,500, 24, 24, 24, 24, 24, 4,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 23, 27, 5,501, 5, 5, 16,
- 16, 5, 5, 5, 9, 7, 8, 5, 5,501, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5,507,508, 24, 24, 24, 24, 24,509,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 23, 27, 5,510, 5, 5, 16,
+ 16, 5, 5, 5, 9, 7, 8, 5, 5,510, 5, 5, 5, 5, 5, 5,
5, 5, 9, 5, 16, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4,
- 24, 24, 24, 24, 24,502, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
- 25,109,119,119, 25, 25, 25, 25, 25, 25, 9, 9, 9, 7, 8,109,
+ 24, 24, 24, 24, 24,511, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+ 25,110,120,120, 25, 25, 25, 25, 25, 25, 9, 9, 9, 7, 8,110,
/* block 63 */
- 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 9, 9, 9, 7, 8,119,
-109,109,109,109,109,109,109,109,109,109,109,109,109,119,119,119,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 9, 9, 9, 7, 8,120,
+110,110,110,110,110,110,110,110,110,110,110,110,110,120,120,120,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-112,112,112,112,112,112,112,112,112,112,112,112,112,423,423,423,
-423,112,423,423,423,112,112,112,112,112,112,112,112,112,112,112,
-503,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+113,113,113,113,113,113,113,113,113,113,113,113,113,426,426,426,
+426,113,426,426,426,113,113,113,113,113,113,113,113,113,113,113,
+512,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
/* block 64 */
- 20, 20,504, 20, 20, 20, 20,504, 20, 20,505,504,504,504,505,505,
-504,504,504,505, 20,504, 20, 20, 9,504,504,504,504,504, 20, 20,
- 20, 20, 21, 20,504, 20,506, 20,504, 20,507,508,504,504, 20,505,
-504,504,509,504,505,510,510,510,510,511, 20, 20,505,505,504,504,
- 9, 9, 9, 9, 9,504,505,505,505,505, 20, 9, 20, 20,512, 20,
+ 20, 20,513, 20, 20, 20, 20,513, 20, 20,514,513,513,513,514,514,
+513,513,513,514, 20,513, 20, 20, 9,513,513,513,513,513, 20, 20,
+ 20, 20, 21, 20,513, 20,515, 20,513, 20,516,517,513,513, 20,514,
+513,513,518,513,514,519,519,519,519,520, 20, 20,514,514,513,513,
+ 9, 9, 9, 9, 9,513,514,514,514,514, 20, 9, 20, 20,521, 20,
25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,
-514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,
+522,522,522,522,522,522,522,522,522,522,522,522,522,522,522,522,
+523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,
/* block 65 */
-515,515,515, 32, 33,515,515,515,515, 25, 20, 20,119,119,119,119,
- 9, 9, 9, 9,516, 21, 21, 21, 21, 21, 9, 9, 20, 20, 20, 20,
+524,524,524, 32, 33,524,524,524,524, 25, 20, 20,120,120,120,120,
+ 9, 9, 9, 9,525, 21, 21, 21, 21, 21, 9, 9, 20, 20, 20, 20,
9, 20, 20, 9, 20, 20, 9, 20, 20, 21, 21, 20, 20, 20, 9, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 9, 9,
@@ -2357,10 +2392,10 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 68608 bytes, block = 128 */
/* block 69 */
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
- 20, 20, 20, 20, 20, 20, 20,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+ 20, 20, 20, 20, 20, 20, 20,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
@@ -2368,10 +2403,10 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 68608 bytes, block = 128 */
25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
- 20, 20, 20, 20, 20, 20,517,517,517,517,517,517,517,517,517,517,
-517,517,518,517,517,517,517,517,517,517,517,517,517,517,517,517,
-519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,
-519,519,519,519,519,519,519,519,519,519, 25, 25, 25, 25, 25, 25,
+ 20, 20, 20, 20, 20, 20,526,526,526,526,526,526,526,526,526,526,
+526,526,527,526,526,526,526,526,526,526,526,526,526,526,526,526,
+528,528,528,528,528,528,528,528,528,528,528,528,528,528,528,528,
+528,528,528,528,528,528,528,528,528,528, 25, 25, 25, 25, 25, 25,
25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
/* block 71 */
@@ -2392,7 +2427,7 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 68608 bytes, block = 128 */
21, 9, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
- 20, 20, 20, 20, 20, 20, 20, 20, 9, 9, 9,516,516,516,516, 9,
+ 20, 20, 20, 20, 20, 20, 20, 20, 9, 9, 9,525,525,525,525, 9,
/* block 73 */
21, 21, 21, 21, 21, 21, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21,
@@ -2401,7 +2436,7 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 68608 bytes, block = 128 */
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,516,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,525,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
/* block 74 */
@@ -2435,20 +2470,20 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 68608 bytes, block = 128 */
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
/* block 77 */
-520,520,520,520,520,520,520,520,520,520,520,520,520,520,520,520,
-520,520,520,520,520,520,520,520,520,520,520,520,520,520,520,520,
-520,520,520,520,520,520,520,520,520,520,520,520,520,520,520,520,
-520,520,520,520,520,520,520,520,520,520,520,520,520,520,520,520,
-520,520,520,520,520,520,520,520,520,520,520,520,520,520,520,520,
-520,520,520,520,520,520,520,520,520,520,520,520,520,520,520,520,
-520,520,520,520,520,520,520,520,520,520,520,520,520,520,520,520,
-520,520,520,520,520,520,520,520,520,520,520,520,520,520,520,520,
+529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,
+529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,
+529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,
+529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,
+529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,
+529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,
+529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,
+529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,
/* block 78 */
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9,516,516, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9,525,525, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
@@ -2472,167 +2507,167 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 68608 bytes, block = 128 */
9, 9, 9, 9, 9, 20, 20, 9, 9, 9, 9, 9, 9, 20, 20, 20,
21, 20, 20, 20, 20, 21, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
- 20, 20, 20, 20,119,119, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20,120,120, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
/* block 81 */
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
- 20, 20, 20, 20, 20, 20,119,119, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20,120,120, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
- 20, 20, 20, 20, 20, 20, 20, 20, 20,119, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,119,
/* block 82 */
-521,521,521,521,521,521,521,521,521,521,521,521,521,521,521,521,
-521,521,521,521,521,521,521,521,521,521,521,521,521,521,521,521,
-521,521,521,521,521,521,521,521,521,521,521,521,521,521,521,119,
-522,522,522,522,522,522,522,522,522,522,522,522,522,522,522,522,
-522,522,522,522,522,522,522,522,522,522,522,522,522,522,522,522,
-522,522,522,522,522,522,522,522,522,522,522,522,522,522,522,119,
- 32, 33,523,524,525,526,527, 32, 33, 32, 33, 32, 33,528,529,530,
-531, 35, 32, 33, 35, 32, 33, 35, 35, 35, 35, 35,109,109,532,532,
+530,530,530,530,530,530,530,530,530,530,530,530,530,530,530,530,
+530,530,530,530,530,530,530,530,530,530,530,530,530,530,530,530,
+530,530,530,530,530,530,530,530,530,530,530,530,530,530,530,120,
+531,531,531,531,531,531,531,531,531,531,531,531,531,531,531,531,
+531,531,531,531,531,531,531,531,531,531,531,531,531,531,531,531,
+531,531,531,531,531,531,531,531,531,531,531,531,531,531,531,120,
+ 32, 33,532,533,534,535,536, 32, 33, 32, 33, 32, 33,537,538,539,
+540, 35, 32, 33, 35, 32, 33, 35, 35, 35, 35, 35,110,110,541,541,
/* block 83 */
-164,165,164,165,164,165,164,165,164,165,164,165,164,165,164,165,
-164,165,164,165,164,165,164,165,164,165,164,165,164,165,164,165,
-164,165,164,165,164,165,164,165,164,165,164,165,164,165,164,165,
-164,165,164,165,164,165,164,165,164,165,164,165,164,165,164,165,
-164,165,164,165,164,165,164,165,164,165,164,165,164,165,164,165,
-164,165,164,165,164,165,164,165,164,165,164,165,164,165,164,165,
-164,165,164,165,533,534,534,534,534,534,534,164,165,164,165,535,
-535,535,164,165,119,119,119,119,119,536,536,536,536,537,536,536,
+165,166,165,166,165,166,165,166,165,166,165,166,165,166,165,166,
+165,166,165,166,165,166,165,166,165,166,165,166,165,166,165,166,
+165,166,165,166,165,166,165,166,165,166,165,166,165,166,165,166,
+165,166,165,166,165,166,165,166,165,166,165,166,165,166,165,166,
+165,166,165,166,165,166,165,166,165,166,165,166,165,166,165,166,
+165,166,165,166,165,166,165,166,165,166,165,166,165,166,165,166,
+165,166,165,166,542,543,543,543,543,543,543,165,166,165,166,544,
+544,544,165,166,120,120,120,120,120,545,545,545,545,546,545,545,
/* block 84 */
-538,538,538,538,538,538,538,538,538,538,538,538,538,538,538,538,
-538,538,538,538,538,538,538,538,538,538,538,538,538,538,538,538,
-538,538,538,538,538,538,119,538,119,119,119,119,119,538,119,119,
-539,539,539,539,539,539,539,539,539,539,539,539,539,539,539,539,
-539,539,539,539,539,539,539,539,539,539,539,539,539,539,539,539,
-539,539,539,539,539,539,539,539,539,539,539,539,539,539,539,539,
-539,539,539,539,539,539,539,539,119,119,119,119,119,119,119,540,
-541,119,119,119,119,119,119,119,119,119,119,119,119,119,119,542,
+547,547,547,547,547,547,547,547,547,547,547,547,547,547,547,547,
+547,547,547,547,547,547,547,547,547,547,547,547,547,547,547,547,
+547,547,547,547,547,547,120,547,120,120,120,120,120,547,120,120,
+548,548,548,548,548,548,548,548,548,548,548,548,548,548,548,548,
+548,548,548,548,548,548,548,548,548,548,548,548,548,548,548,548,
+548,548,548,548,548,548,548,548,548,548,548,548,548,548,548,548,
+548,548,548,548,548,548,548,548,120,120,120,120,120,120,120,549,
+550,120,120,120,120,120,120,120,120,120,120,120,120,120,120,551,
/* block 85 */
-358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,
-358,358,358,358,358,358,358,119,119,119,119,119,119,119,119,119,
-358,358,358,358,358,358,358,119,358,358,358,358,358,358,358,119,
-358,358,358,358,358,358,358,119,358,358,358,358,358,358,358,119,
-358,358,358,358,358,358,358,119,358,358,358,358,358,358,358,119,
-358,358,358,358,358,358,358,119,358,358,358,358,358,358,358,119,
-543,543,543,543,543,543,543,543,543,543,543,543,543,543,543,543,
-543,543,543,543,543,543,543,543,543,543,543,543,543,543,543,543,
+360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,
+360,360,360,360,360,360,360,120,120,120,120,120,120,120,120,120,
+360,360,360,360,360,360,360,120,360,360,360,360,360,360,360,120,
+360,360,360,360,360,360,360,120,360,360,360,360,360,360,360,120,
+360,360,360,360,360,360,360,120,360,360,360,360,360,360,360,120,
+360,360,360,360,360,360,360,120,360,360,360,360,360,360,360,120,
+552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,
+552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,
/* block 86 */
5, 5, 23, 27, 23, 27, 5, 5, 5, 23, 27, 5, 23, 27, 5, 5,
5, 5, 5, 5, 5, 5, 5, 10, 5, 5, 10, 5, 23, 27, 5, 5,
- 23, 27, 7, 8, 7, 8, 7, 8, 7, 8, 5, 5, 5, 5, 5,110,
+ 23, 27, 7, 8, 7, 8, 7, 8, 7, 8, 5, 5, 5, 5, 5,111,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 10, 10, 5, 5, 5, 5,
- 10, 5, 7,544, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+ 10, 5, 7,553, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
/* block 87 */
-545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,
-545,545,545,545,545,545,545,545,545,545,119,545,545,545,545,545,
-545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,
-545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,
-545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,
-545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,
-545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,
-545,545,545,545,119,119,119,119,119,119,119,119,119,119,119,119,
+554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,
+554,554,554,554,554,554,554,554,554,554,120,554,554,554,554,554,
+554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,
+554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,
+554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,
+554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,
+554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,
+554,554,554,554,120,120,120,120,120,120,120,120,120,120,120,120,
/* block 88 */
-545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,
-545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,
-545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,
-545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,
-545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,
-545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,
-545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,
-545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,
+554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,
+554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,
+554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,
+554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,
+554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,
+554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,
+554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,
+554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,
/* block 89 */
-545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,
-545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,
-545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,
-545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,
-545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,
-545,545,545,545,545,545,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,119,119,119,119,
+554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,
+554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,
+554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,
+554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,
+554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,
+554,554,554,554,554,554,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,120,120,120,120,
/* block 90 */
- 4,546,546,547, 20,548,549,550,551,552,551,552,551,552,551,552,
-551,552, 20,553,551,552,551,552,551,552,551,552,554,555,556,556,
- 20,550,550,550,550,550,550,550,550,550,557,557,557,557,558,558,
-559,560,560,560,560,560, 20,553,550,550,550,548,561,562,563,563,
-119,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,
-564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,
-564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,
-564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,
+ 4,555,555,556, 20,557,558,559,560,561,560,561,560,561,560,561,
+560,561, 20,562,560,561,560,561,560,561,560,561,563,564,565,565,
+ 20,559,559,559,559,559,559,559,559,559,566,566,566,566,567,567,
+568,569,569,569,569,569, 20,562,559,559,559,557,570,571,572,572,
+120,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,
+573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,
+573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,
+573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,
/* block 91 */
-564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,
-564,564,564,564,564,564,564,119,119,565,565,566,566,567,567,564,
-568,569,569,569,569,569,569,569,569,569,569,569,569,569,569,569,
-569,569,569,569,569,569,569,569,569,569,569,569,569,569,569,569,
-569,569,569,569,569,569,569,569,569,569,569,569,569,569,569,569,
-569,569,569,569,569,569,569,569,569,569,569,569,569,569,569,569,
-569,569,569,569,569,569,569,569,569,569,569,569,569,569,569,569,
-569,569,569,569,569,569,569,569,569,569,569,546,560,570,570,569,
+573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,
+573,573,573,573,573,573,573,120,120,574,574,575,575,576,576,573,
+577,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,
+578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,
+578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,
+578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,
+578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,
+578,578,578,578,578,578,578,578,578,578,578,555,569,579,579,578,
/* block 92 */
-119,119,119,119,119,571,571,571,571,571,571,571,571,571,571,571,
-571,571,571,571,571,571,571,571,571,571,571,571,571,571,571,571,
-571,571,571,571,571,571,571,571,571,571,571,571,571,571,571,571,
-119,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,
-572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,
-572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,
-572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,
-572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,
+120,120,120,120,120,580,580,580,580,580,580,580,580,580,580,580,
+580,580,580,580,580,580,580,580,580,580,580,580,580,580,580,580,
+580,580,580,580,580,580,580,580,580,580,580,580,580,580,580,580,
+120,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,
+581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,
+581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,
+581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,
+581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,
/* block 93 */
-572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,119,
-563,563,573,573,573,573,563,563,563,563,563,563,563,563,563,563,
-571,571,571,571,571,571,571,571,571,571,571,571,571,571,571,571,
-571,571,571,571,571,571,571,571,571,571,571,119,119,119,119,119,
-563,563,563,563,563,563,563,563,563,563,563,563,563,563,563,563,
-563,563,563,563,563,563,563,563,563,563,563,563,563,563,563,563,
-563,563,563,563,119,119,119,119,119,119,119,119,119,119,119,119,
-569,569,569,569,569,569,569,569,569,569,569,569,569,569,569,569,
+581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,120,
+572,572,582,582,582,582,572,572,572,572,572,572,572,572,572,572,
+580,580,580,580,580,580,580,580,580,580,580,580,580,580,580,580,
+580,580,580,580,580,580,580,580,580,580,580,120,120,120,120,120,
+572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,
+572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,
+572,572,572,572,120,120,120,120,120,120,120,120,120,120,120,120,
+578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,
/* block 94 */
-574,574,574,574,574,574,574,574,574,574,574,574,574,574,574,574,
-574,574,574,574,574,574,574,574,574,574,574,574,574,574,574,119,
-573,573,573,573,573,573,573,573,573,573,563,563,563,563,563,563,
-563,563,563,563,563,563,563,563,563,563,563,563,563,563,563,563,
-563,563,563,563,563,563,563,563, 25, 25, 25, 25, 25, 25, 25, 25,
+583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,
+583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,120,
+582,582,582,582,582,582,582,582,582,582,572,572,572,572,572,572,
+572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,
+572,572,572,572,572,572,572,572, 25, 25, 25, 25, 25, 25, 25, 25,
20, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-574,574,574,574,574,574,574,574,574,574,574,574,574,574,574,574,
-574,574,574,574,574,574,574,574,574,574,574,574,574,574,574, 20,
+583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,
+583,583,583,583,583,583,583,583,583,583,583,583,583,583,583, 20,
/* block 95 */
-573,573,573,573,573,573,573,573,573,573,563,563,563,563,563,563,
-563,563,563,563,563,563,563,575,563,575,563,563,563,563,563,563,
-563,563,563,563,563,563,563,563,563,563,563,563,563,563,563,563,
-563, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-563,563,563,563,563,563,563,563,563,563,563,563, 20, 20, 20, 20,
-576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,
-576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,
-576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,119,
+582,582,582,582,582,582,582,582,582,582,572,572,572,572,572,572,
+572,572,572,572,572,572,572,584,572,584,572,572,572,572,572,572,
+572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,
+572, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+572,572,572,572,572,572,572,572,572,572,572,572, 20, 20, 20, 20,
+585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,
+585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,
+585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,572,
/* block 96 */
-576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,
-576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,
-576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,
-576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,
-576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,
-576,576,576,576,576,576,576,576,563,563,563,563,563,563,563,563,
-563,563,563,563,563,563,563,563,563,563,563,563,563,563,563,563,
-563, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,563,563,563,563,563,
+585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,
+585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,
+585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,
+585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,
+585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,
+585,585,585,585,585,585,585,585,572,572,572,572,572,572,572,572,
+572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,
+572, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,572,572,572,572,572,
/* block 97 */
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
@@ -2641,1160 +2676,1190 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 68608 bytes, block = 128 */
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
-563,563,563,563,563,563,563,563,563,563,563,563,563,563,563,563,
-563,563,563,563,563,563,563,563,563,563,563,563,563,563,563, 20,
+572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,
+572,572,572,572,572,572,572,572,572,572,572,572,572,572,572, 20,
/* block 98 */
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
/* block 99 */
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,119,119,119,119,119,119,119,119,119,119,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,120,120,120,120,120,120,120,120,120,120,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
/* block 100 */
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
/* block 101 */
-578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,
-578,578,578,578,578,579,578,578,578,578,578,578,578,578,578,578,
-578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,
-578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,
-578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,
-578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,
-578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,
-578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,
+587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,
+587,587,587,587,587,588,587,587,587,587,587,587,587,587,587,587,
+587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,
+587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,
+587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,
+587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,
+587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,
+587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,
/* block 102 */
-578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,
-578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,
-578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,
-578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,
-578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,
-578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,
-578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,
-578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,
+587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,
+587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,
+587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,
+587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,
+587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,
+587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,
+587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,
+587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,
/* block 103 */
-578,578,578,578,578,578,578,578,578,578,578,578,578,119,119,119,
-580,580,580,580,580,580,580,580,580,580,580,580,580,580,580,580,
-580,580,580,580,580,580,580,580,580,580,580,580,580,580,580,580,
-580,580,580,580,580,580,580,580,580,580,580,580,580,580,580,580,
-580,580,580,580,580,580,580,119,119,119,119,119,119,119,119,119,
-581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,
-581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,
-581,581,581,581,581,581,581,581,582,582,582,582,582,582,583,583,
+587,587,587,587,587,587,587,587,587,587,587,587,587,120,120,120,
+589,589,589,589,589,589,589,589,589,589,589,589,589,589,589,589,
+589,589,589,589,589,589,589,589,589,589,589,589,589,589,589,589,
+589,589,589,589,589,589,589,589,589,589,589,589,589,589,589,589,
+589,589,589,589,589,589,589,120,120,120,120,120,120,120,120,120,
+590,590,590,590,590,590,590,590,590,590,590,590,590,590,590,590,
+590,590,590,590,590,590,590,590,590,590,590,590,590,590,590,590,
+590,590,590,590,590,590,590,590,591,591,591,591,591,591,592,592,
/* block 104 */
-584,584,584,584,584,584,584,584,584,584,584,584,584,584,584,584,
-584,584,584,584,584,584,584,584,584,584,584,584,584,584,584,584,
-584,584,584,584,584,584,584,584,584,584,584,584,584,584,584,584,
-584,584,584,584,584,584,584,584,584,584,584,584,584,584,584,584,
-584,584,584,584,584,584,584,584,584,584,584,584,584,584,584,584,
-584,584,584,584,584,584,584,584,584,584,584,584,584,584,584,584,
-584,584,584,584,584,584,584,584,584,584,584,584,584,584,584,584,
-584,584,584,584,584,584,584,584,584,584,584,584,584,584,584,584,
+593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,
+593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,
+593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,
+593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,
+593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,
+593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,
+593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,
+593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,
/* block 105 */
-584,584,584,584,584,584,584,584,584,584,584,584,585,586,586,586,
-584,584,584,584,584,584,584,584,584,584,584,584,584,584,584,584,
-587,587,587,587,587,587,587,587,587,587,584,584,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-191,192,191,192,191,192,191,192,191,192,588,589,191,192,191,192,
-191,192,191,192,191,192,191,192,191,192,191,192,191,192,191,192,
-191,192,191,192,191,192,191,192,191,192,191,192,191,192,590,197,
-199,199,199,591,543,543,543,543,543,543,543,543,543,543,591,472,
+593,593,593,593,593,593,593,593,593,593,593,593,594,595,595,595,
+593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,
+596,596,596,596,596,596,596,596,596,596,593,593,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+192,193,192,193,192,193,192,193,192,193,597,598,192,193,192,193,
+192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193,
+192,193,192,193,192,193,192,193,192,193,192,193,192,193,599,198,
+200,200,200,600,552,552,552,552,552,552,552,552,552,552,600,479,
/* block 106 */
-191,192,191,192,191,192,191,192,191,192,191,192,191,192,191,192,
-191,192,191,192,191,192,191,192,191,192,191,192,472,472,543,543,
-592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,
-592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,
-592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,
-592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,
-592,592,592,592,592,592,593,593,593,593,593,593,593,593,593,593,
-594,594,595,595,595,595,595,595,119,119,119,119,119,119,119,119,
+192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193,
+192,193,192,193,192,193,192,193,192,193,192,193,479,479,552,552,
+601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,
+601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,
+601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,
+601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,
+601,601,601,601,601,601,602,602,602,602,602,602,602,602,602,602,
+603,603,604,604,604,604,604,604,120,120,120,120,120,120,120,120,
/* block 107 */
15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15,110,110,110,110,110,110,110,110,110,
+ 15, 15, 15, 15, 15, 15, 15,111,111,111,111,111,111,111,111,111,
15, 15, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,
35, 35, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,
32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,
32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,
32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,
-109, 35, 35, 35, 35, 35, 35, 35, 35, 32, 33, 32, 33,596, 32, 33,
+110, 35, 35, 35, 35, 35, 35, 35, 35, 32, 33, 32, 33,605, 32, 33,
/* block 108 */
- 32, 33, 32, 33, 32, 33, 32, 33,110, 15, 15, 32, 33,597, 35, 22,
- 32, 33, 32, 33, 35, 35, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,
- 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,598,599,600,601,598, 35,
-602,603,604,605, 32, 33, 32, 33, 32, 33,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119, 22,109,109, 35, 22, 22, 22, 22, 22,
+ 32, 33, 32, 33, 32, 33, 32, 33,111, 15, 15, 32, 33,606, 35, 22,
+ 32, 33, 32, 33,607, 35, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,
+ 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,608,609,610,611,608, 35,
+612,613,614,615, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,
+120,120, 32, 33,616,617,618,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120, 22,110,110, 35, 22, 22, 22, 22, 22,
/* block 109 */
-606,606,607,606,606,606,607,606,606,606,606,607,606,606,606,606,
-606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,
-606,606,606,608,608,607,607,608,609,609,609,609,119,119,119,119,
-610,610,610,611,611,611,612,612,613,612,119,119,119,119,119,119,
-614,614,614,614,614,614,614,614,614,614,614,614,614,614,614,614,
-614,614,614,614,614,614,614,614,614,614,614,614,614,614,614,614,
-614,614,614,614,614,614,614,614,614,614,614,614,614,614,614,614,
-614,614,614,614,615,615,615,615,119,119,119,119,119,119,119,119,
+619,619,620,619,619,619,620,619,619,619,619,620,619,619,619,619,
+619,619,619,619,619,619,619,619,619,619,619,619,619,619,619,619,
+619,619,619,621,621,620,620,621,622,622,622,622,120,120,120,120,
+623,623,623,624,624,624,625,625,626,625,120,120,120,120,120,120,
+627,627,627,627,627,627,627,627,627,627,627,627,627,627,627,627,
+627,627,627,627,627,627,627,627,627,627,627,627,627,627,627,627,
+627,627,627,627,627,627,627,627,627,627,627,627,627,627,627,627,
+627,627,627,627,628,628,628,628,120,120,120,120,120,120,120,120,
/* block 110 */
-616,616,617,617,617,617,617,617,617,617,617,617,617,617,617,617,
-617,617,617,617,617,617,617,617,617,617,617,617,617,617,617,617,
-617,617,617,617,617,617,617,617,617,617,617,617,617,617,617,617,
-617,617,617,617,616,616,616,616,616,616,616,616,616,616,616,616,
-616,616,616,616,618,618,119,119,119,119,119,119,119,119,619,619,
-620,620,620,620,620,620,620,620,620,620,119,119,119,119,119,119,
-251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,
-251,621,253,622,253,253,253,253,259,259,259,253,259,253,253,251,
+629,629,630,630,630,630,630,630,630,630,630,630,630,630,630,630,
+630,630,630,630,630,630,630,630,630,630,630,630,630,630,630,630,
+630,630,630,630,630,630,630,630,630,630,630,630,630,630,630,630,
+630,630,630,630,629,629,629,629,629,629,629,629,629,629,629,629,
+629,629,629,629,631,631,120,120,120,120,120,120,120,120,632,632,
+633,633,633,633,633,633,633,633,633,633,120,120,120,120,120,120,
+252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,
+252,634,254,635,254,254,254,254,260,260,260,254,260,254,254,252,
/* block 111 */
-623,623,623,623,623,623,623,623,623,623,624,624,624,624,624,624,
-624,624,624,624,624,624,624,624,624,624,624,624,624,624,624,624,
-624,624,624,624,624,624,625,625,625,625,625,625,625,625,626,627,
-628,628,628,628,628,628,628,628,628,628,628,628,628,628,628,628,
-628,628,628,628,628,628,628,629,629,629,629,629,629,629,629,629,
-629,629,630,630,119,119,119,119,119,119,119,119,119,119,119,631,
-355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,
-355,355,355,355,355,355,355,355,355,355,355,355,355,119,119,119,
+636,636,636,636,636,636,636,636,636,636,637,637,637,637,637,637,
+637,637,637,637,637,637,637,637,637,637,637,637,637,637,637,637,
+637,637,637,637,637,637,638,638,638,638,638,638,638,638,639,640,
+641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,
+641,641,641,641,641,641,641,642,642,642,642,642,642,642,642,642,
+642,642,643,643,120,120,120,120,120,120,120,120,120,120,120,644,
+357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,
+357,357,357,357,357,357,357,357,357,357,357,357,357,120,120,120,
/* block 112 */
-632,632,632,633,634,634,634,634,634,634,634,634,634,634,634,634,
-634,634,634,634,634,634,634,634,634,634,634,634,634,634,634,634,
-634,634,634,634,634,634,634,634,634,634,634,634,634,634,634,634,
-634,634,634,632,633,633,632,632,632,632,633,633,632,633,633,633,
-633,635,635,635,635,635,635,635,635,635,635,635,635,635,119,636,
-637,637,637,637,637,637,637,637,637,637,119,119,119,119,635,635,
-343,343,343,343,343,345,638,343,343,343,343,343,343,343,343,343,
-349,349,349,349,349,349,349,349,349,349,343,343,343,343,343,119,
+645,645,645,646,647,647,647,647,647,647,647,647,647,647,647,647,
+647,647,647,647,647,647,647,647,647,647,647,647,647,647,647,647,
+647,647,647,647,647,647,647,647,647,647,647,647,647,647,647,647,
+647,647,647,645,646,646,645,645,645,645,646,646,645,645,646,646,
+646,648,648,648,648,648,648,648,648,648,648,648,648,648,120,649,
+650,650,650,650,650,650,650,650,650,650,120,120,120,120,648,648,
+345,345,345,345,345,347,651,345,345,345,345,345,345,345,345,345,
+351,351,351,351,351,351,351,351,351,351,345,345,345,345,345,120,
/* block 113 */
-639,639,639,639,639,639,639,639,639,639,639,639,639,639,639,639,
-639,639,639,639,639,639,639,639,639,639,639,639,639,639,639,639,
-639,639,639,639,639,639,639,639,639,640,640,640,640,640,640,641,
-641,640,640,641,641,640,640,119,119,119,119,119,119,119,119,119,
-639,639,639,640,639,639,639,639,639,639,639,639,640,641,119,119,
-642,642,642,642,642,642,642,642,642,642,119,119,643,643,643,643,
-343,343,343,343,343,343,343,343,343,343,343,343,343,343,343,343,
-638,343,343,343,343,343,343,350,350,350,343,344,345,344,343,343,
+652,652,652,652,652,652,652,652,652,652,652,652,652,652,652,652,
+652,652,652,652,652,652,652,652,652,652,652,652,652,652,652,652,
+652,652,652,652,652,652,652,652,652,653,653,653,653,653,653,654,
+654,653,653,654,654,653,653,120,120,120,120,120,120,120,120,120,
+652,652,652,653,652,652,652,652,652,652,652,652,653,654,120,120,
+655,655,655,655,655,655,655,655,655,655,120,120,656,656,656,656,
+345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,
+651,345,345,345,345,345,345,352,352,352,345,346,347,346,345,345,
/* block 114 */
-644,644,644,644,644,644,644,644,644,644,644,644,644,644,644,644,
-644,644,644,644,644,644,644,644,644,644,644,644,644,644,644,644,
-644,644,644,644,644,644,644,644,644,644,644,644,644,644,644,644,
-645,644,645,645,645,644,644,645,645,644,644,644,644,644,645,645,
-644,645,644,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,644,644,646,647,647,
-648,648,648,648,648,648,648,648,648,648,648,649,650,650,649,649,
-651,651,648,652,652,649,650,119,119,119,119,119,119,119,119,119,
+657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,
+657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,
+657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,
+658,657,658,658,658,657,657,658,658,657,657,657,657,657,658,658,
+657,658,657,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,657,657,659,660,660,
+661,661,661,661,661,661,661,661,661,661,661,662,663,663,662,662,
+664,664,661,665,665,662,663,120,120,120,120,120,120,120,120,120,
/* block 115 */
-119,358,358,358,358,358,358,119,119,358,358,358,358,358,358,119,
-119,358,358,358,358,358,358,119,119,119,119,119,119,119,119,119,
-358,358,358,358,358,358,358,119,358,358,358,358,358,358,358,119,
+120,360,360,360,360,360,360,120,120,360,360,360,360,360,360,120,
+120,360,360,360,360,360,360,120,120,120,120,120,120,120,120,120,
+360,360,360,360,360,360,360,120,360,360,360,360,360,360,360,120,
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35,653, 35, 35, 35, 35, 35, 35, 35, 15,109,109,109,109,
- 35, 35, 35, 35, 35,127,119,119,119,119,119,119,119,119,119,119,
-654,654,654,654,654,654,654,654,654,654,654,654,654,654,654,654,
+ 35, 35, 35,666, 35, 35, 35, 35, 35, 35, 35, 15,110,110,110,110,
+ 35, 35, 35, 35, 35,128, 35, 35,120,120,120,120,120,120,120,120,
+667,667,667,667,667,667,667,667,667,667,667,667,667,667,667,667,
/* block 116 */
-654,654,654,654,654,654,654,654,654,654,654,654,654,654,654,654,
-654,654,654,654,654,654,654,654,654,654,654,654,654,654,654,654,
-654,654,654,654,654,654,654,654,654,654,654,654,654,654,654,654,
-654,654,654,654,654,654,654,654,654,654,654,654,654,654,654,654,
-648,648,648,648,648,648,648,648,648,648,648,648,648,648,648,648,
-648,648,648,648,648,648,648,648,648,648,648,648,648,648,648,648,
-648,648,648,649,649,650,649,649,650,649,649,651,649,650,119,119,
-655,655,655,655,655,655,655,655,655,655,119,119,119,119,119,119,
+667,667,667,667,667,667,667,667,667,667,667,667,667,667,667,667,
+667,667,667,667,667,667,667,667,667,667,667,667,667,667,667,667,
+667,667,667,667,667,667,667,667,667,667,667,667,667,667,667,667,
+667,667,667,667,667,667,667,667,667,667,667,667,667,667,667,667,
+661,661,661,661,661,661,661,661,661,661,661,661,661,661,661,661,
+661,661,661,661,661,661,661,661,661,661,661,661,661,661,661,661,
+661,661,661,662,662,663,662,662,663,662,662,664,662,663,120,120,
+668,668,668,668,668,668,668,668,668,668,120,120,120,120,120,120,
/* block 117 */
-656,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,
-657,657,657,657,657,657,657,657,657,657,657,657,656,657,657,657,
-657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,
-657,657,657,657,657,657,657,657,656,657,657,657,657,657,657,657,
-657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,
-657,657,657,657,656,657,657,657,657,657,657,657,657,657,657,657,
-657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,
-656,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,
+669,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,669,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,669,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,669,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+669,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
/* block 118 */
-657,657,657,657,657,657,657,657,657,657,657,657,656,657,657,657,
-657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,
-657,657,657,657,657,657,657,657,656,657,657,657,657,657,657,657,
-657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,
-657,657,657,657,656,657,657,657,657,657,657,657,657,657,657,657,
-657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,
-656,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,
-657,657,657,657,657,657,657,657,657,657,657,657,656,657,657,657,
+670,670,670,670,670,670,670,670,670,670,670,670,669,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,669,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,669,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+669,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,669,670,670,670,
/* block 119 */
-657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,
-657,657,657,657,657,657,657,657,656,657,657,657,657,657,657,657,
-657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,
-657,657,657,657,656,657,657,657,657,657,657,657,657,657,657,657,
-657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,
-656,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,
-657,657,657,657,657,657,657,657,657,657,657,657,656,657,657,657,
-657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,
+670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,669,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,669,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+669,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,669,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
/* block 120 */
-657,657,657,657,657,657,657,657,656,657,657,657,657,657,657,657,
-657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,
-657,657,657,657,656,657,657,657,657,657,657,657,657,657,657,657,
-657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,
-656,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,
-657,657,657,657,657,657,657,657,657,657,657,657,656,657,657,657,
-657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,
-657,657,657,657,657,657,657,657,656,657,657,657,657,657,657,657,
+670,670,670,670,670,670,670,670,669,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,669,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+669,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,669,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,669,670,670,670,670,670,670,670,
/* block 121 */
-657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,
-657,657,657,657,656,657,657,657,657,657,657,657,657,657,657,657,
-657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,
-656,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,
-657,657,657,657,657,657,657,657,657,657,657,657,656,657,657,657,
-657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,
-657,657,657,657,657,657,657,657,656,657,657,657,657,657,657,657,
-657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,
+670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,669,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+669,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,669,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,669,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
/* block 122 */
-657,657,657,657,656,657,657,657,657,657,657,657,657,657,657,657,
-657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,
-656,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,
-657,657,657,657,657,657,657,657,657,657,657,657,656,657,657,657,
-657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,
-657,657,657,657,657,657,657,657,656,657,657,657,657,657,657,657,
-657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,
-657,657,657,657,656,657,657,657,657,657,657,657,657,657,657,657,
+670,670,670,670,669,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+669,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,669,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,669,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,669,670,670,670,670,670,670,670,670,670,670,670,
/* block 123 */
-657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,
-656,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,
-657,657,657,657,657,657,657,657,657,657,657,657,656,657,657,657,
-657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,
-657,657,657,657,657,657,657,657,656,657,657,657,657,657,657,657,
-657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,
-657,657,657,657,656,657,657,657,657,657,657,657,657,657,657,657,
-657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,
+670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+669,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,669,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,669,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,669,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
/* block 124 */
-657,657,657,657,657,657,657,657,656,657,657,657,657,657,657,657,
-657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,
-657,657,657,657,119,119,119,119,119,119,119,119,119,119,119,119,
-356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,
-356,356,356,356,356,356,356,119,119,119,119,357,357,357,357,357,
-357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,
-357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,
-357,357,357,357,357,357,357,357,357,357,357,357,119,119,119,119,
+670,670,670,670,670,670,670,670,669,670,670,670,670,670,670,670,
+670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,
+670,670,670,670,120,120,120,120,120,120,120,120,120,120,120,120,
+358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,
+358,358,358,358,358,358,358,120,120,120,120,359,359,359,359,359,
+359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,
+359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,
+359,359,359,359,359,359,359,359,359,359,359,359,120,120,120,120,
/* block 125 */
-658,658,658,658,658,658,658,658,658,658,658,658,658,658,658,658,
-658,658,658,658,658,658,658,658,658,658,658,658,658,658,658,658,
-658,658,658,658,658,658,658,658,658,658,658,658,658,658,658,658,
-658,658,658,658,658,658,658,658,658,658,658,658,658,658,658,658,
-658,658,658,658,658,658,658,658,658,658,658,658,658,658,658,658,
-658,658,658,658,658,658,658,658,658,658,658,658,658,658,658,658,
-658,658,658,658,658,658,658,658,658,658,658,658,658,658,658,658,
-658,658,658,658,658,658,658,658,658,658,658,658,658,658,658,658,
+671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,
+671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,
+671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,
+671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,
+671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,
+671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,
+671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,
+671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,
/* block 126 */
-659,659,659,659,659,659,659,659,659,659,659,659,659,659,659,659,
-659,659,659,659,659,659,659,659,659,659,659,659,659,659,659,659,
-659,659,659,659,659,659,659,659,659,659,659,659,659,659,659,659,
-659,659,659,659,659,659,659,659,659,659,659,659,659,659,659,659,
-659,659,659,659,659,659,659,659,659,659,659,659,659,659,659,659,
-659,659,659,659,659,659,659,659,659,659,659,659,659,659,659,659,
-659,659,659,659,659,659,659,659,659,659,659,659,659,659,659,659,
-659,659,659,659,659,659,659,659,659,659,659,659,659,659,659,659,
+672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,
+672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,
+672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,
+672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,
+672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,
+672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,
+672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,
+672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,
/* block 127 */
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,119,119,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,120,120,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
/* block 128 */
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,577,577,577,577,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
/* block 129 */
- 35, 35, 35, 35, 35, 35, 35,119,119,119,119,119,119,119,119,119,
-119,119,119,205,205,205,205,205,119,119,119,119,119,214,211,214,
-214,214,214,214,214,214,214,214,214,660,214,214,214,214,214,214,
-214,214,214,214,214,214,214,119,214,214,214,214,214,119,214,119,
-214,214,119,214,214,119,214,214,214,214,214,214,214,214,214,214,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
+ 35, 35, 35, 35, 35, 35, 35,120,120,120,120,120,120,120,120,120,
+120,120,120,206,206,206,206,206,120,120,120,120,120,215,212,215,
+215,215,215,215,215,215,215,215,215,673,215,215,215,215,215,215,
+215,215,215,215,215,215,215,120,215,215,215,215,215,120,215,120,
+215,215,120,215,215,120,215,215,215,215,215,215,215,215,215,215,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
/* block 130 */
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,661,661,661,661,661,661,661,661,661,661,661,661,661,661,
-661,661,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,674,674,674,674,674,674,674,674,674,674,674,674,674,674,
+674,674,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
/* block 131 */
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
/* block 132 */
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224, 8, 7,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225, 8, 7,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
/* block 133 */
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-119,119,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-224,224,662,224,224,224,224,224,224,224,224,224,219,663,119,119,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+120,120,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+225,225,675,225,225,225,225,225,225,225,225,225,220,676,120,120,
/* block 134 */
-112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,
- 5, 5, 5, 5, 5, 5, 5, 7, 8, 5,119,119,119,119,119,119,
-112,112,112,112,112,112,112,112,112,112,112,112,112,112,543,543,
+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,
+ 5, 5, 5, 5, 5, 5, 5, 7, 8, 5,120,120,120,120,120,120,
+113,113,113,113,113,113,113,113,113,113,113,113,113,113,552,552,
5, 10, 10, 16, 16, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 7,
- 8, 7, 8, 7, 8,547,547, 7, 8, 5, 5, 5, 5, 16, 16, 16,
- 5, 5, 5,119, 5, 5, 5, 5, 10, 7, 8, 7, 8, 7, 8, 5,
- 5, 5, 9, 10, 9, 9, 9,119, 5, 6, 5, 5,119,119,119,119,
-224,224,224,224,224,119,224,224,224,224,224,224,224,224,224,224,
+ 8, 7, 8, 7, 8,556,556, 7, 8, 5, 5, 5, 5, 16, 16, 16,
+ 5, 5, 5,120, 5, 5, 5, 5, 10, 7, 8, 7, 8, 7, 8, 5,
+ 5, 5, 9, 10, 9, 9, 9,120, 5, 6, 5, 5,120,120,120,120,
+225,225,225,225,225,120,225,225,225,225,225,225,225,225,225,225,
/* block 135 */
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,119,119, 24,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,120,120, 24,
/* block 136 */
-119, 5, 5, 5, 6, 5, 5, 5, 7, 8, 5, 9, 5, 10, 5, 5,
+120, 5, 5, 5, 6, 5, 5, 5, 7, 8, 5, 9, 5, 10, 5, 5,
11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 5, 5, 9, 9, 9, 5,
5, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 7, 5, 8, 15, 16,
15, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 7, 9, 8, 9, 7,
- 8,546,551,552,546,546,569,569,569,569,569,569,569,569,569,569,
-560,569,569,569,569,569,569,569,569,569,569,569,569,569,569,569,
+ 8,555,560,561,555,555,578,578,578,578,578,578,578,578,578,578,
+569,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,
/* block 137 */
-569,569,569,569,569,569,569,569,569,569,569,569,569,569,569,569,
-569,569,569,569,569,569,569,569,569,569,569,569,569,569,664,664,
-572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,
-572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,119,
-119,119,572,572,572,572,572,572,119,119,572,572,572,572,572,572,
-119,119,572,572,572,572,572,572,119,119,572,572,572,119,119,119,
- 6, 6, 9, 15, 20, 6, 6,119, 20, 9, 9, 9, 9, 20, 20,119,
-502,502,502,502,502,502,502,502,502, 24, 24, 24, 20, 20,119,119,
+578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,
+578,578,578,578,578,578,578,578,578,578,578,578,578,578,677,677,
+581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,
+581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,120,
+120,120,581,581,581,581,581,581,120,120,581,581,581,581,581,581,
+120,120,581,581,581,581,581,581,120,120,581,581,581,120,120,120,
+ 6, 6, 9, 15, 20, 6, 6,120, 20, 9, 9, 9, 9, 20, 20,120,
+511,511,511,511,511,511,511,511,511, 24, 24, 24, 20, 20,120,120,
/* block 138 */
-665,665,665,665,665,665,665,665,665,665,665,665,119,665,665,665,
-665,665,665,665,665,665,665,665,665,665,665,665,665,665,665,665,
-665,665,665,665,665,665,665,119,665,665,665,665,665,665,665,665,
-665,665,665,665,665,665,665,665,665,665,665,119,665,665,119,665,
-665,665,665,665,665,665,665,665,665,665,665,665,665,665,119,119,
-665,665,665,665,665,665,665,665,665,665,665,665,665,665,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+678,678,678,678,678,678,678,678,678,678,678,678,120,678,678,678,
+678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,
+678,678,678,678,678,678,678,120,678,678,678,678,678,678,678,678,
+678,678,678,678,678,678,678,678,678,678,678,120,678,678,120,678,
+678,678,678,678,678,678,678,678,678,678,678,678,678,678,120,120,
+678,678,678,678,678,678,678,678,678,678,678,678,678,678,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
/* block 139 */
-665,665,665,665,665,665,665,665,665,665,665,665,665,665,665,665,
-665,665,665,665,665,665,665,665,665,665,665,665,665,665,665,665,
-665,665,665,665,665,665,665,665,665,665,665,665,665,665,665,665,
-665,665,665,665,665,665,665,665,665,665,665,665,665,665,665,665,
-665,665,665,665,665,665,665,665,665,665,665,665,665,665,665,665,
-665,665,665,665,665,665,665,665,665,665,665,665,665,665,665,665,
-665,665,665,665,665,665,665,665,665,665,665,665,665,665,665,665,
-665,665,665,665,665,665,665,665,665,665,665,119,119,119,119,119,
+678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,
+678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,
+678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,
+678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,
+678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,
+678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,
+678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,
+678,678,678,678,678,678,678,678,678,678,678,120,120,120,120,120,
/* block 140 */
-666,666,666,119,119,119,119,667,667,667,667,667,667,667,667,667,
-667,667,667,667,667,667,667,667,667,667,667,667,667,667,667,667,
-667,667,667,667,667,667,667,667,667,667,667,667,667,667,667,667,
-667,667,667,667,119,119,119,668,668,668,668,668,668,668,668,668,
-669,669,669,669,669,669,669,669,669,669,669,669,669,669,669,669,
-669,669,669,669,669,669,669,669,669,669,669,669,669,669,669,669,
-669,669,669,669,669,669,669,669,669,669,669,669,669,669,669,669,
-669,669,669,669,669,670,670,670,670,671,671,671,671,671,671,671,
+679,679,679,120,120,120,120,680,680,680,680,680,680,680,680,680,
+680,680,680,680,680,680,680,680,680,680,680,680,680,680,680,680,
+680,680,680,680,680,680,680,680,680,680,680,680,680,680,680,680,
+680,680,680,680,120,120,120,681,681,681,681,681,681,681,681,681,
+682,682,682,682,682,682,682,682,682,682,682,682,682,682,682,682,
+682,682,682,682,682,682,682,682,682,682,682,682,682,682,682,682,
+682,682,682,682,682,682,682,682,682,682,682,682,682,682,682,682,
+682,682,682,682,682,683,683,683,683,684,684,684,684,684,684,684,
/* block 141 */
-671,671,671,671,671,671,671,671,671,671,670,670,671,671,671,119,
- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,119,119,119,119,
-671,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+684,684,684,684,684,684,684,684,684,684,683,683,684,684,684,120,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,120,120,120,120,
+684,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,112,119,119,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,113,120,120,
/* block 142 */
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
/* block 143 */
-672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,
-672,672,672,672,672,672,672,672,672,672,672,672,672,119,119,119,
-673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,
-673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,
-673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,
-673,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-674,675,675,675,675,675,675,675,675,675,675,675,675,675,675,675,
-675,675,675,675,675,675,675,675,675,675,675,675,119,119,119,119,
+685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,
+685,685,685,685,685,685,685,685,685,685,685,685,685,120,120,120,
+686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,
+686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,
+686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,
+686,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+687,688,688,688,688,688,688,688,688,688,688,688,688,688,688,688,
+688,688,688,688,688,688,688,688,688,688,688,688,120,120,120,120,
/* block 144 */
-676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,
-676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,
-677,677,677,677,119,119,119,119,119,119,119,119,119,676,676,676,
-678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,
-678,679,678,678,678,678,678,678,678,678,679,119,119,119,119,119,
-680,680,680,680,680,680,680,680,680,680,680,680,680,680,680,680,
-680,680,680,680,680,680,680,680,680,680,680,680,680,680,680,680,
-680,680,680,680,680,680,681,681,681,681,681,119,119,119,119,119,
+689,689,689,689,689,689,689,689,689,689,689,689,689,689,689,689,
+689,689,689,689,689,689,689,689,689,689,689,689,689,689,689,689,
+690,690,690,690,120,120,120,120,120,120,120,120,120,689,689,689,
+691,691,691,691,691,691,691,691,691,691,691,691,691,691,691,691,
+691,692,691,691,691,691,691,691,691,691,692,120,120,120,120,120,
+693,693,693,693,693,693,693,693,693,693,693,693,693,693,693,693,
+693,693,693,693,693,693,693,693,693,693,693,693,693,693,693,693,
+693,693,693,693,693,693,694,694,694,694,694,120,120,120,120,120,
/* block 145 */
-682,682,682,682,682,682,682,682,682,682,682,682,682,682,682,682,
-682,682,682,682,682,682,682,682,682,682,682,682,682,682,119,683,
-684,684,684,684,684,684,684,684,684,684,684,684,684,684,684,684,
-684,684,684,684,684,684,684,684,684,684,684,684,684,684,684,684,
-684,684,684,684,119,119,119,119,684,684,684,684,684,684,684,684,
-685,686,686,686,686,686,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+695,695,695,695,695,695,695,695,695,695,695,695,695,695,695,695,
+695,695,695,695,695,695,695,695,695,695,695,695,695,695,120,696,
+697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,
+697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,
+697,697,697,697,120,120,120,120,697,697,697,697,697,697,697,697,
+698,699,699,699,699,699,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
/* block 146 */
-687,687,687,687,687,687,687,687,687,687,687,687,687,687,687,687,
-687,687,687,687,687,687,687,687,687,687,687,687,687,687,687,687,
-687,687,687,687,687,687,687,687,688,688,688,688,688,688,688,688,
-688,688,688,688,688,688,688,688,688,688,688,688,688,688,688,688,
-688,688,688,688,688,688,688,688,688,688,688,688,688,688,688,688,
-689,689,689,689,689,689,689,689,689,689,689,689,689,689,689,689,
-689,689,689,689,689,689,689,689,689,689,689,689,689,689,689,689,
-689,689,689,689,689,689,689,689,689,689,689,689,689,689,689,689,
+700,700,700,700,700,700,700,700,700,700,700,700,700,700,700,700,
+700,700,700,700,700,700,700,700,700,700,700,700,700,700,700,700,
+700,700,700,700,700,700,700,700,701,701,701,701,701,701,701,701,
+701,701,701,701,701,701,701,701,701,701,701,701,701,701,701,701,
+701,701,701,701,701,701,701,701,701,701,701,701,701,701,701,701,
+702,702,702,702,702,702,702,702,702,702,702,702,702,702,702,702,
+702,702,702,702,702,702,702,702,702,702,702,702,702,702,702,702,
+702,702,702,702,702,702,702,702,702,702,702,702,702,702,702,702,
/* block 147 */
-690,690,690,690,690,690,690,690,690,690,690,690,690,690,690,690,
-690,690,690,690,690,690,690,690,690,690,690,690,690,690,119,119,
-691,691,691,691,691,691,691,691,691,691,119,119,119,119,119,119,
-692,692,692,692,692,692,692,692,692,692,692,692,692,692,692,692,
-692,692,692,692,692,692,692,692,692,692,692,692,692,692,692,692,
-692,692,692,692,119,119,119,119,693,693,693,693,693,693,693,693,
-693,693,693,693,693,693,693,693,693,693,693,693,693,693,693,693,
-693,693,693,693,693,693,693,693,693,693,693,693,119,119,119,119,
+703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,
+703,703,703,703,703,703,703,703,703,703,703,703,703,703,120,120,
+704,704,704,704,704,704,704,704,704,704,120,120,120,120,120,120,
+705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,
+705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,
+705,705,705,705,120,120,120,120,706,706,706,706,706,706,706,706,
+706,706,706,706,706,706,706,706,706,706,706,706,706,706,706,706,
+706,706,706,706,706,706,706,706,706,706,706,706,120,120,120,120,
/* block 148 */
-694,694,694,694,694,694,694,694,694,694,694,694,694,694,694,694,
-694,694,694,694,694,694,694,694,694,694,694,694,694,694,694,694,
-694,694,694,694,694,694,694,694,119,119,119,119,119,119,119,119,
-695,695,695,695,695,695,695,695,695,695,695,695,695,695,695,695,
-695,695,695,695,695,695,695,695,695,695,695,695,695,695,695,695,
-695,695,695,695,695,695,695,695,695,695,695,695,695,695,695,695,
-695,695,695,695,119,119,119,119,119,119,119,119,119,119,119,696,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,
+707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,
+707,707,707,707,707,707,707,707,120,120,120,120,120,120,120,120,
+708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,
+708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,
+708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,
+708,708,708,708,120,120,120,120,120,120,120,120,120,120,120,709,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
/* block 149 */
-697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,
-697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,
-697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,
-697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,
-697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,
-697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,
-697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,
-697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,
+710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,
+710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,
+710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,
+710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,
+710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,
+710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,
+710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,
+710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,
/* block 150 */
-697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,
-697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,
-697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,
-697,697,697,697,697,697,697,119,119,119,119,119,119,119,119,119,
-697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,
-697,697,697,697,697,697,119,119,119,119,119,119,119,119,119,119,
-697,697,697,697,697,697,697,697,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,
+710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,
+710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,
+710,710,710,710,710,710,710,120,120,120,120,120,120,120,120,120,
+710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,
+710,710,710,710,710,710,120,120,120,120,120,120,120,120,120,120,
+710,710,710,710,710,710,710,710,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
/* block 151 */
-698,698,698,698,698,698,119,119,698,119,698,698,698,698,698,698,
-698,698,698,698,698,698,698,698,698,698,698,698,698,698,698,698,
-698,698,698,698,698,698,698,698,698,698,698,698,698,698,698,698,
-698,698,698,698,698,698,119,698,698,119,119,119,698,119,119,698,
-699,699,699,699,699,699,699,699,699,699,699,699,699,699,699,699,
-699,699,699,699,699,699,119,700,701,701,701,701,701,701,701,701,
-702,702,702,702,702,702,702,702,702,702,702,702,702,702,702,702,
-702,702,702,702,702,702,702,703,703,704,704,704,704,704,704,704,
+711,711,711,711,711,711,120,120,711,120,711,711,711,711,711,711,
+711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,
+711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,
+711,711,711,711,711,711,120,711,711,120,120,120,711,120,120,711,
+712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,
+712,712,712,712,712,712,120,713,714,714,714,714,714,714,714,714,
+715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,
+715,715,715,715,715,715,715,716,716,717,717,717,717,717,717,717,
/* block 152 */
-705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,
-705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,119,
-119,119,119,119,119,119,119,706,706,706,706,706,706,706,706,706,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,
-707,707,707,119,707,707,119,119,119,119,119,708,708,708,708,708,
+718,718,718,718,718,718,718,718,718,718,718,718,718,718,718,718,
+718,718,718,718,718,718,718,718,718,718,718,718,718,718,718,120,
+120,120,120,120,120,120,120,719,719,719,719,719,719,719,719,719,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,
+720,720,720,120,720,720,120,120,120,120,120,721,721,721,721,721,
/* block 153 */
-709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,
-709,709,709,709,709,709,710,710,710,710,710,710,119,119,119,711,
-712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,
-712,712,712,712,712,712,712,712,712,712,119,119,119,119,119,713,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+722,722,722,722,722,722,722,722,722,722,722,722,722,722,722,722,
+722,722,722,722,722,722,723,723,723,723,723,723,120,120,120,724,
+725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,
+725,725,725,725,725,725,725,725,725,725,120,120,120,120,120,726,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
/* block 154 */
-714,714,714,714,714,714,714,714,714,714,714,714,714,714,714,714,
-714,714,714,714,714,714,714,714,714,714,714,714,714,714,714,714,
-715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,
-715,715,715,715,715,715,715,715,119,119,119,119,716,716,715,715,
-716,716,716,716,716,716,716,716,716,716,716,716,716,716,716,716,
-119,119,716,716,716,716,716,716,716,716,716,716,716,716,716,716,
-716,716,716,716,716,716,716,716,716,716,716,716,716,716,716,716,
-716,716,716,716,716,716,716,716,716,716,716,716,716,716,716,716,
+727,727,727,727,727,727,727,727,727,727,727,727,727,727,727,727,
+727,727,727,727,727,727,727,727,727,727,727,727,727,727,727,727,
+728,728,728,728,728,728,728,728,728,728,728,728,728,728,728,728,
+728,728,728,728,728,728,728,728,120,120,120,120,729,729,728,728,
+729,729,729,729,729,729,729,729,729,729,729,729,729,729,729,729,
+120,120,729,729,729,729,729,729,729,729,729,729,729,729,729,729,
+729,729,729,729,729,729,729,729,729,729,729,729,729,729,729,729,
+729,729,729,729,729,729,729,729,729,729,729,729,729,729,729,729,
/* block 155 */
-717,718,718,718,119,718,718,119,119,119,119,119,718,718,718,718,
-717,717,717,717,119,717,717,717,119,717,717,717,717,717,717,717,
-717,717,717,717,717,717,717,717,717,717,717,717,717,717,717,717,
-717,717,717,717,717,717,119,119,718,718,718,119,119,119,119,718,
-719,719,719,719,719,719,719,719,719,119,119,119,119,119,119,119,
-720,720,720,720,720,720,720,720,720,119,119,119,119,119,119,119,
-721,721,721,721,721,721,721,721,721,721,721,721,721,721,721,721,
-721,721,721,721,721,721,721,721,721,721,721,721,721,722,722,723,
+730,731,731,731,120,731,731,120,120,120,120,120,731,731,731,731,
+730,730,730,730,120,730,730,730,120,730,730,730,730,730,730,730,
+730,730,730,730,730,730,730,730,730,730,730,730,730,730,730,730,
+730,730,730,730,730,730,120,120,731,731,731,120,120,120,120,731,
+732,732,732,732,732,732,732,732,732,120,120,120,120,120,120,120,
+733,733,733,733,733,733,733,733,733,120,120,120,120,120,120,120,
+734,734,734,734,734,734,734,734,734,734,734,734,734,734,734,734,
+734,734,734,734,734,734,734,734,734,734,734,734,734,735,735,736,
/* block 156 */
-724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,
-724,724,724,724,724,724,724,724,724,724,724,724,724,725,725,725,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-726,726,726,726,726,726,726,726,727,726,726,726,726,726,726,726,
-726,726,726,726,726,726,726,726,726,726,726,726,726,726,726,726,
-726,726,726,726,726,728,728,119,119,119,119,729,729,729,729,729,
-730,730,730,730,730,730,730,119,119,119,119,119,119,119,119,119,
+737,737,737,737,737,737,737,737,737,737,737,737,737,737,737,737,
+737,737,737,737,737,737,737,737,737,737,737,737,737,738,738,738,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+739,739,739,739,739,739,739,739,740,739,739,739,739,739,739,739,
+739,739,739,739,739,739,739,739,739,739,739,739,739,739,739,739,
+739,739,739,739,739,741,741,120,120,120,120,742,742,742,742,742,
+743,743,743,743,743,743,743,120,120,120,120,120,120,120,120,120,
/* block 157 */
-731,731,731,731,731,731,731,731,731,731,731,731,731,731,731,731,
-731,731,731,731,731,731,731,731,731,731,731,731,731,731,731,731,
-731,731,731,731,731,731,731,731,731,731,731,731,731,731,731,731,
-731,731,731,731,731,731,119,119,119,732,732,732,732,732,732,732,
-733,733,733,733,733,733,733,733,733,733,733,733,733,733,733,733,
-733,733,733,733,733,733,119,119,734,734,734,734,734,734,734,734,
-735,735,735,735,735,735,735,735,735,735,735,735,735,735,735,735,
-735,735,735,119,119,119,119,119,736,736,736,736,736,736,736,736,
+744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,
+744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,
+744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,
+744,744,744,744,744,744,120,120,120,745,745,745,745,745,745,745,
+746,746,746,746,746,746,746,746,746,746,746,746,746,746,746,746,
+746,746,746,746,746,746,120,120,747,747,747,747,747,747,747,747,
+748,748,748,748,748,748,748,748,748,748,748,748,748,748,748,748,
+748,748,748,120,120,120,120,120,749,749,749,749,749,749,749,749,
/* block 158 */
-737,737,737,737,737,737,737,737,737,737,737,737,737,737,737,737,
-737,737,119,119,119,119,119,119,119,738,738,738,738,119,119,119,
-119,119,119,119,119,119,119,119,119,739,739,739,739,739,739,739,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+750,750,750,750,750,750,750,750,750,750,750,750,750,750,750,750,
+750,750,120,120,120,120,120,120,120,751,751,751,751,120,120,120,
+120,120,120,120,120,120,120,120,120,752,752,752,752,752,752,752,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
/* block 159 */
-740,740,740,740,740,740,740,740,740,740,740,740,740,740,740,740,
-740,740,740,740,740,740,740,740,740,740,740,740,740,740,740,740,
-740,740,740,740,740,740,740,740,740,740,740,740,740,740,740,740,
-740,740,740,740,740,740,740,740,740,740,740,740,740,740,740,740,
-740,740,740,740,740,740,740,740,740,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+753,753,753,753,753,753,753,753,753,753,753,753,753,753,753,753,
+753,753,753,753,753,753,753,753,753,753,753,753,753,753,753,753,
+753,753,753,753,753,753,753,753,753,753,753,753,753,753,753,753,
+753,753,753,753,753,753,753,753,753,753,753,753,753,753,753,753,
+753,753,753,753,753,753,753,753,753,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
/* block 160 */
-741,741,741,741,741,741,741,741,741,741,741,741,741,741,741,741,
-741,741,741,741,741,741,741,741,741,741,741,741,741,741,741,741,
-741,741,741,741,741,741,741,741,741,741,741,741,741,741,741,741,
-741,741,741,119,119,119,119,119,119,119,119,119,119,119,119,119,
-742,742,742,742,742,742,742,742,742,742,742,742,742,742,742,742,
-742,742,742,742,742,742,742,742,742,742,742,742,742,742,742,742,
-742,742,742,742,742,742,742,742,742,742,742,742,742,742,742,742,
-742,742,742,119,119,119,119,119,119,119,743,743,743,743,743,743,
+754,754,754,754,754,754,754,754,754,754,754,754,754,754,754,754,
+754,754,754,754,754,754,754,754,754,754,754,754,754,754,754,754,
+754,754,754,754,754,754,754,754,754,754,754,754,754,754,754,754,
+754,754,754,120,120,120,120,120,120,120,120,120,120,120,120,120,
+755,755,755,755,755,755,755,755,755,755,755,755,755,755,755,755,
+755,755,755,755,755,755,755,755,755,755,755,755,755,755,755,755,
+755,755,755,755,755,755,755,755,755,755,755,755,755,755,755,755,
+755,755,755,120,120,120,120,120,120,120,756,756,756,756,756,756,
/* block 161 */
-744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,
-744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,
-744,744,744,744,745,745,745,745,119,119,119,119,119,119,119,119,
-746,746,746,746,746,746,746,746,746,746,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+757,757,757,757,757,757,757,757,757,757,757,757,757,757,757,757,
+757,757,757,757,757,757,757,757,757,757,757,757,757,757,757,757,
+757,757,757,757,758,758,758,758,120,120,120,120,120,120,120,120,
+759,759,759,759,759,759,759,759,759,759,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
/* block 162 */
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-747,747,747,747,747,747,747,747,747,747,747,747,747,747,747,747,
-747,747,747,747,747,747,747,747,747,747,747,747,747,747,747,119,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+760,760,760,760,760,760,760,760,760,760,760,760,760,760,760,760,
+760,760,760,760,760,760,760,760,760,760,760,760,760,760,760,120,
/* block 163 */
-748,748,748,748,748,748,748,748,748,748,748,748,748,748,748,748,
-748,748,748,748,748,748,748,748,748,748,748,748,748,749,749,749,
-749,749,749,749,749,749,749,748,119,119,119,119,119,119,119,119,
-750,750,750,750,750,750,750,750,750,750,750,750,750,750,750,750,
-750,750,750,750,750,750,751,751,751,751,751,751,751,751,751,751,
-751,752,752,752,752,753,753,753,753,753,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+761,761,761,761,761,761,761,761,761,761,761,761,761,761,761,761,
+761,761,761,761,761,761,761,761,761,761,761,761,761,762,762,762,
+762,762,762,762,762,762,762,761,120,120,120,120,120,120,120,120,
+763,763,763,763,763,763,763,763,763,763,763,763,763,763,763,763,
+763,763,763,763,763,763,764,764,764,764,764,764,764,764,764,764,
+764,765,765,765,765,766,766,766,766,766,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
/* block 164 */
-754,755,754,756,756,756,756,756,756,756,756,756,756,756,756,756,
-756,756,756,756,756,756,756,756,756,756,756,756,756,756,756,756,
-756,756,756,756,756,756,756,756,756,756,756,756,756,756,756,756,
-756,756,756,756,756,756,756,756,755,755,755,755,755,755,755,755,
-755,755,755,755,755,755,755,757,757,757,757,757,757,757,119,119,
-119,119,758,758,758,758,758,758,758,758,758,758,758,758,758,758,
-758,758,758,758,758,758,759,759,759,759,759,759,759,759,759,759,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,755,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+767,767,767,767,767,767,767,767,767,767,767,767,767,767,767,767,
+767,767,767,767,767,767,767,120,120,120,120,120,120,120,120,120,
/* block 165 */
-760,760,761,762,762,762,762,762,762,762,762,762,762,762,762,762,
-762,762,762,762,762,762,762,762,762,762,762,762,762,762,762,762,
-762,762,762,762,762,762,762,762,762,762,762,762,762,762,762,762,
-761,761,761,760,760,760,760,761,761,760,760,763,763,764,763,763,
-763,763,119,119,119,119,119,119,119,119,119,119,119,764,119,119,
-765,765,765,765,765,765,765,765,765,765,765,765,765,765,765,765,
-765,765,765,765,765,765,765,765,765,119,119,119,119,119,119,119,
-766,766,766,766,766,766,766,766,766,766,119,119,119,119,119,119,
+768,769,768,770,770,770,770,770,770,770,770,770,770,770,770,770,
+770,770,770,770,770,770,770,770,770,770,770,770,770,770,770,770,
+770,770,770,770,770,770,770,770,770,770,770,770,770,770,770,770,
+770,770,770,770,770,770,770,770,769,769,769,769,769,769,769,769,
+769,769,769,769,769,769,769,771,771,771,771,771,771,771,120,120,
+120,120,772,772,772,772,772,772,772,772,772,772,772,772,772,772,
+772,772,772,772,772,772,773,773,773,773,773,773,773,773,773,773,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,769,
/* block 166 */
-767,767,767,768,768,768,768,768,768,768,768,768,768,768,768,768,
-768,768,768,768,768,768,768,768,768,768,768,768,768,768,768,768,
-768,768,768,768,768,768,768,767,767,767,767,767,769,767,767,767,
-767,767,767,767,767,119,770,770,770,770,770,770,770,770,770,770,
-771,771,771,771,768,769,769,119,119,119,119,119,119,119,119,119,
-772,772,772,772,772,772,772,772,772,772,772,772,772,772,772,772,
-772,772,772,772,772,772,772,772,772,772,772,772,772,772,772,772,
-772,772,772,773,774,774,772,119,119,119,119,119,119,119,119,119,
+774,774,775,776,776,776,776,776,776,776,776,776,776,776,776,776,
+776,776,776,776,776,776,776,776,776,776,776,776,776,776,776,776,
+776,776,776,776,776,776,776,776,776,776,776,776,776,776,776,776,
+775,775,775,774,774,774,774,775,775,774,774,777,777,778,777,777,
+777,777,120,120,120,120,120,120,120,120,120,120,120,778,120,120,
+779,779,779,779,779,779,779,779,779,779,779,779,779,779,779,779,
+779,779,779,779,779,779,779,779,779,120,120,120,120,120,120,120,
+780,780,780,780,780,780,780,780,780,780,120,120,120,120,120,120,
/* block 167 */
-775,775,776,777,777,777,777,777,777,777,777,777,777,777,777,777,
-777,777,777,777,777,777,777,777,777,777,777,777,777,777,777,777,
-777,777,777,777,777,777,777,777,777,777,777,777,777,777,777,777,
-777,777,777,776,776,776,775,775,775,775,775,775,775,775,775,776,
-776,777,778,778,777,779,779,779,779,775,775,775,775,779,119,119,
-780,780,780,780,780,780,780,780,780,780,777,779,777,779,779,779,
-119,781,781,781,781,781,781,781,781,781,781,781,781,781,781,781,
-781,781,781,781,781,119,119,119,119,119,119,119,119,119,119,119,
+781,781,781,782,782,782,782,782,782,782,782,782,782,782,782,782,
+782,782,782,782,782,782,782,782,782,782,782,782,782,782,782,782,
+782,782,782,782,782,782,782,781,781,781,781,781,783,781,781,781,
+781,781,781,781,781,120,784,784,784,784,784,784,784,784,784,784,
+785,785,785,785,782,783,783,120,120,120,120,120,120,120,120,120,
+786,786,786,786,786,786,786,786,786,786,786,786,786,786,786,786,
+786,786,786,786,786,786,786,786,786,786,786,786,786,786,786,786,
+786,786,786,787,788,788,786,120,120,120,120,120,120,120,120,120,
/* block 168 */
-782,782,782,782,782,782,782,782,782,782,782,782,782,782,782,782,
-782,782,119,782,782,782,782,782,782,782,782,782,782,782,782,782,
-782,782,782,782,782,782,782,782,782,782,782,782,783,783,783,784,
-784,784,783,783,784,783,784,784,785,785,785,785,785,785,784,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+789,789,790,791,791,791,791,791,791,791,791,791,791,791,791,791,
+791,791,791,791,791,791,791,791,791,791,791,791,791,791,791,791,
+791,791,791,791,791,791,791,791,791,791,791,791,791,791,791,791,
+791,791,791,790,790,790,789,789,789,789,789,789,789,789,789,790,
+790,791,792,792,791,793,793,793,793,789,789,789,789,793,120,120,
+794,794,794,794,794,794,794,794,794,794,791,793,791,793,793,793,
+120,795,795,795,795,795,795,795,795,795,795,795,795,795,795,795,
+795,795,795,795,795,120,120,120,120,120,120,120,120,120,120,120,
/* block 169 */
-786,786,786,786,786,786,786,119,786,119,786,786,786,786,119,786,
-786,786,786,786,786,786,786,786,786,786,786,786,786,786,119,786,
-786,786,786,786,786,786,786,786,786,787,119,119,119,119,119,119,
-788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,
-788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,
-788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,789,
-790,790,790,789,789,789,789,789,789,789,789,119,119,119,119,119,
-791,791,791,791,791,791,791,791,791,791,119,119,119,119,119,119,
+796,796,796,796,796,796,796,796,796,796,796,796,796,796,796,796,
+796,796,120,796,796,796,796,796,796,796,796,796,796,796,796,796,
+796,796,796,796,796,796,796,796,796,796,796,796,797,797,797,798,
+798,798,797,797,798,797,798,798,799,799,799,799,799,799,798,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
/* block 170 */
-792,793,794,795,119,796,796,796,796,796,796,796,796,119,119,796,
-796,119,119,796,796,796,796,796,796,796,796,796,796,796,796,796,
-796,796,796,796,796,796,796,796,796,119,796,796,796,796,796,796,
-796,119,796,796,119,796,796,796,796,796,119,797,793,796,798,794,
-792,794,794,794,794,119,119,794,794,119,119,794,794,794,119,119,
-796,119,119,119,119,119,119,798,119,119,119,119,119,796,796,796,
-796,796,794,794,119,119,792,792,792,792,792,792,792,119,119,119,
-792,792,792,792,792,119,119,119,119,119,119,119,119,119,119,119,
+800,800,800,800,800,800,800,120,800,120,800,800,800,800,120,800,
+800,800,800,800,800,800,800,800,800,800,800,800,800,800,120,800,
+800,800,800,800,800,800,800,800,800,801,120,120,120,120,120,120,
+802,802,802,802,802,802,802,802,802,802,802,802,802,802,802,802,
+802,802,802,802,802,802,802,802,802,802,802,802,802,802,802,802,
+802,802,802,802,802,802,802,802,802,802,802,802,802,802,802,803,
+804,804,804,803,803,803,803,803,803,803,803,120,120,120,120,120,
+805,805,805,805,805,805,805,805,805,805,120,120,120,120,120,120,
/* block 171 */
-799,799,799,799,799,799,799,799,799,799,799,799,799,799,799,799,
-799,799,799,799,799,799,799,799,799,799,799,799,799,799,799,799,
-799,799,799,799,799,799,799,799,799,799,799,799,799,799,799,799,
-799,799,799,799,799,800,800,800,801,801,801,801,801,801,801,801,
-800,800,801,801,801,800,801,799,799,799,799,802,802,802,802,802,
-803,803,803,803,803,803,803,803,803,803,119,802,119,802,801,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+806,807,808,809,120,810,810,810,810,810,810,810,810,120,120,810,
+810,120,120,810,810,810,810,810,810,810,810,810,810,810,810,810,
+810,810,810,810,810,810,810,810,810,120,810,810,810,810,810,810,
+810,120,810,810,120,810,810,810,810,810,120,811,807,810,812,808,
+806,808,808,808,808,120,120,808,808,120,120,808,808,808,120,120,
+810,120,120,120,120,120,120,812,120,120,120,120,120,810,810,810,
+810,810,808,808,120,120,806,806,806,806,806,806,806,120,120,120,
+806,806,806,806,806,120,120,120,120,120,120,120,120,120,120,120,
/* block 172 */
-804,804,804,804,804,804,804,804,804,804,804,804,804,804,804,804,
-804,804,804,804,804,804,804,804,804,804,804,804,804,804,804,804,
-804,804,804,804,804,804,804,804,804,804,804,804,804,804,804,804,
-805,806,806,807,807,807,807,807,807,806,807,806,806,805,806,807,
-807,806,807,807,804,804,808,804,119,119,119,119,119,119,119,119,
-809,809,809,809,809,809,809,809,809,809,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+813,813,813,813,813,813,813,813,813,813,813,813,813,813,813,813,
+813,813,813,813,813,813,813,813,813,813,813,813,813,813,813,813,
+813,813,813,813,813,813,813,813,813,813,813,813,813,813,813,813,
+813,813,813,813,813,814,814,814,815,815,815,815,815,815,815,815,
+814,814,815,815,815,814,815,813,813,813,813,816,816,816,816,816,
+817,817,817,817,817,817,817,817,817,817,120,816,120,816,815,813,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
/* block 173 */
-810,810,810,810,810,810,810,810,810,810,810,810,810,810,810,810,
-810,810,810,810,810,810,810,810,810,810,810,810,810,810,810,810,
-810,810,810,810,810,810,810,810,810,810,810,810,810,810,810,811,
-812,812,813,813,813,813,119,119,812,812,812,812,813,813,812,813,
-813,814,814,814,814,814,814,814,814,814,814,814,814,814,814,814,
-814,814,814,814,814,814,814,814,810,810,810,810,813,813,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+818,818,818,818,818,818,818,818,818,818,818,818,818,818,818,818,
+818,818,818,818,818,818,818,818,818,818,818,818,818,818,818,818,
+818,818,818,818,818,818,818,818,818,818,818,818,818,818,818,818,
+819,820,820,821,821,821,821,821,821,820,821,820,820,819,820,821,
+821,820,821,821,818,818,822,818,120,120,120,120,120,120,120,120,
+823,823,823,823,823,823,823,823,823,823,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
/* block 174 */
-815,815,815,815,815,815,815,815,815,815,815,815,815,815,815,815,
-815,815,815,815,815,815,815,815,815,815,815,815,815,815,815,815,
-815,815,815,815,815,815,815,815,815,815,815,815,815,815,815,815,
-816,816,816,817,817,817,817,817,817,817,817,816,816,817,816,817,
-817,818,818,818,815,119,119,119,119,119,119,119,119,119,119,119,
-819,819,819,819,819,819,819,819,819,819,119,119,119,119,119,119,
-392,392,392,392,392,392,392,392,392,392,392,392,392,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+824,824,824,824,824,824,824,824,824,824,824,824,824,824,824,824,
+824,824,824,824,824,824,824,824,824,824,824,824,824,824,824,824,
+824,824,824,824,824,824,824,824,824,824,824,824,824,824,824,825,
+826,826,827,827,827,827,120,120,826,826,826,826,827,827,826,827,
+827,828,828,828,828,828,828,828,828,828,828,828,828,828,828,828,
+828,828,828,828,828,828,828,828,824,824,824,824,827,827,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
/* block 175 */
-820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,
-820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,
-820,820,820,820,820,820,820,820,820,820,820,821,822,821,822,822,
-821,821,821,821,821,821,822,821,119,119,119,119,119,119,119,119,
-823,823,823,823,823,823,823,823,823,823,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+829,829,829,829,829,829,829,829,829,829,829,829,829,829,829,829,
+829,829,829,829,829,829,829,829,829,829,829,829,829,829,829,829,
+829,829,829,829,829,829,829,829,829,829,829,829,829,829,829,829,
+830,830,830,831,831,831,831,831,831,831,831,830,830,831,830,831,
+831,832,832,832,829,120,120,120,120,120,120,120,120,120,120,120,
+833,833,833,833,833,833,833,833,833,833,120,120,120,120,120,120,
+395,395,395,395,395,395,395,395,395,395,395,395,395,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
/* block 176 */
-824,824,824,824,824,824,824,824,824,824,824,824,824,824,824,824,
-824,824,824,824,824,824,824,824,824,824,824,119,119,825,825,825,
-826,826,825,825,825,825,826,825,825,825,825,825,119,119,119,119,
-827,827,827,827,827,827,827,827,827,827,828,828,829,829,829,830,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+834,834,834,834,834,834,834,834,834,834,834,834,834,834,834,834,
+834,834,834,834,834,834,834,834,834,834,834,834,834,834,834,834,
+834,834,834,834,834,834,834,834,834,834,834,835,836,835,836,836,
+835,835,835,835,835,835,836,835,834,120,120,120,120,120,120,120,
+837,837,837,837,837,837,837,837,837,837,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
/* block 177 */
-831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,
-831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,
-831,831,831,831,831,831,831,831,831,831,831,831,832,832,832,833,
-833,833,833,833,833,833,833,833,832,833,833,834,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,
+838,838,838,838,838,838,838,838,838,838,838,120,120,839,839,839,
+840,840,839,839,839,839,840,839,839,839,839,839,120,120,120,120,
+841,841,841,841,841,841,841,841,841,841,842,842,843,843,843,844,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
/* block 178 */
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-835,835,835,835,835,835,835,835,835,835,835,835,835,835,835,835,
-835,835,835,835,835,835,835,835,835,835,835,835,835,835,835,835,
-836,836,836,836,836,836,836,836,836,836,836,836,836,836,836,836,
-836,836,836,836,836,836,836,836,836,836,836,836,836,836,836,836,
-837,837,837,837,837,837,837,837,837,837,838,838,838,838,838,838,
-838,838,838,119,119,119,119,119,119,119,119,119,119,119,119,839,
-
-/* block 179 */
-840,841,841,841,841,841,841,841,841,841,841,840,840,840,840,840,
-840,840,840,840,840,840,840,840,840,840,840,840,840,840,840,840,
-840,840,840,840,840,840,840,840,840,840,840,840,840,840,840,840,
-840,840,840,841,841,841,841,841,841,842,843,841,841,841,841,844,
-844,844,844,844,844,844,844,841,119,119,119,119,119,119,119,119,
-845,846,846,846,846,846,846,847,847,846,846,846,845,845,845,845,
845,845,845,845,845,845,845,845,845,845,845,845,845,845,845,845,
845,845,845,845,845,845,845,845,845,845,845,845,845,845,845,845,
+845,845,845,845,845,845,845,845,845,845,845,845,846,846,846,847,
+847,847,847,847,847,847,847,847,846,847,847,848,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
-/* block 180 */
-845,845,845,845,119,119,848,848,848,848,846,846,846,846,846,846,
-846,846,846,846,846,846,846,847,846,846,849,849,849,845,849,849,
-849,849,849,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-850,850,850,850,850,850,850,850,850,850,850,850,850,850,850,850,
+/* block 179 */
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+849,849,849,849,849,849,849,849,849,849,849,849,849,849,849,849,
+849,849,849,849,849,849,849,849,849,849,849,849,849,849,849,849,
850,850,850,850,850,850,850,850,850,850,850,850,850,850,850,850,
850,850,850,850,850,850,850,850,850,850,850,850,850,850,850,850,
-850,850,850,850,850,850,850,850,850,119,119,119,119,119,119,119,
+851,851,851,851,851,851,851,851,851,851,852,852,852,852,852,852,
+852,852,852,120,120,120,120,120,120,120,120,120,120,120,120,853,
+
+/* block 180 */
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+854,854,854,854,854,854,854,854,120,120,854,854,854,854,854,854,
+854,854,854,854,854,854,854,854,854,854,854,854,854,854,854,854,
+854,854,854,854,854,854,854,854,854,854,854,854,854,854,854,854,
+854,855,855,855,856,856,856,856,120,120,856,856,855,855,855,855,
+856,854,857,854,855,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
/* block 181 */
-851,851,851,851,851,851,851,851,851,119,851,851,851,851,851,851,
-851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,
-851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,852,
-853,853,853,853,853,853,853,119,853,853,853,853,853,853,852,853,
-851,854,854,854,854,854,119,119,119,119,119,119,119,119,119,119,
-855,855,855,855,855,855,855,855,855,855,856,856,856,856,856,856,
-856,856,856,856,856,856,856,856,856,856,856,856,856,119,119,119,
-857,857,858,858,858,858,858,858,858,858,858,858,858,858,858,858,
+858,859,859,859,859,859,859,859,859,859,859,858,858,858,858,858,
+858,858,858,858,858,858,858,858,858,858,858,858,858,858,858,858,
+858,858,858,858,858,858,858,858,858,858,858,858,858,858,858,858,
+858,858,858,859,859,859,859,859,859,860,861,859,859,859,859,862,
+862,862,862,862,862,862,862,859,120,120,120,120,120,120,120,120,
+863,864,864,864,864,864,864,865,865,864,864,864,863,863,863,863,
+863,863,863,863,863,863,863,863,863,863,863,863,863,863,863,863,
+863,863,863,863,863,863,863,863,863,863,863,863,863,863,863,863,
/* block 182 */
-858,858,858,858,858,858,858,858,858,858,858,858,858,858,858,858,
-119,119,859,859,859,859,859,859,859,859,859,859,859,859,859,859,
-859,859,859,859,859,859,859,859,119,860,859,859,859,859,859,859,
-859,860,859,859,860,859,859,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+863,863,863,863,866,866,866,866,866,866,864,864,864,864,864,864,
+864,864,864,864,864,864,864,865,864,864,867,867,867,863,867,867,
+867,867,867,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+868,868,868,868,868,868,868,868,868,868,868,868,868,868,868,868,
+868,868,868,868,868,868,868,868,868,868,868,868,868,868,868,868,
+868,868,868,868,868,868,868,868,868,868,868,868,868,868,868,868,
+868,868,868,868,868,868,868,868,868,120,120,120,120,120,120,120,
/* block 183 */
-861,861,861,861,861,861,861,119,861,861,119,861,861,861,861,861,
-861,861,861,861,861,861,861,861,861,861,861,861,861,861,861,861,
-861,861,861,861,861,861,861,861,861,861,861,861,861,861,861,861,
-861,862,862,862,862,862,862,119,119,119,862,119,862,862,119,862,
-862,862,862,862,862,862,863,862,119,119,119,119,119,119,119,119,
-864,864,864,864,864,864,864,864,864,864,119,119,119,119,119,119,
-865,865,865,865,865,865,119,865,865,119,865,865,865,865,865,865,
-865,865,865,865,865,865,865,865,865,865,865,865,865,865,865,865,
+869,869,869,869,869,869,869,869,869,120,869,869,869,869,869,869,
+869,869,869,869,869,869,869,869,869,869,869,869,869,869,869,869,
+869,869,869,869,869,869,869,869,869,869,869,869,869,869,869,870,
+871,871,871,871,871,871,871,120,871,871,871,871,871,871,870,871,
+869,872,872,872,872,872,120,120,120,120,120,120,120,120,120,120,
+873,873,873,873,873,873,873,873,873,873,874,874,874,874,874,874,
+874,874,874,874,874,874,874,874,874,874,874,874,874,120,120,120,
+875,875,876,876,876,876,876,876,876,876,876,876,876,876,876,876,
/* block 184 */
-865,865,865,865,865,865,865,865,865,865,866,866,866,866,866,119,
-867,867,119,866,866,867,866,867,865,119,119,119,119,119,119,119,
-868,868,868,868,868,868,868,868,868,868,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+876,876,876,876,876,876,876,876,876,876,876,876,876,876,876,876,
+120,120,877,877,877,877,877,877,877,877,877,877,877,877,877,877,
+877,877,877,877,877,877,877,877,120,878,877,877,877,877,877,877,
+877,878,877,877,878,877,877,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
/* block 185 */
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-869,869,869,869,869,869,869,869,869,869,869,869,869,869,869,869,
-869,869,869,870,870,871,871,872,872,119,119,119,119,119,119,119,
+879,879,879,879,879,879,879,120,879,879,120,879,879,879,879,879,
+879,879,879,879,879,879,879,879,879,879,879,879,879,879,879,879,
+879,879,879,879,879,879,879,879,879,879,879,879,879,879,879,879,
+879,880,880,880,880,880,880,120,120,120,880,120,880,880,120,880,
+880,880,880,880,880,880,881,880,120,120,120,120,120,120,120,120,
+882,882,882,882,882,882,882,882,882,882,120,120,120,120,120,120,
+883,883,883,883,883,883,120,883,883,120,883,883,883,883,883,883,
+883,883,883,883,883,883,883,883,883,883,883,883,883,883,883,883,
/* block 186 */
-873,873,873,873,873,873,873,873,873,873,873,873,873,873,873,873,
-873,873,873,873,873,873,873,873,873,873,873,873,873,873,873,873,
-873,873,873,873,873,873,873,873,873,873,873,873,873,873,873,873,
-873,873,873,873,873,873,873,873,873,873,873,873,873,873,873,873,
-873,873,873,873,873,873,873,873,873,873,873,873,873,873,873,873,
-873,873,873,873,873,873,873,873,873,873,873,873,873,873,873,873,
-873,873,873,873,873,873,873,873,873,873,873,873,873,873,873,873,
-873,873,873,873,873,873,873,873,873,873,873,873,873,873,873,873,
+883,883,883,883,883,883,883,883,883,883,884,884,884,884,884,120,
+885,885,120,884,884,885,884,885,883,120,120,120,120,120,120,120,
+886,886,886,886,886,886,886,886,886,886,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
/* block 187 */
-873,873,873,873,873,873,873,873,873,873,873,873,873,873,873,873,
-873,873,873,873,873,873,873,873,873,873,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+887,887,887,887,887,887,887,887,887,887,887,887,887,887,887,887,
+887,887,887,888,888,889,889,890,890,120,120,120,120,120,120,120,
/* block 188 */
-874,874,874,874,874,874,874,874,874,874,874,874,874,874,874,874,
-874,874,874,874,874,874,874,874,874,874,874,874,874,874,874,874,
-874,874,874,874,874,874,874,874,874,874,874,874,874,874,874,874,
-874,874,874,874,874,874,874,874,874,874,874,874,874,874,874,874,
-874,874,874,874,874,874,874,874,874,874,874,874,874,874,874,874,
-874,874,874,874,874,874,874,874,874,874,874,874,874,874,874,874,
-874,874,874,874,874,874,874,874,874,874,874,874,874,874,874,119,
-875,875,875,875,875,119,119,119,119,119,119,119,119,119,119,119,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+891,891,891,891,891,891,891,891,891,891,891,891,891,891,891,891,
+294,294,891,294,891,296,296,296,296,296,296,296,296,297,297,297,
+297,296,296,296,296,296,296,296,296,296,296,296,296,296,296,296,
+296,296,120,120,120,120,120,120,120,120,120,120,120,120,120,892,
/* block 189 */
-873,873,873,873,873,873,873,873,873,873,873,873,873,873,873,873,
-873,873,873,873,873,873,873,873,873,873,873,873,873,873,873,873,
-873,873,873,873,873,873,873,873,873,873,873,873,873,873,873,873,
-873,873,873,873,873,873,873,873,873,873,873,873,873,873,873,873,
-873,873,873,873,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,
+893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,
+893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,
+893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,
+893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,
+893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,
+893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,
+893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,
/* block 190 */
-876,876,876,876,876,876,876,876,876,876,876,876,876,876,876,876,
-876,876,876,876,876,876,876,876,876,876,876,876,876,876,876,876,
-876,876,876,876,876,876,876,876,876,876,876,876,876,876,876,876,
-876,876,876,876,876,876,876,876,876,876,876,876,876,876,876,876,
-876,876,876,876,876,876,876,876,876,876,876,876,876,876,876,876,
-876,876,876,876,876,876,876,876,876,876,876,876,876,876,876,876,
-876,876,876,876,876,876,876,876,876,876,876,876,876,876,876,876,
-876,876,876,876,876,876,876,876,876,876,876,876,876,876,876,876,
+893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,
+893,893,893,893,893,893,893,893,893,893,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
/* block 191 */
-876,876,876,876,876,876,876,876,876,876,876,876,876,876,876,876,
-876,876,876,876,876,876,876,876,876,876,876,876,876,876,876,876,
-876,876,876,876,876,876,876,876,876,876,876,876,876,876,876,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+894,894,894,894,894,894,894,894,894,894,894,894,894,894,894,894,
+894,894,894,894,894,894,894,894,894,894,894,894,894,894,894,894,
+894,894,894,894,894,894,894,894,894,894,894,894,894,894,894,894,
+894,894,894,894,894,894,894,894,894,894,894,894,894,894,894,894,
+894,894,894,894,894,894,894,894,894,894,894,894,894,894,894,894,
+894,894,894,894,894,894,894,894,894,894,894,894,894,894,894,894,
+894,894,894,894,894,894,894,894,894,894,894,894,894,894,894,120,
+895,895,895,895,895,120,120,120,120,120,120,120,120,120,120,120,
/* block 192 */
-877,877,877,877,877,877,877,877,877,877,877,877,877,877,877,877,
-877,877,877,877,877,877,877,877,877,877,877,877,877,877,877,877,
-877,877,877,877,877,877,877,877,877,877,877,877,877,877,877,877,
-877,877,877,877,877,877,877,877,877,877,877,877,877,877,877,877,
-877,877,877,877,877,877,877,877,877,877,877,877,877,877,877,877,
-877,877,877,877,877,877,877,877,877,877,877,877,877,877,877,877,
-877,877,877,877,877,877,877,877,877,877,877,877,877,877,877,877,
-877,877,877,877,877,877,877,877,877,877,877,877,877,877,877,877,
+893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,
+893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,
+893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,
+893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,
+893,893,893,893,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
/* block 193 */
-877,877,877,877,877,877,877,877,877,877,877,877,877,877,877,877,
-877,877,877,877,877,877,877,877,877,877,877,877,877,877,877,877,
-877,877,877,877,877,877,877,877,877,877,877,877,877,877,877,877,
-877,877,877,877,877,877,877,877,877,877,877,877,877,877,877,877,
-877,877,877,877,877,877,877,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,
+896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,
+896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,
+896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,
+896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,
+896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,
+896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,
+896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,
/* block 194 */
-592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,
-592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,
-592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,
-592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,
-592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,
-592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,
-592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,
-592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,
+896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,
+896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,
+896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,120,
+897,897,897,897,897,897,897,897,897,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
/* block 195 */
-592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,
-592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,
-592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,
-592,592,592,592,592,592,592,592,592,119,119,119,119,119,119,119,
-878,878,878,878,878,878,878,878,878,878,878,878,878,878,878,878,
-878,878,878,878,878,878,878,878,878,878,878,878,878,878,878,119,
-879,879,879,879,879,879,879,879,879,879,119,119,119,119,880,880,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,
+898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,
+898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,
+898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,
+898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,
+898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,
+898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,
+898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,
/* block 196 */
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-881,881,881,881,881,881,881,881,881,881,881,881,881,881,881,881,
-881,881,881,881,881,881,881,881,881,881,881,881,881,881,119,119,
-882,882,882,882,882,883,119,119,119,119,119,119,119,119,119,119,
+898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,
+898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,
+898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,
+898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,
+898,898,898,898,898,898,898,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
/* block 197 */
-884,884,884,884,884,884,884,884,884,884,884,884,884,884,884,884,
-884,884,884,884,884,884,884,884,884,884,884,884,884,884,884,884,
-884,884,884,884,884,884,884,884,884,884,884,884,884,884,884,884,
-885,885,885,885,885,885,885,886,886,886,886,886,887,887,887,887,
-888,888,888,888,886,887,119,119,119,119,119,119,119,119,119,119,
-889,889,889,889,889,889,889,889,889,889,119,890,890,890,890,890,
-890,890,119,884,884,884,884,884,884,884,884,884,884,884,884,884,
-884,884,884,884,884,884,884,884,119,119,119,119,119,884,884,884,
+601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,
+601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,
+601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,
+601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,
+601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,
+601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,
+601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,
+601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,
/* block 198 */
-884,884,884,884,884,884,884,884,884,884,884,884,884,884,884,884,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,
+601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,
+601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,
+601,601,601,601,601,601,601,601,601,120,120,120,120,120,120,120,
+899,899,899,899,899,899,899,899,899,899,899,899,899,899,899,899,
+899,899,899,899,899,899,899,899,899,899,899,899,899,899,899,120,
+900,900,900,900,900,900,900,900,900,900,120,120,120,120,901,901,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
/* block 199 */
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-891,891,891,891,891,891,891,891,891,891,891,891,891,891,891,891,
-891,891,891,891,891,891,891,891,891,891,891,891,891,891,891,891,
-892,892,892,892,892,892,892,892,892,892,892,892,892,892,892,892,
-892,892,892,892,892,892,892,892,892,892,892,892,892,892,892,892,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+902,902,902,902,902,902,902,902,902,902,902,902,902,902,902,902,
+902,902,902,902,902,902,902,902,902,902,902,902,902,902,120,120,
+903,903,903,903,903,904,120,120,120,120,120,120,120,120,120,120,
/* block 200 */
-893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,
-893,893,893,893,893,893,893,894,894,894,894,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+905,905,905,905,905,905,905,905,905,905,905,905,905,905,905,905,
+905,905,905,905,905,905,905,905,905,905,905,905,905,905,905,905,
+905,905,905,905,905,905,905,905,905,905,905,905,905,905,905,905,
+906,906,906,906,906,906,906,907,907,907,907,907,908,908,908,908,
+909,909,909,909,907,908,120,120,120,120,120,120,120,120,120,120,
+910,910,910,910,910,910,910,910,910,910,120,911,911,911,911,911,
+911,911,120,905,905,905,905,905,905,905,905,905,905,905,905,905,
+905,905,905,905,905,905,905,905,120,120,120,120,120,905,905,905,
/* block 201 */
-895,895,895,895,895,895,895,895,895,895,895,895,895,895,895,895,
-895,895,895,895,895,895,895,895,895,895,895,895,895,895,895,895,
-895,895,895,895,895,895,895,895,895,895,895,895,895,895,895,895,
-895,895,895,895,895,895,895,895,895,895,895,895,895,895,895,895,
-895,895,895,895,895,119,119,119,119,119,119,119,119,119,119,119,
-895,896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,
-896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,
-896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,119,
+905,905,905,905,905,905,905,905,905,905,905,905,905,905,905,905,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
/* block 202 */
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,897,
-897,897,897,898,898,898,898,898,898,898,898,898,898,898,898,898,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-899,900,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+912,912,912,912,912,912,912,912,912,912,912,912,912,912,912,912,
+912,912,912,912,912,912,912,912,912,912,912,912,912,912,912,912,
+913,913,913,913,913,913,913,913,913,913,913,913,913,913,913,913,
+913,913,913,913,913,913,913,913,913,913,913,913,913,913,913,913,
/* block 203 */
-901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,
-901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,
-901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,
-901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,
-901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,
-901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,
-901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,
-901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,
+914,914,914,914,914,914,914,914,914,914,914,914,914,914,914,914,
+914,914,914,914,914,914,914,915,915,915,915,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
/* block 204 */
-901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,
-901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,
-901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,
-901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,
-901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,
-901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,
-901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,
-901,901,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+916,916,916,916,916,916,916,916,916,916,916,916,916,916,916,916,
+916,916,916,916,916,916,916,916,916,916,916,916,916,916,916,916,
+916,916,916,916,916,916,916,916,916,916,916,916,916,916,916,916,
+916,916,916,916,916,916,916,916,916,916,916,916,916,916,916,916,
+916,916,916,916,916,916,916,916,916,916,916,120,120,120,120,917,
+916,918,918,918,918,918,918,918,918,918,918,918,918,918,918,918,
+918,918,918,918,918,918,918,918,918,918,918,918,918,918,918,918,
+918,918,918,918,918,918,918,918,918,918,918,918,918,918,918,918,
/* block 205 */
-901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,
-901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,
-901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,
-901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,
-901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,
-901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,
-901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,
-901,901,901,119,119,119,119,119,119,119,119,119,119,119,119,119,
+918,918,918,918,918,918,918,918,120,120,120,120,120,120,120,917,
+917,917,917,919,919,919,919,919,919,919,919,919,919,919,919,919,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+920,921, 5,111,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
/* block 206 */
-569,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,
-564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,
-564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,
-564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,
-564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,
-564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,
-564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,
-564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,
+922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,
+922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,
+922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,
+922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,
+922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,
+922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,
+922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,
+922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,
/* block 207 */
-564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,
-564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,
-564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,
-564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,
-564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,
-564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,
-564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,
-564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,
+922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,
+922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,
+922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,
+922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,
+922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,
+922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,
+922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,
+922,922,922,922,922,922,922,922,120,120,120,120,120,120,120,120,
/* block 208 */
-564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,
-564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-902,902,902,902,902,902,902,902,902,902,902,902,902,902,902,902,
+922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,
+922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,
+922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,
+922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,
+922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,
+922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,
+922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,
+922,922,922,120,120,120,120,120,120,120,120,120,120,120,120,120,
/* block 209 */
-902,902,902,902,902,902,902,902,902,902,902,902,902,902,902,902,
-902,902,902,902,902,902,902,902,902,902,902,902,902,902,902,902,
-902,902,902,902,902,902,902,902,902,902,902,902,902,902,902,902,
-902,902,902,902,902,902,902,902,902,902,902,902,902,902,902,902,
-902,902,902,902,902,902,902,902,902,902,902,902,902,902,902,902,
-902,902,902,902,902,902,902,902,902,902,902,902,902,902,902,902,
-902,902,902,902,902,902,902,902,902,902,902,902,902,902,902,902,
-902,902,902,902,902,902,902,902,902,902,902,902,902,902,902,902,
+578,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,
+573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,
+573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,
+573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,
+573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,
+573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,
+573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,
+573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,
/* block 210 */
-902,902,902,902,902,902,902,902,902,902,902,902,902,902,902,902,
-902,902,902,902,902,902,902,902,902,902,902,902,902,902,902,902,
-902,902,902,902,902,902,902,902,902,902,902,902,902,902,902,902,
-902,902,902,902,902,902,902,902,902,902,902,902,902,902,902,902,
-902,902,902,902,902,902,902,902,902,902,902,902,902,902,902,902,
-902,902,902,902,902,902,902,902,902,902,902,902,902,902,902,902,
-902,902,902,902,902,902,902,902,902,902,902,902,902,902,902,902,
-902,902,902,902,902,902,902,902,902,902,902,902,119,119,119,119,
+573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,
+573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,
+573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,
+573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,
+573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,
+573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,
+573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,
+573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,
/* block 211 */
-903,903,903,903,903,903,903,903,903,903,903,903,903,903,903,903,
-903,903,903,903,903,903,903,903,903,903,903,903,903,903,903,903,
-903,903,903,903,903,903,903,903,903,903,903,903,903,903,903,903,
-903,903,903,903,903,903,903,903,903,903,903,903,903,903,903,903,
-903,903,903,903,903,903,903,903,903,903,903,903,903,903,903,903,
-903,903,903,903,903,903,903,903,903,903,903,903,903,903,903,903,
-903,903,903,903,903,903,903,903,903,903,903,119,119,119,119,119,
-903,903,903,903,903,903,903,903,903,903,903,903,903,119,119,119,
+573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,
+573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+573,573,573,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,578,578,578,578,120,120,120,120,120,120,120,120,
+923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
/* block 212 */
-903,903,903,903,903,903,903,903,903,119,119,119,119,119,119,119,
-903,903,903,903,903,903,903,903,903,903,119,119,904,905,905,906,
-907,907,907,907,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
+923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
+923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
+923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
+923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
+923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
+923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
+923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
/* block 213 */
+923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
+923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
+923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
+923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
+923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
+923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
+923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
+923,923,923,923,923,923,923,923,923,923,923,923,120,120,120,120,
+
+/* block 214 */
+924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,
+924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,
+924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,
+924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,
+924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,
+924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,
+924,924,924,924,924,924,924,924,924,924,924,120,120,120,120,120,
+924,924,924,924,924,924,924,924,924,924,924,924,924,120,120,120,
+
+/* block 215 */
+924,924,924,924,924,924,924,924,924,120,120,120,120,120,120,120,
+924,924,924,924,924,924,924,924,924,924,120,120,925,926,926,927,
+928,928,928,928,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+
+/* block 216 */
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
@@ -3802,309 +3867,339 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 68608 bytes, block = 128 */
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
- 20, 20, 20, 20, 20, 20,119,119,119,119,119,119,119,119,119,119,
+ 20, 20, 20, 20, 20, 20,120,120,120,120,120,120,120,120,120,120,
-/* block 214 */
+/* block 217 */
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
- 20, 20, 20, 20, 20, 20, 20,119,119, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20,120,120, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
- 20, 20, 20, 20, 20,908,909,112,112,112, 20, 20, 20,909,908,908,
-908,908,908, 24, 24, 24, 24, 24, 24, 24, 24,112,112,112,112,112,
+ 20, 20, 20, 20, 20,929,930,113,113,113, 20, 20, 20,930,929,929,
+929,929,929, 24, 24, 24, 24, 24, 24, 24, 24,113,113,113,113,113,
-/* block 215 */
-112,112,112, 20, 20,112,112,112,112,112,112,112, 20, 20, 20, 20,
+/* block 218 */
+113,113,113, 20, 20,113,113,113,113,113,113,113, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,112,112,112,112, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,113,113,113,113, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
- 20, 20, 20, 20, 20, 20, 20, 20, 20,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
-/* block 216 */
-671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,
-671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,
-671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,
-671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,
-671,671,910,910,910,671,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+/* block 219 */
+684,684,684,684,684,684,684,684,684,684,684,684,684,684,684,684,
+684,684,684,684,684,684,684,684,684,684,684,684,684,684,684,684,
+684,684,684,684,684,684,684,684,684,684,684,684,684,684,684,684,
+684,684,684,684,684,684,684,684,684,684,684,684,684,684,684,684,
+684,684,931,931,931,684,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
-/* block 217 */
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+/* block 220 */
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
- 25, 25, 25, 25,119,119,119,119,119,119,119,119,119,119,119,119,
+ 25, 25, 25, 25,120,120,120,120,120,120,120,120,120,120,120,120,
-/* block 218 */
+/* block 221 */
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
- 20, 20, 20, 20, 20, 20, 20,119,119,119,119,119,119,119,119,119,
-573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,
-573,573, 25, 25, 25, 25, 25, 25, 25,119,119,119,119,119,119,119,
-
-/* block 219 */
-504,504,504,504,504,504,504,504,504,504,504,504,504,504,504,504,
-504,504,504,504,504,504,504,504,504,504,505,505,505,505,505,505,
-505,505,505,505,505,505,505,505,505,505,505,505,505,505,505,505,
-505,505,505,505,504,504,504,504,504,504,504,504,504,504,504,504,
-504,504,504,504,504,504,504,504,504,504,504,504,504,504,505,505,
-505,505,505,505,505,119,505,505,505,505,505,505,505,505,505,505,
-505,505,505,505,505,505,505,505,504,504,504,504,504,504,504,504,
-504,504,504,504,504,504,504,504,504,504,504,504,504,504,504,504,
-
-/* block 220 */
-504,504,505,505,505,505,505,505,505,505,505,505,505,505,505,505,
-505,505,505,505,505,505,505,505,505,505,505,505,504,119,504,504,
-119,119,504,119,119,504,504,119,119,504,504,504,504,119,504,504,
-504,504,504,504,504,504,505,505,505,505,119,505,119,505,505,505,
-505,505,505,505,119,505,505,505,505,505,505,505,505,505,505,505,
-504,504,504,504,504,504,504,504,504,504,504,504,504,504,504,504,
-504,504,504,504,504,504,504,504,504,504,505,505,505,505,505,505,
-505,505,505,505,505,505,505,505,505,505,505,505,505,505,505,505,
-
-/* block 221 */
-505,505,505,505,504,504,119,504,504,504,504,119,119,504,504,504,
-504,504,504,504,504,119,504,504,504,504,504,504,504,119,505,505,
-505,505,505,505,505,505,505,505,505,505,505,505,505,505,505,505,
-505,505,505,505,505,505,505,505,504,504,119,504,504,504,504,119,
-504,504,504,504,504,119,504,119,119,119,504,504,504,504,504,504,
-504,119,505,505,505,505,505,505,505,505,505,505,505,505,505,505,
-505,505,505,505,505,505,505,505,505,505,505,505,504,504,504,504,
-504,504,504,504,504,504,504,504,504,504,504,504,504,504,504,504,
+ 20, 20, 20, 20, 20, 20, 20,120,120,120,120,120,120,120,120,120,
+582,582,582,582,582,582,582,582,582,582,582,582,582,582,582,582,
+582,582, 25, 25, 25, 25, 25, 25, 25,120,120,120,120,120,120,120,
/* block 222 */
-504,504,504,504,504,504,505,505,505,505,505,505,505,505,505,505,
-505,505,505,505,505,505,505,505,505,505,505,505,505,505,505,505,
-504,504,504,504,504,504,504,504,504,504,504,504,504,504,504,504,
-504,504,504,504,504,504,504,504,504,504,505,505,505,505,505,505,
-505,505,505,505,505,505,505,505,505,505,505,505,505,505,505,505,
-505,505,505,505,504,504,504,504,504,504,504,504,504,504,504,504,
-504,504,504,504,504,504,504,504,504,504,504,504,504,504,505,505,
-505,505,505,505,505,505,505,505,505,505,505,505,505,505,505,505,
+513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,
+513,513,513,513,513,513,513,513,513,513,514,514,514,514,514,514,
+514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,
+514,514,514,514,513,513,513,513,513,513,513,513,513,513,513,513,
+513,513,513,513,513,513,513,513,513,513,513,513,513,513,514,514,
+514,514,514,514,514,120,514,514,514,514,514,514,514,514,514,514,
+514,514,514,514,514,514,514,514,513,513,513,513,513,513,513,513,
+513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,
/* block 223 */
-505,505,505,505,505,505,505,505,504,504,504,504,504,504,504,504,
-504,504,504,504,504,504,504,504,504,504,504,504,504,504,504,504,
-504,504,505,505,505,505,505,505,505,505,505,505,505,505,505,505,
-505,505,505,505,505,505,505,505,505,505,505,505,504,504,504,504,
-504,504,504,504,504,504,504,504,504,504,504,504,504,504,504,504,
-504,504,504,504,504,504,505,505,505,505,505,505,505,505,505,505,
-505,505,505,505,505,505,505,505,505,505,505,505,505,505,505,505,
-504,504,504,504,504,504,504,504,504,504,504,504,504,504,504,504,
+513,513,514,514,514,514,514,514,514,514,514,514,514,514,514,514,
+514,514,514,514,514,514,514,514,514,514,514,514,513,120,513,513,
+120,120,513,120,120,513,513,120,120,513,513,513,513,120,513,513,
+513,513,513,513,513,513,514,514,514,514,120,514,120,514,514,514,
+514,514,514,514,120,514,514,514,514,514,514,514,514,514,514,514,
+513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,
+513,513,513,513,513,513,513,513,513,513,514,514,514,514,514,514,
+514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,
/* block 224 */
-504,504,504,504,504,504,504,504,504,504,505,505,505,505,505,505,
-505,505,505,505,505,505,505,505,505,505,505,505,505,505,505,505,
-505,505,505,505,505,505,119,119,504,504,504,504,504,504,504,504,
-504,504,504,504,504,504,504,504,504,504,504,504,504,504,504,504,
-504, 9,505,505,505,505,505,505,505,505,505,505,505,505,505,505,
-505,505,505,505,505,505,505,505,505,505,505, 9,505,505,505,505,
-505,505,504,504,504,504,504,504,504,504,504,504,504,504,504,504,
-504,504,504,504,504,504,504,504,504,504,504, 9,505,505,505,505,
+514,514,514,514,513,513,120,513,513,513,513,120,120,513,513,513,
+513,513,513,513,513,120,513,513,513,513,513,513,513,120,514,514,
+514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,
+514,514,514,514,514,514,514,514,513,513,120,513,513,513,513,120,
+513,513,513,513,513,120,513,120,120,120,513,513,513,513,513,513,
+513,120,514,514,514,514,514,514,514,514,514,514,514,514,514,514,
+514,514,514,514,514,514,514,514,514,514,514,514,513,513,513,513,
+513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,
/* block 225 */
-505,505,505,505,505,505,505,505,505,505,505,505,505,505,505,505,
-505,505,505,505,505, 9,505,505,505,505,505,505,504,504,504,504,
-504,504,504,504,504,504,504,504,504,504,504,504,504,504,504,504,
-504,504,504,504,504, 9,505,505,505,505,505,505,505,505,505,505,
-505,505,505,505,505,505,505,505,505,505,505,505,505,505,505, 9,
-505,505,505,505,505,505,504,504,504,504,504,504,504,504,504,504,
-504,504,504,504,504,504,504,504,504,504,504,504,504,504,504, 9,
-505,505,505,505,505,505,505,505,505,505,505,505,505,505,505,505,
+513,513,513,513,513,513,514,514,514,514,514,514,514,514,514,514,
+514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,
+513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,
+513,513,513,513,513,513,513,513,513,513,514,514,514,514,514,514,
+514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,
+514,514,514,514,513,513,513,513,513,513,513,513,513,513,513,513,
+513,513,513,513,513,513,513,513,513,513,513,513,513,513,514,514,
+514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,
/* block 226 */
-505,505,505,505,505,505,505,505,505, 9,505,505,505,505,505,505,
-504,504,504,504,504,504,504,504,504,504,504,504,504,504,504,504,
-504,504,504,504,504,504,504,504,504, 9,505,505,505,505,505,505,
-505,505,505,505,505,505,505,505,505,505,505,505,505,505,505,505,
-505,505,505, 9,505,505,505,505,505,505,504,505,119,119, 11, 11,
- 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
- 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
- 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+514,514,514,514,514,514,514,514,513,513,513,513,513,513,513,513,
+513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,
+513,513,514,514,514,514,514,514,514,514,514,514,514,514,514,514,
+514,514,514,514,514,514,514,514,514,514,514,514,513,513,513,513,
+513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,
+513,513,513,513,513,513,514,514,514,514,514,514,514,514,514,514,
+514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,
+513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,
/* block 227 */
-911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,
-911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,
-911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,
-911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,
-911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,
-911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,
-911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,
-911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,
+513,513,513,513,513,513,513,513,513,513,514,514,514,514,514,514,
+514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,
+514,514,514,514,514,514,120,120,513,513,513,513,513,513,513,513,
+513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,
+513, 9,514,514,514,514,514,514,514,514,514,514,514,514,514,514,
+514,514,514,514,514,514,514,514,514,514,514, 9,514,514,514,514,
+514,514,513,513,513,513,513,513,513,513,513,513,513,513,513,513,
+513,513,513,513,513,513,513,513,513,513,513, 9,514,514,514,514,
/* block 228 */
-912,912,912,912,912,912,912,912,912,912,912,912,912,912,912,912,
-912,912,912,912,912,912,912,912,912,912,912,912,912,912,912,912,
-912,912,912,912,912,912,912,912,912,912,912,912,912,912,912,912,
-912,912,912,912,912,912,912,911,911,911,911,912,912,912,912,912,
-912,912,912,912,912,912,912,912,912,912,912,912,912,912,912,912,
-912,912,912,912,912,912,912,912,912,912,912,912,912,912,912,912,
-912,912,912,912,912,912,912,912,912,912,912,912,912,911,911,911,
-911,911,911,911,911,912,911,911,911,911,911,911,911,911,911,911,
+514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,
+514,514,514,514,514, 9,514,514,514,514,514,514,513,513,513,513,
+513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,
+513,513,513,513,513, 9,514,514,514,514,514,514,514,514,514,514,
+514,514,514,514,514,514,514,514,514,514,514,514,514,514,514, 9,
+514,514,514,514,514,514,513,513,513,513,513,513,513,513,513,513,
+513,513,513,513,513,513,513,513,513,513,513,513,513,513,513, 9,
+514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,
/* block 229 */
-911,911,911,911,912,911,911,913,913,913,913,913,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,912,912,912,912,912,
-119,912,912,912,912,912,912,912,912,912,912,912,912,912,912,912,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+514,514,514,514,514,514,514,514,514, 9,514,514,514,514,514,514,
+513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,
+513,513,513,513,513,513,513,513,513, 9,514,514,514,514,514,514,
+514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,
+514,514,514, 9,514,514,514,514,514,514,513,514,120,120, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
/* block 230 */
-914,914,914,914,914,914,914,119,914,914,914,914,914,914,914,914,
-914,914,914,914,914,914,914,914,914,119,119,914,914,914,914,914,
-914,914,119,914,914,119,914,914,914,914,914,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,
+932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,
+932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,
+932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,
+932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,
+932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,
+932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,
+932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,
/* block 231 */
-915,915,915,915,915,915,915,915,915,915,915,915,915,915,915,915,
-915,915,915,915,915,915,915,915,915,915,915,915,915,915,915,915,
-915,915,915,915,915,915,915,915,915,915,915,915,915,915,915,915,
-915,915,915,915,915,915,915,915,915,915,915,915,915,915,915,915,
-915,915,915,915,915,915,915,915,915,915,915,915,915,915,915,915,
-915,915,915,915,915,915,915,915,915,915,915,915,915,915,915,915,
-915,915,915,915,915,915,915,915,915,915,915,915,915,915,915,915,
-915,915,915,915,915,915,915,915,915,915,915,915,915,915,915,915,
+933,933,933,933,933,933,933,933,933,933,933,933,933,933,933,933,
+933,933,933,933,933,933,933,933,933,933,933,933,933,933,933,933,
+933,933,933,933,933,933,933,933,933,933,933,933,933,933,933,933,
+933,933,933,933,933,933,933,932,932,932,932,933,933,933,933,933,
+933,933,933,933,933,933,933,933,933,933,933,933,933,933,933,933,
+933,933,933,933,933,933,933,933,933,933,933,933,933,933,933,933,
+933,933,933,933,933,933,933,933,933,933,933,933,933,932,932,932,
+932,932,932,932,932,933,932,932,932,932,932,932,932,932,932,932,
/* block 232 */
-915,915,915,915,915,915,915,915,915,915,915,915,915,915,915,915,
-915,915,915,915,915,915,915,915,915,915,915,915,915,915,915,915,
-915,915,915,915,915,915,915,915,915,915,915,915,915,915,915,915,
-915,915,915,915,915,915,915,915,915,915,915,915,915,915,915,915,
-915,915,915,915,915,119,119,916,916,916,916,916,916,916,916,916,
-917,917,917,917,917,917,917,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+932,932,932,932,933,932,932,934,934,934,934,934,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,933,933,933,933,933,
+120,933,933,933,933,933,933,933,933,933,933,933,933,933,933,933,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
/* block 233 */
-918,918,918,918,918,918,918,918,918,918,918,918,918,918,918,918,
-918,918,918,918,918,918,918,918,918,918,918,918,918,918,918,918,
-918,918,919,919,919,919,919,919,919,919,919,919,919,919,919,919,
-919,919,919,919,919,919,919,919,919,919,919,919,919,919,919,919,
-919,919,919,919,920,920,920,920,920,920,920,119,119,119,119,119,
-921,921,921,921,921,921,921,921,921,921,119,119,119,119,922,922,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+935,935,935,935,935,935,935,120,935,935,935,935,935,935,935,935,
+935,935,935,935,935,935,935,935,935,120,120,935,935,935,935,935,
+935,935,120,935,935,120,935,935,935,935,935,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
/* block 234 */
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+936,936,936,936,936,936,936,936,936,936,936,936,936,936,936,936,
+936,936,936,936,936,936,936,936,936,936,936,936,936,936,936,936,
+936,936,936,936,936,936,936,936,936,936,936,936,936,120,120,120,
+937,937,937,937,937,937,937,938,938,938,938,938,938,938,120,120,
+939,939,939,939,939,939,939,939,939,939,120,120,120,120,936,940,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
/* block 235 */
- 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
- 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
- 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 20, 25, 25, 25,
- 6, 25, 25, 25, 25,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+941,941,941,941,941,941,941,941,941,941,941,941,941,941,941,941,
+941,941,941,941,941,941,941,941,941,941,941,941,941,941,941,941,
+941,941,941,941,941,941,941,941,941,941,941,941,942,942,942,942,
+943,943,943,943,943,943,943,943,943,943,120,120,120,120,120,944,
/* block 236 */
-224,224,224,224,119,224,224,224,224,224,224,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
-119,224,224,119,224,119,119,224,119,224,224,224,224,224,224,224,
-224,224,224,119,224,224,224,224,119,224,119,224,119,119,119,119,
-119,119,224,119,119,119,119,224,119,224,119,224,119,224,224,224,
-119,224,224,119,224,119,119,224,119,224,119,224,119,224,119,224,
-119,224,224,119,224,119,119,224,224,224,224,119,224,224,224,224,
-224,224,224,119,224,224,224,224,119,224,224,224,224,119,224,119,
+945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,
+945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,
+945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,
+945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,
+945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,
+945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,
+945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,
+945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,
/* block 237 */
-224,224,224,224,224,224,224,224,224,224,119,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,119,119,119,119,
-119,224,224,224,119,224,224,224,224,224,119,224,224,224,224,224,
-224,224,224,224,224,224,224,224,224,224,224,224,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-217,217,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,
+945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,
+945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,
+945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,
+945,945,945,945,945,120,120,946,946,946,946,946,946,946,946,946,
+947,947,947,947,947,947,947,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
/* block 238 */
+948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,
+948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,
+948,948,949,949,949,949,949,949,949,949,949,949,949,949,949,949,
+949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,
+949,949,949,949,950,950,950,950,950,950,950,951,120,120,120,120,
+952,952,952,952,952,952,952,952,952,952,120,120,120,120,953,953,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+
+/* block 239 */
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+
+/* block 240 */
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 20, 25, 25, 25,
+ 6, 25, 25, 25, 25,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+
+/* block 241 */
+120, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 20, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+
+/* block 242 */
+225,225,225,225,120,225,225,225,225,225,225,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,
+120,225,225,120,225,120,120,225,120,225,225,225,225,225,225,225,
+225,225,225,120,225,225,225,225,120,225,120,225,120,120,120,120,
+120,120,225,120,120,120,120,225,120,225,120,225,120,225,225,225,
+120,225,225,120,225,120,120,225,120,225,120,225,120,225,120,225,
+120,225,225,120,225,120,120,225,225,225,225,120,225,225,225,225,
+225,225,225,120,225,225,225,225,120,225,225,225,225,120,225,120,
+
+/* block 243 */
+225,225,225,225,225,225,225,225,225,225,120,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,120,120,120,120,
+120,225,225,225,120,225,225,225,225,225,120,225,225,225,225,225,
+225,225,225,225,225,225,225,225,225,225,225,225,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+218,218,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+
+/* block 244 */
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,923,923,923,923,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,954,954,954,954,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
-/* block 239 */
+/* block 245 */
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
- 21, 21, 21, 21,923,923,923,923,923,923,923,923,923,923,923,923,
- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,923,
-923, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
-923, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
-923, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21,954,954,954,954,954,954,954,954,954,954,954,954,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,954,
+954, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+954, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+954, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
- 21, 21, 21, 21, 21, 21,923,923,923,923,923,923,923,923,923,923,
+ 21, 21, 21, 21, 21, 21,954,954,954,954,954,954,954,954,954,954,
-/* block 240 */
- 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,923,923,923,
+/* block 246 */
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,954,954,954,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,923,923,923,923,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21,954,954,954,
21, 21, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21,
-/* block 241 */
+/* block 247 */
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 20,
20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 20, 20, 20, 20, 20,
- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,923,923,923,
-923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
-923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
-923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
-923,923,923,923,923,923,924,924,924,924,924,924,924,924,924,924,
-924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,955,955,955,955,955,955,955,955,955,955,
+955,955,955,955,955,955,955,955,955,955,955,955,955,955,955,955,
-/* block 242 */
-925, 21, 21,923,923,923,923,923,923,923,923,923,923,923,923,923,
+/* block 248 */
+956, 21, 21,954,954,954,954,954,954,954,954,954,954,954,954,954,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21,
- 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 20,923,923,923,923,
- 20, 20, 20, 20, 20, 20, 20, 20, 20,923,923,923,923,923,923,923,
-575,575,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
- 21, 21, 21, 21, 21, 21,923,923,923,923,923,923,923,923,923,923,
-923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
+ 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 20,954,954,954,954,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20,954,954,954,954,954,954,954,
+584,584,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+ 21, 21, 21, 21, 21, 21,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
-/* block 243 */
-923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
-923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
-923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
-923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
-923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
-923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
-923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
-923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
+/* block 249 */
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
-/* block 244 */
+/* block 250 */
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
@@ -4114,7 +4209,7 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 68608 bytes, block = 128 */
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
-/* block 245 */
+/* block 251 */
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
@@ -4122,9 +4217,9 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 68608 bytes, block = 128 */
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,926,926,926,926,926,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,957,957,957,957,957,
-/* block 246 */
+/* block 252 */
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
@@ -4134,7 +4229,7 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 68608 bytes, block = 128 */
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
-/* block 247 */
+/* block 253 */
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
@@ -4144,17 +4239,17 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 68608 bytes, block = 128 */
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
-/* block 248 */
+/* block 254 */
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
- 21, 21, 21, 21, 21,923,923,923,923,923,923,923,923,923,923,923,
- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,923,923,923,
- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,923,923,923,923,923,923,
+ 21, 21, 21, 21, 21, 21,954,954,954,954,954,954,954,954,954,954,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,954,954,954,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,954,954,954,954,954,
-/* block 249 */
+/* block 255 */
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
@@ -4162,187 +4257,197 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 68608 bytes, block = 128 */
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
- 20, 20, 20, 20,923,923,923,923,923,923,923,923,923,923,923,923,
+ 20, 20, 20, 20,954,954,954,954,954,954,954,954,954,954,954,954,
-/* block 250 */
+/* block 256 */
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
- 20, 20, 20, 20, 20, 21, 21, 21, 21,923,923,923,923,923,923,923,
-923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
-923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
+ 20, 20, 20, 20, 20, 21, 21, 21, 21,954,954,954,954,954,954,954,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
-/* block 251 */
- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,923,923,923,923,
+/* block 257 */
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,954,954,954,954,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
- 20, 20, 20, 20, 20, 20, 20, 20,923,923,923,923,923,923,923,923,
- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,923,923,923,923,923,923,
+ 20, 20, 20, 20, 20, 20, 20, 20,954,954,954,954,954,954,954,954,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,954,954,954,954,954,954,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
-/* block 252 */
- 20, 20, 20, 20, 20, 20, 20, 20,923,923,923,923,923,923,923,923,
+/* block 258 */
+ 20, 20, 20, 20, 20, 20, 20, 20,954,954,954,954,954,954,954,954,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,923,923,
-923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
-923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
-923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
-923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
-923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
-/* block 253 */
- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,923,923,923,923,
+/* block 259 */
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,954, 21, 21, 21,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 20, 21, 21, 21,923,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 20, 21, 21, 21, 21,
21, 21, 21, 21, 21, 21, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
- 21,923,923, 21, 21, 21, 21,923,923,923, 21,923, 21, 21, 21, 21,
+ 21, 21,954, 21, 21, 21, 21,954,954,954, 21, 21, 21, 21, 21, 21,
-/* block 254 */
+/* block 260 */
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
- 21, 21, 21,923,923,923,923,923,923,923,923,923,923,923,923,923,
- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,923,923,923,923,923,923,
- 21, 21, 21,923,923,923,923,923,923,923,923,923,923,923,923,923,
+ 21, 21, 21,954,954, 21, 21, 21, 21, 21, 21,954,954,954, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,954,954, 21, 21, 21,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
-
-/* block 255 */
-923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
-923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
-923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
-923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
-923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
-923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,923,923,
-923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
-
-/* block 256 */
-923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
-923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
-923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
-923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
-923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
-923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
-923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,
-923,923,923,923,923,923,923,923,923,923,923,923,923,923,119,119,
-
-/* block 257 */
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,577,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-
-/* block 258 */
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,119,119,119,119,119,119,119,119,119,119,119,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-
-/* block 259 */
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,119,119,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-
-/* block 260 */
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
/* block 261 */
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21,954,954,954,954,954,954,954,954,954,954,954,954,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,954,954,
+ 21, 21, 21, 21,954,954,954,954, 21, 21, 21,954,954,954,954,954,
/* block 262 */
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,
-577,577,577,577,577,577,577,577,577,577,577,577,577,577,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+ 21, 21, 21,954,954,954,954,954,954,954,954,954,954,954,954,954,
+ 21, 21, 21, 21, 21, 21,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
/* block 263 */
-502, 24,502,502,502,502,502,502,502,502,502,502,502,502,502,502,
-502,502,502,502,502,502,502,502,502,502,502,502,502,502,502,502,
-927,927,927,927,927,927,927,927,927,927,927,927,927,927,927,927,
-927,927,927,927,927,927,927,927,927,927,927,927,927,927,927,927,
-927,927,927,927,927,927,927,927,927,927,927,927,927,927,927,927,
-927,927,927,927,927,927,927,927,927,927,927,927,927,927,927,927,
-927,927,927,927,927,927,927,927,927,927,927,927,927,927,927,927,
-927,927,927,927,927,927,927,927,927,927,927,927,927,927,927,927,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,
+954,954,954,954,954,954,954,954,954,954,954,954,954,954,120,120,
/* block 264 */
-502,502,502,502,502,502,502,502,502,502,502,502,502,502,502,502,
-502,502,502,502,502,502,502,502,502,502,502,502,502,502,502,502,
-502,502,502,502,502,502,502,502,502,502,502,502,502,502,502,502,
-502,502,502,502,502,502,502,502,502,502,502,502,502,502,502,502,
-502,502,502,502,502,502,502,502,502,502,502,502,502,502,502,502,
-502,502,502,502,502,502,502,502,502,502,502,502,502,502,502,502,
-502,502,502,502,502,502,502,502,502,502,502,502,502,502,502,502,
-502,502,502,502,502,502,502,502,502,502,502,502,502,502,502,502,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
/* block 265 */
-112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,
-112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,
-112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,
-112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,
-112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,
-112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,
-112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,
-112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,120,120,120,120,120,120,120,120,120,120,120,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
/* block 266 */
-112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,
-112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,
-112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,
-112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,
-112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,
-112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,
-112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,
-502,502,502,502,502,502,502,502,502,502,502,502,502,502,502,502,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,120,120,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
/* block 267 */
-659,659,659,659,659,659,659,659,659,659,659,659,659,659,659,659,
-659,659,659,659,659,659,659,659,659,659,659,659,659,659,659,659,
-659,659,659,659,659,659,659,659,659,659,659,659,659,659,659,659,
-659,659,659,659,659,659,659,659,659,659,659,659,659,659,659,659,
-659,659,659,659,659,659,659,659,659,659,659,659,659,659,659,659,
-659,659,659,659,659,659,659,659,659,659,659,659,659,659,659,659,
-659,659,659,659,659,659,659,659,659,659,659,659,659,659,659,659,
-659,659,659,659,659,659,659,659,659,659,659,659,659,659,119,119,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+
+/* block 268 */
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+
+/* block 269 */
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
+
+/* block 270 */
+511, 24,511,511,511,511,511,511,511,511,511,511,511,511,511,511,
+511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,
+958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,
+958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,
+958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,
+958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,
+958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,
+958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,
+
+/* block 271 */
+511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,
+511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,
+511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,
+511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,
+511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,
+511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,
+511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,
+511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,
+
+/* block 272 */
+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,
+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,
+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,
+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,
+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,
+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,
+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,
+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,
+
+/* block 273 */
+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,
+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,
+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,
+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,
+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,
+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,
+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,
+511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,
+
+/* block 274 */
+672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,
+672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,
+672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,
+672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,
+672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,
+672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,
+672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,
+672,672,672,672,672,672,672,672,672,672,672,672,672,672,120,120,
};
diff --git a/thirdparty/pcre2/src/pcre2_ucp.h b/thirdparty/pcre2/src/pcre2_ucp.h
index 483abd18fc..84b22fb064 100644
--- a/thirdparty/pcre2/src/pcre2_ucp.h
+++ b/thirdparty/pcre2/src/pcre2_ucp.h
@@ -281,7 +281,12 @@ enum {
ucp_Makasar,
ucp_Medefaidrin,
ucp_Old_Sogdian,
- ucp_Sogdian
+ ucp_Sogdian,
+ /* New for Unicode 12.0.0 */
+ ucp_Elymaic,
+ ucp_Nandinagari,
+ ucp_Nyiakeng_Puachue_Hmong,
+ ucp_Wancho
};
#endif /* PCRE2_UCP_H_IDEMPOTENT_GUARD */
diff --git a/thirdparty/pcre2/src/sljit/sljitConfigInternal.h b/thirdparty/pcre2/src/sljit/sljitConfigInternal.h
index ba60311e45..acba9da4be 100644
--- a/thirdparty/pcre2/src/sljit/sljitConfigInternal.h
+++ b/thirdparty/pcre2/src/sljit/sljitConfigInternal.h
@@ -214,6 +214,10 @@
#define SLJIT_MEMCPY(dest, src, len) memcpy(dest, src, len)
#endif
+#ifndef SLJIT_MEMMOVE
+#define SLJIT_MEMMOVE(dest, src, len) memmove(dest, src, len)
+#endif
+
#ifndef SLJIT_ZEROMEM
#define SLJIT_ZEROMEM(dest, len) memset(dest, 0, len)
#endif
diff --git a/thirdparty/pcre2/src/sljit/sljitExecAllocator.c b/thirdparty/pcre2/src/sljit/sljitExecAllocator.c
index 3b37a9751f..92ddb94914 100644
--- a/thirdparty/pcre2/src/sljit/sljitExecAllocator.c
+++ b/thirdparty/pcre2/src/sljit/sljitExecAllocator.c
@@ -118,10 +118,20 @@ static SLJIT_INLINE int get_map_jit_flag()
if (map_jit_flag == -1) {
struct utsname name;
+ map_jit_flag = 0;
uname(&name);
/* Kernel version for 10.14.0 (Mojave) */
- map_jit_flag = (atoi(name.release) >= 18) ? MAP_JIT : 0;
+ if (atoi(name.release) >= 18) {
+ /* Only use MAP_JIT if a hardened runtime is used, because MAP_JIT is incompatible with fork(). */
+ void *ptr = mmap(NULL, getpagesize(), PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
+
+ if (ptr == MAP_FAILED) {
+ map_jit_flag = MAP_JIT;
+ } else {
+ munmap(ptr, getpagesize());
+ }
+ }
}
return map_jit_flag;
@@ -137,6 +147,7 @@ static SLJIT_INLINE int get_map_jit_flag()
static SLJIT_INLINE void* alloc_chunk(sljit_uw size)
{
void *retval;
+ const int prot = PROT_READ | PROT_WRITE | PROT_EXEC;
#ifdef MAP_ANON
@@ -146,16 +157,25 @@ static SLJIT_INLINE void* alloc_chunk(sljit_uw size)
flags |= get_map_jit_flag();
#endif
- retval = mmap(NULL, size, PROT_READ | PROT_WRITE | PROT_EXEC, flags, -1, 0);
+ retval = mmap(NULL, size, prot, flags, -1, 0);
#else /* !MAP_ANON */
if (dev_zero < 0) {
if (open_dev_zero())
return NULL;
}
- retval = mmap(NULL, size, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE, dev_zero, 0);
+ retval = mmap(NULL, size, prot, MAP_PRIVATE, dev_zero, 0);
#endif /* MAP_ANON */
- return (retval != MAP_FAILED) ? retval : NULL;
+ if (retval == MAP_FAILED)
+ retval = NULL;
+ else {
+ if (mprotect(retval, size, prot) < 0) {
+ munmap(retval, size);
+ retval = NULL;
+ }
+ }
+
+ return retval;
}
static SLJIT_INLINE void free_chunk(void *chunk, sljit_uw size)
diff --git a/thirdparty/pcre2/src/sljit/sljitLir.c b/thirdparty/pcre2/src/sljit/sljitLir.c
index ded9541b31..9bab0c3ec6 100644
--- a/thirdparty/pcre2/src/sljit/sljitLir.c
+++ b/thirdparty/pcre2/src/sljit/sljitLir.c
@@ -144,6 +144,7 @@
#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
# define PATCH_MD 0x10
#endif
+# define TYPE_SHIFT 13
#endif
#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7)
@@ -521,6 +522,12 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_set_target(struct sljit_jump *jump, sljit_uw
}
}
+SLJIT_API_FUNC_ATTRIBUTE void sljit_set_put_label(struct sljit_put_label *put_label, struct sljit_label *label)
+{
+ if (SLJIT_LIKELY(!!put_label))
+ put_label->label = label;
+}
+
SLJIT_API_FUNC_ATTRIBUTE void sljit_set_current_flags(struct sljit_compiler *compiler, sljit_s32 current_flags)
{
SLJIT_UNUSED_ARG(compiler);
@@ -620,6 +627,30 @@ static SLJIT_INLINE sljit_s32 get_arg_count(sljit_s32 arg_types)
return arg_count;
}
+#if !(defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
+
+static SLJIT_INLINE sljit_uw compute_next_addr(struct sljit_label *label, struct sljit_jump *jump,
+ struct sljit_const *const_, struct sljit_put_label *put_label)
+{
+ sljit_uw result = ~(sljit_uw)0;
+
+ if (label)
+ result = label->size;
+
+ if (jump && jump->addr < result)
+ result = jump->addr;
+
+ if (const_ && const_->addr < result)
+ result = const_->addr;
+
+ if (put_label && put_label->addr < result)
+ result = put_label->addr;
+
+ return result;
+}
+
+#endif /* !SLJIT_CONFIG_X86 */
+
static SLJIT_INLINE void set_emit_enter(struct sljit_compiler *compiler,
sljit_s32 options, sljit_s32 args, sljit_s32 scratches, sljit_s32 saveds,
sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)
@@ -687,6 +718,19 @@ static SLJIT_INLINE void set_const(struct sljit_const *const_, struct sljit_comp
compiler->last_const = const_;
}
+static SLJIT_INLINE void set_put_label(struct sljit_put_label *put_label, struct sljit_compiler *compiler, sljit_uw offset)
+{
+ put_label->next = NULL;
+ put_label->label = NULL;
+ put_label->addr = compiler->size - offset;
+ put_label->flags = 0;
+ if (compiler->last_put_label)
+ compiler->last_put_label->next = put_label;
+ else
+ compiler->put_labels = put_label;
+ compiler->last_put_label = put_label;
+}
+
#define ADDRESSING_DEPENDS_ON(exp, reg) \
(((exp) & SLJIT_MEM) && (((exp) & REG_MASK) == reg || OFFS_REG(exp) == reg))
@@ -1905,6 +1949,21 @@ static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_const(struct sljit_compil
CHECK_RETURN_OK;
}
+static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_put_label(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw)
+{
+#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
+ FUNCTION_CHECK_DST(dst, dstw, 0);
+#endif
+#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
+ if (SLJIT_UNLIKELY(!!compiler->verbose)) {
+ fprintf(compiler->verbose, " put_label ");
+ sljit_verbose_param(compiler, dst, dstw);
+ fprintf(compiler->verbose, "\n");
+ }
+#endif
+ CHECK_RETURN_OK;
+}
+
#endif /* SLJIT_ARGUMENT_CHECKS || SLJIT_VERBOSE */
#define SELECT_FOP1_OPERATION_WITH_CHECKS(compiler, op, dst, dstw, src, srcw) \
@@ -2581,6 +2640,14 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compi
return NULL;
}
+SLJIT_API_FUNC_ATTRIBUTE struct sljit_put_label* sljit_emit_put_label(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw)
+{
+ SLJIT_UNUSED_ARG(compiler);
+ SLJIT_UNUSED_ARG(dst);
+ SLJIT_UNUSED_ARG(dstw);
+ return NULL;
+}
+
SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target, sljit_sw executable_offset)
{
SLJIT_UNUSED_ARG(addr);
@@ -2597,4 +2664,4 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_consta
SLJIT_UNREACHABLE();
}
-#endif
+#endif /* !SLJIT_CONFIG_UNSUPPORTED */
diff --git a/thirdparty/pcre2/src/sljit/sljitLir.h b/thirdparty/pcre2/src/sljit/sljitLir.h
index e71890cf7b..836d25cf71 100644
--- a/thirdparty/pcre2/src/sljit/sljitLir.h
+++ b/thirdparty/pcre2/src/sljit/sljitLir.h
@@ -348,13 +348,20 @@ struct sljit_label {
struct sljit_jump {
struct sljit_jump *next;
sljit_uw addr;
- sljit_sw flags;
+ sljit_uw flags;
union {
sljit_uw target;
- struct sljit_label* label;
+ struct sljit_label *label;
} u;
};
+struct sljit_put_label {
+ struct sljit_put_label *next;
+ struct sljit_label *label;
+ sljit_uw addr;
+ sljit_uw flags;
+};
+
struct sljit_const {
struct sljit_const *next;
sljit_uw addr;
@@ -366,10 +373,12 @@ struct sljit_compiler {
struct sljit_label *labels;
struct sljit_jump *jumps;
+ struct sljit_put_label *put_labels;
struct sljit_const *consts;
struct sljit_label *last_label;
struct sljit_jump *last_jump;
struct sljit_const *last_const;
+ struct sljit_put_label *last_put_label;
void *allocator_data;
struct sljit_memory_fragment *buf;
@@ -1314,10 +1323,17 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fmem(struct sljit_compiler *compil
Flags: - (may destroy flags) */
SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_local_base(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw offset);
-/* The constant can be changed runtime (see: sljit_set_const)
+/* Store a value that can be changed runtime (see: sljit_get_const_addr / sljit_set_const)
Flags: - (does not modify flags) */
SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw init_value);
+/* Store the value of a label (see: sljit_set_put_label)
+ Flags: - (does not modify flags) */
+SLJIT_API_FUNC_ATTRIBUTE struct sljit_put_label* sljit_emit_put_label(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw);
+
+/* Set the value stored by put_label to this label. */
+SLJIT_API_FUNC_ATTRIBUTE void sljit_set_put_label(struct sljit_put_label *put_label, struct sljit_label *label);
+
/* After the code generation the address for label, jump and const instructions
are computed. Since these structures are freed by sljit_free_compiler, the
addresses must be preserved by the user program elsewere. */
diff --git a/thirdparty/pcre2/src/sljit/sljitNativeARM_32.c b/thirdparty/pcre2/src/sljit/sljitNativeARM_32.c
index 6d61eed9a7..71f7bcdadb 100644
--- a/thirdparty/pcre2/src/sljit/sljitNativeARM_32.c
+++ b/thirdparty/pcre2/src/sljit/sljitNativeARM_32.c
@@ -583,8 +583,9 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
sljit_uw *buf_end;
sljit_uw size;
sljit_uw word_count;
+ sljit_uw next_addr;
sljit_sw executable_offset;
- sljit_sw jump_addr;
+ sljit_sw addr;
#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
sljit_uw cpool_size;
sljit_uw cpool_skip_alignment;
@@ -597,6 +598,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
struct sljit_label *label;
struct sljit_jump *jump;
struct sljit_const *const_;
+ struct sljit_put_label *put_label;
CHECK_ERROR_PTR();
CHECK_PTR(check_sljit_generate_code(compiler));
@@ -625,11 +627,13 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
code_ptr = code;
word_count = 0;
+ next_addr = 1;
executable_offset = SLJIT_EXEC_OFFSET(code);
label = compiler->labels;
jump = compiler->jumps;
const_ = compiler->consts;
+ put_label = compiler->put_labels;
if (label && label->size == 0) {
label->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code, executable_offset);
@@ -669,35 +673,45 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
else if ((*buf_ptr & 0xff000000) != PUSH_POOL) {
#endif
*code_ptr = *buf_ptr++;
+ if (next_addr == word_count) {
+ SLJIT_ASSERT(!label || label->size >= word_count);
+ SLJIT_ASSERT(!jump || jump->addr >= word_count);
+ SLJIT_ASSERT(!const_ || const_->addr >= word_count);
+ SLJIT_ASSERT(!put_label || put_label->addr >= word_count);
+
/* These structures are ordered by their address. */
- SLJIT_ASSERT(!label || label->size >= word_count);
- SLJIT_ASSERT(!jump || jump->addr >= word_count);
- SLJIT_ASSERT(!const_ || const_->addr >= word_count);
- if (jump && jump->addr == word_count) {
+ if (jump && jump->addr == word_count) {
#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
- if (detect_jump_type(jump, code_ptr, code, executable_offset))
- code_ptr--;
- jump->addr = (sljit_uw)code_ptr;
+ if (detect_jump_type(jump, code_ptr, code, executable_offset))
+ code_ptr--;
+ jump->addr = (sljit_uw)code_ptr;
#else
- jump->addr = (sljit_uw)(code_ptr - 2);
- if (detect_jump_type(jump, code_ptr, code, executable_offset))
- code_ptr -= 2;
+ jump->addr = (sljit_uw)(code_ptr - 2);
+ if (detect_jump_type(jump, code_ptr, code, executable_offset))
+ code_ptr -= 2;
#endif
- jump = jump->next;
- }
- if (label && label->size == word_count) {
- /* code_ptr can be affected above. */
- label->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr + 1, executable_offset);
- label->size = (code_ptr + 1) - code;
- label = label->next;
- }
- if (const_ && const_->addr == word_count) {
+ jump = jump->next;
+ }
+ if (label && label->size == word_count) {
+ /* code_ptr can be affected above. */
+ label->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr + 1, executable_offset);
+ label->size = (code_ptr + 1) - code;
+ label = label->next;
+ }
+ if (const_ && const_->addr == word_count) {
#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
- const_->addr = (sljit_uw)code_ptr;
+ const_->addr = (sljit_uw)code_ptr;
#else
- const_->addr = (sljit_uw)(code_ptr - 1);
+ const_->addr = (sljit_uw)(code_ptr - 1);
#endif
- const_ = const_->next;
+ const_ = const_->next;
+ }
+ if (put_label && put_label->addr == word_count) {
+ SLJIT_ASSERT(put_label->label);
+ put_label->addr = (sljit_uw)code_ptr;
+ put_label = put_label->next;
+ }
+ next_addr = compute_next_addr(label, jump, const_, put_label);
}
code_ptr++;
#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
@@ -725,6 +739,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
SLJIT_ASSERT(!label);
SLJIT_ASSERT(!jump);
SLJIT_ASSERT(!const_);
+ SLJIT_ASSERT(!put_label);
#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
SLJIT_ASSERT(cpool_size == 0);
@@ -755,15 +770,15 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
buf_ptr = (sljit_uw *)jump->addr;
if (jump->flags & PATCH_B) {
- jump_addr = (sljit_sw)SLJIT_ADD_EXEC_OFFSET(buf_ptr + 2, executable_offset);
+ addr = (sljit_sw)SLJIT_ADD_EXEC_OFFSET(buf_ptr + 2, executable_offset);
if (!(jump->flags & JUMP_ADDR)) {
SLJIT_ASSERT(jump->flags & JUMP_LABEL);
- SLJIT_ASSERT(((sljit_sw)jump->u.label->addr - jump_addr) <= 0x01ffffff && ((sljit_sw)jump->u.label->addr - jump_addr) >= -0x02000000);
- *buf_ptr |= (((sljit_sw)jump->u.label->addr - jump_addr) >> 2) & 0x00ffffff;
+ SLJIT_ASSERT(((sljit_sw)jump->u.label->addr - addr) <= 0x01ffffff && ((sljit_sw)jump->u.label->addr - addr) >= -0x02000000);
+ *buf_ptr |= (((sljit_sw)jump->u.label->addr - addr) >> 2) & 0x00ffffff;
}
else {
- SLJIT_ASSERT(((sljit_sw)jump->u.target - jump_addr) <= 0x01ffffff && ((sljit_sw)jump->u.target - jump_addr) >= -0x02000000);
- *buf_ptr |= (((sljit_sw)jump->u.target - jump_addr) >> 2) & 0x00ffffff;
+ SLJIT_ASSERT(((sljit_sw)jump->u.target - addr) <= 0x01ffffff && ((sljit_sw)jump->u.target - addr) >= -0x02000000);
+ *buf_ptr |= (((sljit_sw)jump->u.target - addr) >> 2) & 0x00ffffff;
}
}
else if (jump->flags & SLJIT_REWRITABLE_JUMP) {
@@ -813,6 +828,22 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
}
#endif
+ put_label = compiler->put_labels;
+ while (put_label) {
+ addr = put_label->label->addr;
+ buf_ptr = (sljit_uw*)put_label->addr;
+
+#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
+ SLJIT_ASSERT((buf_ptr[0] & 0xffff0000) == 0xe59f0000);
+ buf_ptr[((buf_ptr[0] & 0xfff) >> 2) + 2] = addr;
+#else
+ SLJIT_ASSERT((buf_ptr[-1] & 0xfff00000) == MOVW && (buf_ptr[0] & 0xfff00000) == MOVT);
+ buf_ptr[-1] |= ((addr << 4) & 0xf0000) | (addr & 0xfff);
+ buf_ptr[0] |= ((addr >> 12) & 0xf0000) | ((addr >> 16) & 0xfff);
+#endif
+ put_label = put_label->next;
+ }
+
SLJIT_ASSERT(code_ptr - code <= (sljit_s32)size);
compiler->error = SLJIT_ERR_COMPILED;
@@ -2639,28 +2670,55 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem(struct sljit_compiler *compile
SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw init_value)
{
struct sljit_const *const_;
- sljit_s32 reg;
+ sljit_s32 dst_r;
CHECK_ERROR_PTR();
CHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value));
ADJUST_LOCAL_OFFSET(dst, dstw);
+ dst_r = SLOW_IS_REG(dst) ? dst : TMP_REG2;
+
+#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
+ PTR_FAIL_IF(push_inst_with_unique_literal(compiler, EMIT_DATA_TRANSFER(WORD_SIZE | LOAD_DATA, 1, dst_r, TMP_PC, 0), init_value));
+ compiler->patches++;
+#else
+ PTR_FAIL_IF(emit_imm(compiler, dst_r, init_value));
+#endif
+
const_ = (struct sljit_const*)ensure_abuf(compiler, sizeof(struct sljit_const));
PTR_FAIL_IF(!const_);
+ set_const(const_, compiler);
- reg = SLOW_IS_REG(dst) ? dst : TMP_REG2;
+ if (dst & SLJIT_MEM)
+ PTR_FAIL_IF(emit_op_mem(compiler, WORD_SIZE, TMP_REG2, dst, dstw, TMP_REG1));
+ return const_;
+}
+
+SLJIT_API_FUNC_ATTRIBUTE struct sljit_put_label* sljit_emit_put_label(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw)
+{
+ struct sljit_put_label *put_label;
+ sljit_s32 dst_r;
+
+ CHECK_ERROR_PTR();
+ CHECK_PTR(check_sljit_emit_put_label(compiler, dst, dstw));
+ ADJUST_LOCAL_OFFSET(dst, dstw);
+
+ dst_r = SLOW_IS_REG(dst) ? dst : TMP_REG2;
#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
- PTR_FAIL_IF(push_inst_with_unique_literal(compiler, EMIT_DATA_TRANSFER(WORD_SIZE | LOAD_DATA, 1, reg, TMP_PC, 0), init_value));
+ PTR_FAIL_IF(push_inst_with_unique_literal(compiler, EMIT_DATA_TRANSFER(WORD_SIZE | LOAD_DATA, 1, dst_r, TMP_PC, 0), 0));
compiler->patches++;
#else
- PTR_FAIL_IF(emit_imm(compiler, reg, init_value));
+ PTR_FAIL_IF(emit_imm(compiler, dst_r, 0));
#endif
- set_const(const_, compiler);
+
+ put_label = (struct sljit_put_label*)ensure_abuf(compiler, sizeof(struct sljit_put_label));
+ PTR_FAIL_IF(!put_label);
+ set_put_label(put_label, compiler, 0);
if (dst & SLJIT_MEM)
PTR_FAIL_IF(emit_op_mem(compiler, WORD_SIZE, TMP_REG2, dst, dstw, TMP_REG1));
- return const_;
+ return put_label;
}
SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target, sljit_sw executable_offset)
diff --git a/thirdparty/pcre2/src/sljit/sljitNativeARM_64.c b/thirdparty/pcre2/src/sljit/sljitNativeARM_64.c
index b015695c52..e15b3451e8 100644
--- a/thirdparty/pcre2/src/sljit/sljitNativeARM_64.c
+++ b/thirdparty/pcre2/src/sljit/sljitNativeARM_64.c
@@ -161,7 +161,7 @@ static SLJIT_INLINE void modify_imm64_const(sljit_ins* inst, sljit_uw new_imm)
inst[3] = MOVK | dst | ((new_imm >> 48) << 5) | (3 << 21);
}
-static SLJIT_INLINE sljit_s32 detect_jump_type(struct sljit_jump *jump, sljit_ins *code_ptr, sljit_ins *code, sljit_sw executable_offset)
+static SLJIT_INLINE sljit_sw detect_jump_type(struct sljit_jump *jump, sljit_ins *code_ptr, sljit_ins *code, sljit_sw executable_offset)
{
sljit_sw diff;
sljit_uw target_addr;
@@ -196,14 +196,14 @@ static SLJIT_INLINE sljit_s32 detect_jump_type(struct sljit_jump *jump, sljit_in
return 4;
}
- if (target_addr <= 0xffffffffl) {
+ if (target_addr < 0x100000000l) {
if (jump->flags & IS_COND)
code_ptr[-5] -= (2 << 5);
code_ptr[-2] = code_ptr[0];
return 2;
}
- if (target_addr <= 0xffffffffffffl) {
+ if (target_addr < 0x1000000000000l) {
if (jump->flags & IS_COND)
code_ptr[-5] -= (1 << 5);
jump->flags |= PATCH_ABS48;
@@ -215,6 +215,22 @@ static SLJIT_INLINE sljit_s32 detect_jump_type(struct sljit_jump *jump, sljit_in
return 0;
}
+static SLJIT_INLINE sljit_sw put_label_get_length(struct sljit_put_label *put_label, sljit_uw max_label)
+{
+ if (max_label < 0x100000000l) {
+ put_label->flags = 0;
+ return 2;
+ }
+
+ if (max_label < 0x1000000000000l) {
+ put_label->flags = 1;
+ return 1;
+ }
+
+ put_label->flags = 2;
+ return 0;
+}
+
SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compiler)
{
struct sljit_memory_fragment *buf;
@@ -223,6 +239,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
sljit_ins *buf_ptr;
sljit_ins *buf_end;
sljit_uw word_count;
+ sljit_uw next_addr;
sljit_sw executable_offset;
sljit_uw addr;
sljit_s32 dst;
@@ -230,6 +247,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
struct sljit_label *label;
struct sljit_jump *jump;
struct sljit_const *const_;
+ struct sljit_put_label *put_label;
CHECK_ERROR_PTR();
CHECK_PTR(check_sljit_generate_code(compiler));
@@ -241,34 +259,47 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
code_ptr = code;
word_count = 0;
+ next_addr = 0;
executable_offset = SLJIT_EXEC_OFFSET(code);
label = compiler->labels;
jump = compiler->jumps;
const_ = compiler->consts;
+ put_label = compiler->put_labels;
do {
buf_ptr = (sljit_ins*)buf->memory;
buf_end = buf_ptr + (buf->used_size >> 2);
do {
*code_ptr = *buf_ptr++;
- /* These structures are ordered by their address. */
- SLJIT_ASSERT(!label || label->size >= word_count);
- SLJIT_ASSERT(!jump || jump->addr >= word_count);
- SLJIT_ASSERT(!const_ || const_->addr >= word_count);
- if (label && label->size == word_count) {
- label->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset);
- label->size = code_ptr - code;
- label = label->next;
- }
- if (jump && jump->addr == word_count) {
- jump->addr = (sljit_uw)(code_ptr - 4);
- code_ptr -= detect_jump_type(jump, code_ptr, code, executable_offset);
- jump = jump->next;
- }
- if (const_ && const_->addr == word_count) {
- const_->addr = (sljit_uw)code_ptr;
- const_ = const_->next;
+ if (next_addr == word_count) {
+ SLJIT_ASSERT(!label || label->size >= word_count);
+ SLJIT_ASSERT(!jump || jump->addr >= word_count);
+ SLJIT_ASSERT(!const_ || const_->addr >= word_count);
+ SLJIT_ASSERT(!put_label || put_label->addr >= word_count);
+
+ /* These structures are ordered by their address. */
+ if (label && label->size == word_count) {
+ label->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset);
+ label->size = code_ptr - code;
+ label = label->next;
+ }
+ if (jump && jump->addr == word_count) {
+ jump->addr = (sljit_uw)(code_ptr - 4);
+ code_ptr -= detect_jump_type(jump, code_ptr, code, executable_offset);
+ jump = jump->next;
+ }
+ if (const_ && const_->addr == word_count) {
+ const_->addr = (sljit_uw)code_ptr;
+ const_ = const_->next;
+ }
+ if (put_label && put_label->addr == word_count) {
+ SLJIT_ASSERT(put_label->label);
+ put_label->addr = (sljit_uw)(code_ptr - 3);
+ code_ptr -= put_label_get_length(put_label, (sljit_uw)(SLJIT_ADD_EXEC_OFFSET(code, executable_offset) + put_label->label->size));
+ put_label = put_label->next;
+ }
+ next_addr = compute_next_addr(label, jump, const_, put_label);
}
code_ptr ++;
word_count ++;
@@ -286,6 +317,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
SLJIT_ASSERT(!label);
SLJIT_ASSERT(!jump);
SLJIT_ASSERT(!const_);
+ SLJIT_ASSERT(!put_label);
SLJIT_ASSERT(code_ptr - code <= (sljit_sw)compiler->size);
jump = compiler->jumps;
@@ -323,6 +355,23 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
jump = jump->next;
}
+ put_label = compiler->put_labels;
+ while (put_label) {
+ addr = put_label->label->addr;
+ buf_ptr = (sljit_ins *)put_label->addr;
+
+ buf_ptr[0] |= (addr & 0xffff) << 5;
+ buf_ptr[1] |= ((addr >> 16) & 0xffff) << 5;
+
+ if (put_label->flags >= 1)
+ buf_ptr[2] |= ((addr >> 32) & 0xffff) << 5;
+
+ if (put_label->flags >= 2)
+ buf_ptr[3] |= ((addr >> 48) & 0xffff) << 5;
+
+ put_label = put_label->next;
+ }
+
compiler->error = SLJIT_ERR_COMPILED;
compiler->executable_offset = executable_offset;
compiler->executable_size = (code_ptr - code) * sizeof(sljit_ins);
@@ -1947,6 +1996,28 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compi
return const_;
}
+SLJIT_API_FUNC_ATTRIBUTE struct sljit_put_label* sljit_emit_put_label(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw)
+{
+ struct sljit_put_label *put_label;
+ sljit_s32 dst_r;
+
+ CHECK_ERROR_PTR();
+ CHECK_PTR(check_sljit_emit_put_label(compiler, dst, dstw));
+ ADJUST_LOCAL_OFFSET(dst, dstw);
+
+ dst_r = FAST_IS_REG(dst) ? dst : TMP_REG1;
+ PTR_FAIL_IF(emit_imm64_const(compiler, dst_r, 0));
+
+ put_label = (struct sljit_put_label*)ensure_abuf(compiler, sizeof(struct sljit_put_label));
+ PTR_FAIL_IF(!put_label);
+ set_put_label(put_label, compiler, 1);
+
+ if (dst & SLJIT_MEM)
+ PTR_FAIL_IF(emit_op_mem(compiler, WORD_SIZE | STORE, dst_r, dst, dstw, TMP_REG2));
+
+ return put_label;
+}
+
SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target, sljit_sw executable_offset)
{
sljit_ins* inst = (sljit_ins*)addr;
diff --git a/thirdparty/pcre2/src/sljit/sljitNativeARM_T2_32.c b/thirdparty/pcre2/src/sljit/sljitNativeARM_T2_32.c
index d7024b6d7d..cdfe4a4d24 100644
--- a/thirdparty/pcre2/src/sljit/sljitNativeARM_T2_32.c
+++ b/thirdparty/pcre2/src/sljit/sljitNativeARM_T2_32.c
@@ -365,11 +365,13 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
sljit_u16 *buf_ptr;
sljit_u16 *buf_end;
sljit_uw half_count;
+ sljit_uw next_addr;
sljit_sw executable_offset;
struct sljit_label *label;
struct sljit_jump *jump;
struct sljit_const *const_;
+ struct sljit_put_label *put_label;
CHECK_ERROR_PTR();
CHECK_PTR(check_sljit_generate_code(compiler));
@@ -381,34 +383,46 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
code_ptr = code;
half_count = 0;
+ next_addr = 0;
executable_offset = SLJIT_EXEC_OFFSET(code);
label = compiler->labels;
jump = compiler->jumps;
const_ = compiler->consts;
+ put_label = compiler->put_labels;
do {
buf_ptr = (sljit_u16*)buf->memory;
buf_end = buf_ptr + (buf->used_size >> 1);
do {
*code_ptr = *buf_ptr++;
- /* These structures are ordered by their address. */
- SLJIT_ASSERT(!label || label->size >= half_count);
- SLJIT_ASSERT(!jump || jump->addr >= half_count);
- SLJIT_ASSERT(!const_ || const_->addr >= half_count);
- if (label && label->size == half_count) {
- label->addr = ((sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset)) | 0x1;
- label->size = code_ptr - code;
- label = label->next;
- }
- if (jump && jump->addr == half_count) {
- jump->addr = (sljit_uw)code_ptr - ((jump->flags & IS_COND) ? 10 : 8);
- code_ptr -= detect_jump_type(jump, code_ptr, code, executable_offset);
- jump = jump->next;
- }
- if (const_ && const_->addr == half_count) {
- const_->addr = (sljit_uw)code_ptr;
- const_ = const_->next;
+ if (next_addr == half_count) {
+ SLJIT_ASSERT(!label || label->size >= half_count);
+ SLJIT_ASSERT(!jump || jump->addr >= half_count);
+ SLJIT_ASSERT(!const_ || const_->addr >= half_count);
+ SLJIT_ASSERT(!put_label || put_label->addr >= half_count);
+
+ /* These structures are ordered by their address. */
+ if (label && label->size == half_count) {
+ label->addr = ((sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset)) | 0x1;
+ label->size = code_ptr - code;
+ label = label->next;
+ }
+ if (jump && jump->addr == half_count) {
+ jump->addr = (sljit_uw)code_ptr - ((jump->flags & IS_COND) ? 10 : 8);
+ code_ptr -= detect_jump_type(jump, code_ptr, code, executable_offset);
+ jump = jump->next;
+ }
+ if (const_ && const_->addr == half_count) {
+ const_->addr = (sljit_uw)code_ptr;
+ const_ = const_->next;
+ }
+ if (put_label && put_label->addr == half_count) {
+ SLJIT_ASSERT(put_label->label);
+ put_label->addr = (sljit_uw)code_ptr;
+ put_label = put_label->next;
+ }
+ next_addr = compute_next_addr(label, jump, const_, put_label);
}
code_ptr ++;
half_count ++;
@@ -426,6 +440,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
SLJIT_ASSERT(!label);
SLJIT_ASSERT(!jump);
SLJIT_ASSERT(!const_);
+ SLJIT_ASSERT(!put_label);
SLJIT_ASSERT(code_ptr - code <= (sljit_sw)compiler->size);
jump = compiler->jumps;
@@ -434,6 +449,12 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
jump = jump->next;
}
+ put_label = compiler->put_labels;
+ while (put_label) {
+ modify_imm32_const((sljit_u16 *)put_label->addr, put_label->label->addr);
+ put_label = put_label->next;
+ }
+
compiler->error = SLJIT_ERR_COMPILED;
compiler->executable_offset = executable_offset;
compiler->executable_size = (code_ptr - code) * sizeof(sljit_u16);
@@ -2311,6 +2332,27 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compi
return const_;
}
+SLJIT_API_FUNC_ATTRIBUTE struct sljit_put_label* sljit_emit_put_label(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw)
+{
+ struct sljit_put_label *put_label;
+ sljit_s32 dst_r;
+
+ CHECK_ERROR_PTR();
+ CHECK_PTR(check_sljit_emit_put_label(compiler, dst, dstw));
+ ADJUST_LOCAL_OFFSET(dst, dstw);
+
+ put_label = (struct sljit_put_label*)ensure_abuf(compiler, sizeof(struct sljit_put_label));
+ PTR_FAIL_IF(!put_label);
+ set_put_label(put_label, compiler, 0);
+
+ dst_r = FAST_IS_REG(dst) ? dst : TMP_REG1;
+ PTR_FAIL_IF(emit_imm32_const(compiler, dst_r, 0));
+
+ if (dst & SLJIT_MEM)
+ PTR_FAIL_IF(emit_op_mem(compiler, WORD_SIZE | STORE, dst_r, dst, dstw, TMP_REG2));
+ return put_label;
+}
+
SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target, sljit_sw executable_offset)
{
sljit_u16 *inst = (sljit_u16*)addr;
diff --git a/thirdparty/pcre2/src/sljit/sljitNativeMIPS_32.c b/thirdparty/pcre2/src/sljit/sljitNativeMIPS_32.c
index ad970bf25a..16dec052fe 100644
--- a/thirdparty/pcre2/src/sljit/sljitNativeMIPS_32.c
+++ b/thirdparty/pcre2/src/sljit/sljitNativeMIPS_32.c
@@ -425,6 +425,7 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_ta
{
sljit_ins *inst = (sljit_ins *)addr;
+ SLJIT_ASSERT((inst[0] & 0xffe00000) == LUI && (inst[1] & 0xfc000000) == ORI);
inst[0] = (inst[0] & 0xffff0000) | ((new_target >> 16) & 0xffff);
inst[1] = (inst[1] & 0xffff0000) | (new_target & 0xffff);
inst = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset);
@@ -435,6 +436,7 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_consta
{
sljit_ins *inst = (sljit_ins *)addr;
+ SLJIT_ASSERT((inst[0] & 0xffe00000) == LUI && (inst[1] & 0xfc000000) == ORI);
inst[0] = (inst[0] & 0xffff0000) | ((new_constant >> 16) & 0xffff);
inst[1] = (inst[1] & 0xffff0000) | (new_constant & 0xffff);
inst = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset);
diff --git a/thirdparty/pcre2/src/sljit/sljitNativeMIPS_common.c b/thirdparty/pcre2/src/sljit/sljitNativeMIPS_common.c
index e0d6a3f085..7d1d087496 100644
--- a/thirdparty/pcre2/src/sljit/sljitNativeMIPS_common.c
+++ b/thirdparty/pcre2/src/sljit/sljitNativeMIPS_common.c
@@ -449,6 +449,55 @@ static __attribute__ ((noinline)) void sljit_cache_flush(void* code, void* code_
}
#endif
+#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)
+
+static SLJIT_INLINE sljit_sw put_label_get_length(struct sljit_put_label *put_label, sljit_uw max_label)
+{
+ if (max_label < 0x80000000l) {
+ put_label->flags = 0;
+ return 1;
+ }
+
+ if (max_label < 0x800000000000l) {
+ put_label->flags = 1;
+ return 3;
+ }
+
+ put_label->flags = 2;
+ return 5;
+}
+
+static SLJIT_INLINE void put_label_set(struct sljit_put_label *put_label)
+{
+ sljit_uw addr = put_label->label->addr;
+ sljit_ins *inst = (sljit_ins *)put_label->addr;
+ sljit_s32 reg = *inst;
+
+ if (put_label->flags == 0) {
+ SLJIT_ASSERT(addr < 0x80000000l);
+ inst[0] = LUI | T(reg) | IMM(addr >> 16);
+ }
+ else if (put_label->flags == 1) {
+ SLJIT_ASSERT(addr < 0x800000000000l);
+ inst[0] = LUI | T(reg) | IMM(addr >> 32);
+ inst[1] = ORI | S(reg) | T(reg) | IMM((addr >> 16) & 0xffff);
+ inst[2] = DSLL | T(reg) | D(reg) | SH_IMM(16);
+ inst += 2;
+ }
+ else {
+ inst[0] = LUI | T(reg) | IMM(addr >> 48);
+ inst[1] = ORI | S(reg) | T(reg) | IMM((addr >> 32) & 0xffff);
+ inst[2] = DSLL | T(reg) | D(reg) | SH_IMM(16);
+ inst[3] = ORI | S(reg) | T(reg) | IMM((addr >> 16) & 0xffff);
+ inst[4] = DSLL | T(reg) | D(reg) | SH_IMM(16);
+ inst += 4;
+ }
+
+ inst[1] = ORI | S(reg) | T(reg) | IMM(addr & 0xffff);
+}
+
+#endif
+
SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compiler)
{
struct sljit_memory_fragment *buf;
@@ -457,12 +506,14 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
sljit_ins *buf_ptr;
sljit_ins *buf_end;
sljit_uw word_count;
+ sljit_uw next_addr;
sljit_sw executable_offset;
sljit_uw addr;
struct sljit_label *label;
struct sljit_jump *jump;
struct sljit_const *const_;
+ struct sljit_put_label *put_label;
CHECK_ERROR_PTR();
CHECK_PTR(check_sljit_generate_code(compiler));
@@ -474,39 +525,54 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
code_ptr = code;
word_count = 0;
+ next_addr = 0;
executable_offset = SLJIT_EXEC_OFFSET(code);
label = compiler->labels;
jump = compiler->jumps;
const_ = compiler->consts;
+ put_label = compiler->put_labels;
do {
buf_ptr = (sljit_ins*)buf->memory;
buf_end = buf_ptr + (buf->used_size >> 2);
do {
*code_ptr = *buf_ptr++;
- SLJIT_ASSERT(!label || label->size >= word_count);
- SLJIT_ASSERT(!jump || jump->addr >= word_count);
- SLJIT_ASSERT(!const_ || const_->addr >= word_count);
- /* These structures are ordered by their address. */
- if (label && label->size == word_count) {
- label->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset);
- label->size = code_ptr - code;
- label = label->next;
- }
- if (jump && jump->addr == word_count) {
+ if (next_addr == word_count) {
+ SLJIT_ASSERT(!label || label->size >= word_count);
+ SLJIT_ASSERT(!jump || jump->addr >= word_count);
+ SLJIT_ASSERT(!const_ || const_->addr >= word_count);
+ SLJIT_ASSERT(!put_label || put_label->addr >= word_count);
+
+ /* These structures are ordered by their address. */
+ if (label && label->size == word_count) {
+ label->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset);
+ label->size = code_ptr - code;
+ label = label->next;
+ }
+ if (jump && jump->addr == word_count) {
#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
- jump->addr = (sljit_uw)(code_ptr - 3);
+ jump->addr = (sljit_uw)(code_ptr - 3);
#else
- jump->addr = (sljit_uw)(code_ptr - 7);
+ jump->addr = (sljit_uw)(code_ptr - 7);
#endif
- code_ptr = detect_jump_type(jump, code_ptr, code, executable_offset);
- jump = jump->next;
- }
- if (const_ && const_->addr == word_count) {
- /* Just recording the address. */
- const_->addr = (sljit_uw)code_ptr;
- const_ = const_->next;
+ code_ptr = detect_jump_type(jump, code_ptr, code, executable_offset);
+ jump = jump->next;
+ }
+ if (const_ && const_->addr == word_count) {
+ const_->addr = (sljit_uw)code_ptr;
+ const_ = const_->next;
+ }
+ if (put_label && put_label->addr == word_count) {
+ SLJIT_ASSERT(put_label->label);
+ put_label->addr = (sljit_uw)code_ptr;
+#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)
+ code_ptr += put_label_get_length(put_label, (sljit_uw)(SLJIT_ADD_EXEC_OFFSET(code, executable_offset) + put_label->label->size));
+ word_count += 5;
+#endif
+ put_label = put_label->next;
+ }
+ next_addr = compute_next_addr(label, jump, const_, put_label);
}
code_ptr ++;
word_count ++;
@@ -524,6 +590,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
SLJIT_ASSERT(!label);
SLJIT_ASSERT(!jump);
SLJIT_ASSERT(!const_);
+ SLJIT_ASSERT(!put_label);
SLJIT_ASSERT(code_ptr - code <= (sljit_sw)compiler->size);
jump = compiler->jumps;
@@ -571,6 +638,21 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
jump = jump->next;
}
+ put_label = compiler->put_labels;
+ while (put_label) {
+#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
+ addr = put_label->label->addr;
+ buf_ptr = (sljit_ins *)put_label->addr;
+
+ SLJIT_ASSERT((buf_ptr[0] & 0xffe00000) == LUI && (buf_ptr[1] & 0xfc000000) == ORI);
+ buf_ptr[0] |= (addr >> 16) & 0xffff;
+ buf_ptr[1] |= addr & 0xffff;
+#else
+ put_label_set(put_label);
+#endif
+ put_label = put_label->next;
+ }
+
compiler->error = SLJIT_ERR_COMPILED;
compiler->executable_offset = executable_offset;
compiler->executable_size = (code_ptr - code) * sizeof(sljit_ins);
@@ -2157,7 +2239,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compil
SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw init_value)
{
struct sljit_const *const_;
- sljit_s32 reg;
+ sljit_s32 dst_r;
CHECK_ERROR_PTR();
CHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value));
@@ -2167,11 +2249,38 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compi
PTR_FAIL_IF(!const_);
set_const(const_, compiler);
- reg = FAST_IS_REG(dst) ? dst : TMP_REG2;
-
- PTR_FAIL_IF(emit_const(compiler, reg, init_value));
+ dst_r = FAST_IS_REG(dst) ? dst : TMP_REG2;
+ PTR_FAIL_IF(emit_const(compiler, dst_r, init_value));
if (dst & SLJIT_MEM)
PTR_FAIL_IF(emit_op(compiler, SLJIT_MOV, WORD_DATA, dst, dstw, TMP_REG1, 0, TMP_REG2, 0));
+
return const_;
}
+
+SLJIT_API_FUNC_ATTRIBUTE struct sljit_put_label* sljit_emit_put_label(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw)
+{
+ struct sljit_put_label *put_label;
+ sljit_s32 dst_r;
+
+ CHECK_ERROR_PTR();
+ CHECK_PTR(check_sljit_emit_put_label(compiler, dst, dstw));
+ ADJUST_LOCAL_OFFSET(dst, dstw);
+
+ put_label = (struct sljit_put_label*)ensure_abuf(compiler, sizeof(struct sljit_put_label));
+ PTR_FAIL_IF(!put_label);
+ set_put_label(put_label, compiler, 0);
+
+ dst_r = FAST_IS_REG(dst) ? dst : TMP_REG2;
+#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
+ PTR_FAIL_IF(emit_const(compiler, dst_r, 0));
+#else
+ PTR_FAIL_IF(push_inst(compiler, dst_r, UNMOVABLE_INS));
+ compiler->size += 5;
+#endif
+
+ if (dst & SLJIT_MEM)
+ PTR_FAIL_IF(emit_op(compiler, SLJIT_MOV, WORD_DATA, dst, dstw, TMP_REG1, 0, TMP_REG2, 0));
+
+ return put_label;
+}
diff --git a/thirdparty/pcre2/src/sljit/sljitNativePPC_32.c b/thirdparty/pcre2/src/sljit/sljitNativePPC_32.c
index fc185f7847..3ce741153f 100644
--- a/thirdparty/pcre2/src/sljit/sljitNativePPC_32.c
+++ b/thirdparty/pcre2/src/sljit/sljitNativePPC_32.c
@@ -259,6 +259,7 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_ta
{
sljit_ins *inst = (sljit_ins *)addr;
+ SLJIT_ASSERT((inst[0] & 0xfc1f0000) == ADDIS && (inst[1] & 0xfc000000) == ORI);
inst[0] = (inst[0] & 0xffff0000) | ((new_target >> 16) & 0xffff);
inst[1] = (inst[1] & 0xffff0000) | (new_target & 0xffff);
inst = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset);
@@ -269,6 +270,7 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_consta
{
sljit_ins *inst = (sljit_ins *)addr;
+ SLJIT_ASSERT((inst[0] & 0xfc1f0000) == ADDIS && (inst[1] & 0xfc000000) == ORI);
inst[0] = (inst[0] & 0xffff0000) | ((new_constant >> 16) & 0xffff);
inst[1] = (inst[1] & 0xffff0000) | (new_constant & 0xffff);
inst = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset);
diff --git a/thirdparty/pcre2/src/sljit/sljitNativePPC_64.c b/thirdparty/pcre2/src/sljit/sljitNativePPC_64.c
index 706b2ba20b..3b73021cc8 100644
--- a/thirdparty/pcre2/src/sljit/sljitNativePPC_64.c
+++ b/thirdparty/pcre2/src/sljit/sljitNativePPC_64.c
@@ -35,9 +35,6 @@
#error "Must implement count leading zeroes"
#endif
-#define RLDI(dst, src, sh, mb, type) \
- (HI(30) | S(src) | A(dst) | ((type) << 2) | (((sh) & 0x1f) << 11) | (((sh) & 0x20) >> 4) | (((mb) & 0x1f) << 6) | ((mb) & 0x20))
-
#define PUSH_RLDICR(reg, shift) \
push_inst(compiler, RLDI(reg, reg, 63 - shift, shift, 1))
diff --git a/thirdparty/pcre2/src/sljit/sljitNativePPC_common.c b/thirdparty/pcre2/src/sljit/sljitNativePPC_common.c
index b34e3965ed..e827514315 100644
--- a/thirdparty/pcre2/src/sljit/sljitNativePPC_common.c
+++ b/thirdparty/pcre2/src/sljit/sljitNativePPC_common.c
@@ -231,6 +231,9 @@ static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 3] = {
#define SIMM_MIN (-0x8000)
#define UIMM_MAX (0xffff)
+#define RLDI(dst, src, sh, mb, type) \
+ (HI(30) | S(src) | A(dst) | ((type) << 2) | (((sh) & 0x1f) << 11) | (((sh) & 0x20) >> 4) | (((mb) & 0x1f) << 6) | ((mb) & 0x20))
+
#if (defined SLJIT_INDIRECT_CALL && SLJIT_INDIRECT_CALL)
SLJIT_API_FUNC_ATTRIBUTE void sljit_set_function_context(void** func_ptr, struct sljit_function_context* context, sljit_sw addr, void* func)
{
@@ -324,6 +327,55 @@ keep_address:
return 0;
}
+#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
+
+static SLJIT_INLINE sljit_sw put_label_get_length(struct sljit_put_label *put_label, sljit_uw max_label)
+{
+ if (max_label < 0x100000000l) {
+ put_label->flags = 0;
+ return 1;
+ }
+
+ if (max_label < 0x1000000000000l) {
+ put_label->flags = 1;
+ return 3;
+ }
+
+ put_label->flags = 2;
+ return 4;
+}
+
+static SLJIT_INLINE void put_label_set(struct sljit_put_label *put_label)
+{
+ sljit_uw addr = put_label->label->addr;
+ sljit_ins *inst = (sljit_ins *)put_label->addr;
+ sljit_s32 reg = *inst;
+
+ if (put_label->flags == 0) {
+ SLJIT_ASSERT(addr < 0x100000000l);
+ inst[0] = ORIS | S(TMP_ZERO) | A(reg) | IMM(addr >> 16);
+ }
+ else {
+ if (put_label->flags == 1) {
+ SLJIT_ASSERT(addr < 0x1000000000000l);
+ inst[0] = ORI | S(TMP_ZERO) | A(reg) | IMM(addr >> 32);
+ }
+ else {
+ inst[0] = ORIS | S(TMP_ZERO) | A(reg) | IMM(addr >> 48);
+ inst[1] = ORI | S(reg) | A(reg) | IMM((addr >> 32) & 0xffff);
+ inst ++;
+ }
+
+ inst[1] = RLDI(reg, reg, 32, 31, 1);
+ inst[2] = ORIS | S(reg) | A(reg) | IMM((addr >> 16) & 0xffff);
+ inst += 2;
+ }
+
+ inst[1] = ORI | S(reg) | A(reg) | IMM(addr & 0xffff);
+}
+
+#endif
+
SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compiler)
{
struct sljit_memory_fragment *buf;
@@ -332,12 +384,14 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
sljit_ins *buf_ptr;
sljit_ins *buf_end;
sljit_uw word_count;
+ sljit_uw next_addr;
sljit_sw executable_offset;
sljit_uw addr;
struct sljit_label *label;
struct sljit_jump *jump;
struct sljit_const *const_;
+ struct sljit_put_label *put_label;
CHECK_ERROR_PTR();
CHECK_PTR(check_sljit_generate_code(compiler));
@@ -356,71 +410,87 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
code_ptr = code;
word_count = 0;
+ next_addr = 0;
executable_offset = SLJIT_EXEC_OFFSET(code);
label = compiler->labels;
jump = compiler->jumps;
const_ = compiler->consts;
+ put_label = compiler->put_labels;
do {
buf_ptr = (sljit_ins*)buf->memory;
buf_end = buf_ptr + (buf->used_size >> 2);
do {
*code_ptr = *buf_ptr++;
- SLJIT_ASSERT(!label || label->size >= word_count);
- SLJIT_ASSERT(!jump || jump->addr >= word_count);
- SLJIT_ASSERT(!const_ || const_->addr >= word_count);
- /* These structures are ordered by their address. */
- if (label && label->size == word_count) {
- /* Just recording the address. */
- label->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset);
- label->size = code_ptr - code;
- label = label->next;
- }
- if (jump && jump->addr == word_count) {
+ if (next_addr == word_count) {
+ SLJIT_ASSERT(!label || label->size >= word_count);
+ SLJIT_ASSERT(!jump || jump->addr >= word_count);
+ SLJIT_ASSERT(!const_ || const_->addr >= word_count);
+ SLJIT_ASSERT(!put_label || put_label->addr >= word_count);
+
+ /* These structures are ordered by their address. */
+ if (label && label->size == word_count) {
+ /* Just recording the address. */
+ label->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset);
+ label->size = code_ptr - code;
+ label = label->next;
+ }
+ if (jump && jump->addr == word_count) {
#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32)
- jump->addr = (sljit_uw)(code_ptr - 3);
+ jump->addr = (sljit_uw)(code_ptr - 3);
#else
- jump->addr = (sljit_uw)(code_ptr - 6);
+ jump->addr = (sljit_uw)(code_ptr - 6);
#endif
- if (detect_jump_type(jump, code_ptr, code, executable_offset)) {
+ if (detect_jump_type(jump, code_ptr, code, executable_offset)) {
#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32)
- code_ptr[-3] = code_ptr[0];
- code_ptr -= 3;
-#else
- if (jump->flags & PATCH_ABS32) {
+ code_ptr[-3] = code_ptr[0];
code_ptr -= 3;
- code_ptr[-1] = code_ptr[2];
- code_ptr[0] = code_ptr[3];
- }
- else if (jump->flags & PATCH_ABS48) {
- code_ptr--;
- code_ptr[-1] = code_ptr[0];
- code_ptr[0] = code_ptr[1];
- /* rldicr rX,rX,32,31 -> rX,rX,16,47 */
- SLJIT_ASSERT((code_ptr[-3] & 0xfc00ffff) == 0x780007c6);
- code_ptr[-3] ^= 0x8422;
- /* oris -> ori */
- code_ptr[-2] ^= 0x4000000;
- }
- else {
- code_ptr[-6] = code_ptr[0];
- code_ptr -= 6;
- }
+#else
+ if (jump->flags & PATCH_ABS32) {
+ code_ptr -= 3;
+ code_ptr[-1] = code_ptr[2];
+ code_ptr[0] = code_ptr[3];
+ }
+ else if (jump->flags & PATCH_ABS48) {
+ code_ptr--;
+ code_ptr[-1] = code_ptr[0];
+ code_ptr[0] = code_ptr[1];
+ /* rldicr rX,rX,32,31 -> rX,rX,16,47 */
+ SLJIT_ASSERT((code_ptr[-3] & 0xfc00ffff) == 0x780007c6);
+ code_ptr[-3] ^= 0x8422;
+ /* oris -> ori */
+ code_ptr[-2] ^= 0x4000000;
+ }
+ else {
+ code_ptr[-6] = code_ptr[0];
+ code_ptr -= 6;
+ }
#endif
- if (jump->flags & REMOVE_COND) {
- code_ptr[0] = BCx | (2 << 2) | ((code_ptr[0] ^ (8 << 21)) & 0x03ff0001);
- code_ptr++;
- jump->addr += sizeof(sljit_ins);
- code_ptr[0] = Bx;
- jump->flags -= IS_COND;
+ if (jump->flags & REMOVE_COND) {
+ code_ptr[0] = BCx | (2 << 2) | ((code_ptr[0] ^ (8 << 21)) & 0x03ff0001);
+ code_ptr++;
+ jump->addr += sizeof(sljit_ins);
+ code_ptr[0] = Bx;
+ jump->flags -= IS_COND;
+ }
}
+ jump = jump->next;
}
- jump = jump->next;
- }
- if (const_ && const_->addr == word_count) {
- const_->addr = (sljit_uw)code_ptr;
- const_ = const_->next;
+ if (const_ && const_->addr == word_count) {
+ const_->addr = (sljit_uw)code_ptr;
+ const_ = const_->next;
+ }
+ if (put_label && put_label->addr == word_count) {
+ SLJIT_ASSERT(put_label->label);
+ put_label->addr = (sljit_uw)code_ptr;
+#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
+ code_ptr += put_label_get_length(put_label, (sljit_uw)(SLJIT_ADD_EXEC_OFFSET(code, executable_offset) + put_label->label->size));
+ word_count += 4;
+#endif
+ put_label = put_label->next;
+ }
+ next_addr = compute_next_addr(label, jump, const_, put_label);
}
code_ptr ++;
word_count ++;
@@ -438,6 +508,8 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
SLJIT_ASSERT(!label);
SLJIT_ASSERT(!jump);
SLJIT_ASSERT(!const_);
+ SLJIT_ASSERT(!put_label);
+
#if (defined SLJIT_INDIRECT_CALL && SLJIT_INDIRECT_CALL)
SLJIT_ASSERT(code_ptr - code <= (sljit_sw)compiler->size - (sizeof(struct sljit_function_context) / sizeof(sljit_ins)));
#else
@@ -503,6 +575,21 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
jump = jump->next;
}
+ put_label = compiler->put_labels;
+ while (put_label) {
+#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32)
+ addr = put_label->label->addr;
+ buf_ptr = (sljit_ins *)put_label->addr;
+
+ SLJIT_ASSERT((buf_ptr[0] & 0xfc1f0000) == ADDIS && (buf_ptr[1] & 0xfc000000) == ORI);
+ buf_ptr[0] |= (addr >> 16) & 0xffff;
+ buf_ptr[1] |= addr & 0xffff;
+#else
+ put_label_set(put_label);
+#endif
+ put_label = put_label->next;
+ }
+
compiler->error = SLJIT_ERR_COMPILED;
compiler->executable_offset = executable_offset;
compiler->executable_size = (code_ptr - code) * sizeof(sljit_ins);
@@ -2261,7 +2348,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fmem(struct sljit_compiler *compil
SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw init_value)
{
struct sljit_const *const_;
- sljit_s32 reg;
+ sljit_s32 dst_r;
CHECK_ERROR_PTR();
CHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value));
@@ -2271,11 +2358,38 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compi
PTR_FAIL_IF(!const_);
set_const(const_, compiler);
- reg = FAST_IS_REG(dst) ? dst : TMP_REG2;
-
- PTR_FAIL_IF(emit_const(compiler, reg, init_value));
+ dst_r = FAST_IS_REG(dst) ? dst : TMP_REG2;
+ PTR_FAIL_IF(emit_const(compiler, dst_r, init_value));
if (dst & SLJIT_MEM)
PTR_FAIL_IF(emit_op(compiler, SLJIT_MOV, WORD_DATA, dst, dstw, TMP_REG1, 0, TMP_REG2, 0));
+
return const_;
}
+
+SLJIT_API_FUNC_ATTRIBUTE struct sljit_put_label* sljit_emit_put_label(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw)
+{
+ struct sljit_put_label *put_label;
+ sljit_s32 dst_r;
+
+ CHECK_ERROR_PTR();
+ CHECK_PTR(check_sljit_emit_put_label(compiler, dst, dstw));
+ ADJUST_LOCAL_OFFSET(dst, dstw);
+
+ put_label = (struct sljit_put_label*)ensure_abuf(compiler, sizeof(struct sljit_put_label));
+ PTR_FAIL_IF(!put_label);
+ set_put_label(put_label, compiler, 0);
+
+ dst_r = FAST_IS_REG(dst) ? dst : TMP_REG2;
+#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32)
+ PTR_FAIL_IF(emit_const(compiler, dst_r, 0));
+#else
+ PTR_FAIL_IF(push_inst(compiler, dst_r));
+ compiler->size += 4;
+#endif
+
+ if (dst & SLJIT_MEM)
+ PTR_FAIL_IF(emit_op(compiler, SLJIT_MOV, WORD_DATA, dst, dstw, TMP_REG1, 0, TMP_REG2, 0));
+
+ return put_label;
+}
diff --git a/thirdparty/pcre2/src/sljit/sljitNativeSPARC_32.c b/thirdparty/pcre2/src/sljit/sljitNativeSPARC_32.c
index 0671b130cc..8079fad8df 100644
--- a/thirdparty/pcre2/src/sljit/sljitNativeSPARC_32.c
+++ b/thirdparty/pcre2/src/sljit/sljitNativeSPARC_32.c
@@ -267,6 +267,7 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_ta
{
sljit_ins *inst = (sljit_ins *)addr;
+ SLJIT_ASSERT(((inst[0] & 0xc1c00000) == 0x01000000) && ((inst[1] & 0xc1f82000) == 0x80102000));
inst[0] = (inst[0] & 0xffc00000) | ((new_target >> 10) & 0x3fffff);
inst[1] = (inst[1] & 0xfffffc00) | (new_target & 0x3ff);
inst = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset);
@@ -277,6 +278,7 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_consta
{
sljit_ins *inst = (sljit_ins *)addr;
+ SLJIT_ASSERT(((inst[0] & 0xc1c00000) == 0x01000000) && ((inst[1] & 0xc1f82000) == 0x80102000));
inst[0] = (inst[0] & 0xffc00000) | ((new_constant >> 10) & 0x3fffff);
inst[1] = (inst[1] & 0xfffffc00) | (new_constant & 0x3ff);
inst = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset);
diff --git a/thirdparty/pcre2/src/sljit/sljitNativeSPARC_common.c b/thirdparty/pcre2/src/sljit/sljitNativeSPARC_common.c
index 669ecd8152..bfa4ecede2 100644
--- a/thirdparty/pcre2/src/sljit/sljitNativeSPARC_common.c
+++ b/thirdparty/pcre2/src/sljit/sljitNativeSPARC_common.c
@@ -298,12 +298,14 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
sljit_ins *buf_ptr;
sljit_ins *buf_end;
sljit_uw word_count;
+ sljit_uw next_addr;
sljit_sw executable_offset;
sljit_uw addr;
struct sljit_label *label;
struct sljit_jump *jump;
struct sljit_const *const_;
+ struct sljit_put_label *put_label;
CHECK_ERROR_PTR();
CHECK_PTR(check_sljit_generate_code(compiler));
@@ -315,40 +317,52 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
code_ptr = code;
word_count = 0;
+ next_addr = 0;
executable_offset = SLJIT_EXEC_OFFSET(code);
label = compiler->labels;
jump = compiler->jumps;
const_ = compiler->consts;
+ put_label = compiler->put_labels;
do {
buf_ptr = (sljit_ins*)buf->memory;
buf_end = buf_ptr + (buf->used_size >> 2);
do {
*code_ptr = *buf_ptr++;
- SLJIT_ASSERT(!label || label->size >= word_count);
- SLJIT_ASSERT(!jump || jump->addr >= word_count);
- SLJIT_ASSERT(!const_ || const_->addr >= word_count);
- /* These structures are ordered by their address. */
- if (label && label->size == word_count) {
- /* Just recording the address. */
- label->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset);
- label->size = code_ptr - code;
- label = label->next;
- }
- if (jump && jump->addr == word_count) {
+ if (next_addr == word_count) {
+ SLJIT_ASSERT(!label || label->size >= word_count);
+ SLJIT_ASSERT(!jump || jump->addr >= word_count);
+ SLJIT_ASSERT(!const_ || const_->addr >= word_count);
+ SLJIT_ASSERT(!put_label || put_label->addr >= word_count);
+
+ /* These structures are ordered by their address. */
+ if (label && label->size == word_count) {
+ /* Just recording the address. */
+ label->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset);
+ label->size = code_ptr - code;
+ label = label->next;
+ }
+ if (jump && jump->addr == word_count) {
#if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)
- jump->addr = (sljit_uw)(code_ptr - 3);
+ jump->addr = (sljit_uw)(code_ptr - 3);
#else
- jump->addr = (sljit_uw)(code_ptr - 6);
+ jump->addr = (sljit_uw)(code_ptr - 6);
#endif
- code_ptr = detect_jump_type(jump, code_ptr, code, executable_offset);
- jump = jump->next;
- }
- if (const_ && const_->addr == word_count) {
- /* Just recording the address. */
- const_->addr = (sljit_uw)code_ptr;
- const_ = const_->next;
+ code_ptr = detect_jump_type(jump, code_ptr, code, executable_offset);
+ jump = jump->next;
+ }
+ if (const_ && const_->addr == word_count) {
+ /* Just recording the address. */
+ const_->addr = (sljit_uw)code_ptr;
+ const_ = const_->next;
+ }
+ if (put_label && put_label->addr == word_count) {
+ SLJIT_ASSERT(put_label->label);
+ put_label->addr = (sljit_uw)code_ptr;
+ put_label = put_label->next;
+ }
+ next_addr = compute_next_addr(label, jump, const_, put_label);
}
code_ptr ++;
word_count ++;
@@ -366,6 +380,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
SLJIT_ASSERT(!label);
SLJIT_ASSERT(!jump);
SLJIT_ASSERT(!const_);
+ SLJIT_ASSERT(!put_label);
SLJIT_ASSERT(code_ptr - code <= (sljit_s32)compiler->size);
jump = compiler->jumps;
@@ -389,8 +404,9 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
/* Set the fields of immediate loads. */
#if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)
- buf_ptr[0] = (buf_ptr[0] & 0xffc00000) | ((addr >> 10) & 0x3fffff);
- buf_ptr[1] = (buf_ptr[1] & 0xfffffc00) | (addr & 0x3ff);
+ SLJIT_ASSERT(((buf_ptr[0] & 0xc1cfffff) == 0x01000000) && ((buf_ptr[1] & 0xc1f83fff) == 0x80102000));
+ buf_ptr[0] |= (addr >> 10) & 0x3fffff;
+ buf_ptr[1] |= addr & 0x3ff;
#else
#error "Implementation required"
#endif
@@ -398,6 +414,20 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
jump = jump->next;
}
+ put_label = compiler->put_labels;
+ while (put_label) {
+ addr = put_label->label->addr;
+ buf_ptr = (sljit_ins *)put_label->addr;
+
+#if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)
+ SLJIT_ASSERT(((buf_ptr[0] & 0xc1cfffff) == 0x01000000) && ((buf_ptr[1] & 0xc1f83fff) == 0x80102000));
+ buf_ptr[0] |= (addr >> 10) & 0x3fffff;
+ buf_ptr[1] |= addr & 0x3ff;
+#else
+#error "Implementation required"
+#endif
+ put_label = put_label->next;
+ }
compiler->error = SLJIT_ERR_COMPILED;
compiler->executable_offset = executable_offset;
@@ -1465,8 +1495,8 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compil
SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw init_value)
{
- sljit_s32 reg;
struct sljit_const *const_;
+ sljit_s32 dst_r;
CHECK_ERROR_PTR();
CHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value));
@@ -1476,11 +1506,31 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compi
PTR_FAIL_IF(!const_);
set_const(const_, compiler);
- reg = FAST_IS_REG(dst) ? dst : TMP_REG2;
-
- PTR_FAIL_IF(emit_const(compiler, reg, init_value));
+ dst_r = FAST_IS_REG(dst) ? dst : TMP_REG2;
+ PTR_FAIL_IF(emit_const(compiler, dst_r, init_value));
if (dst & SLJIT_MEM)
PTR_FAIL_IF(emit_op_mem(compiler, WORD_DATA, TMP_REG2, dst, dstw));
return const_;
}
+
+SLJIT_API_FUNC_ATTRIBUTE struct sljit_put_label* sljit_emit_put_label(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw)
+{
+ struct sljit_put_label *put_label;
+ sljit_s32 dst_r;
+
+ CHECK_ERROR_PTR();
+ CHECK_PTR(check_sljit_emit_put_label(compiler, dst, dstw));
+ ADJUST_LOCAL_OFFSET(dst, dstw);
+
+ put_label = (struct sljit_put_label*)ensure_abuf(compiler, sizeof(struct sljit_put_label));
+ PTR_FAIL_IF(!put_label);
+ set_put_label(put_label, compiler, 0);
+
+ dst_r = FAST_IS_REG(dst) ? dst : TMP_REG2;
+ PTR_FAIL_IF(emit_const(compiler, dst_r, 0));
+
+ if (dst & SLJIT_MEM)
+ PTR_FAIL_IF(emit_op_mem(compiler, WORD_DATA, TMP_REG2, dst, dstw));
+ return put_label;
+}
diff --git a/thirdparty/pcre2/src/sljit/sljitNativeX86_32.c b/thirdparty/pcre2/src/sljit/sljitNativeX86_32.c
index 074e64b9f2..34a3a3d940 100644
--- a/thirdparty/pcre2/src/sljit/sljitNativeX86_32.c
+++ b/thirdparty/pcre2/src/sljit/sljitNativeX86_32.c
@@ -38,8 +38,10 @@ static sljit_s32 emit_do_imm(struct sljit_compiler *compiler, sljit_u8 opcode, s
return SLJIT_SUCCESS;
}
-static sljit_u8* generate_far_jump_code(struct sljit_jump *jump, sljit_u8 *code_ptr, sljit_s32 type, sljit_sw executable_offset)
+static sljit_u8* generate_far_jump_code(struct sljit_jump *jump, sljit_u8 *code_ptr, sljit_sw executable_offset)
{
+ sljit_s32 type = jump->flags >> TYPE_SHIFT;
+
if (type == SLJIT_JUMP) {
*code_ptr++ = JMP_i32;
jump->addr++;
diff --git a/thirdparty/pcre2/src/sljit/sljitNativeX86_64.c b/thirdparty/pcre2/src/sljit/sljitNativeX86_64.c
index 8506565614..5758711954 100644
--- a/thirdparty/pcre2/src/sljit/sljitNativeX86_64.c
+++ b/thirdparty/pcre2/src/sljit/sljitNativeX86_64.c
@@ -39,8 +39,10 @@ static sljit_s32 emit_load_imm64(struct sljit_compiler *compiler, sljit_s32 reg,
return SLJIT_SUCCESS;
}
-static sljit_u8* generate_far_jump_code(struct sljit_jump *jump, sljit_u8 *code_ptr, sljit_s32 type)
+static sljit_u8* generate_far_jump_code(struct sljit_jump *jump, sljit_u8 *code_ptr)
{
+ sljit_s32 type = jump->flags >> TYPE_SHIFT;
+
int short_addr = !(jump->flags & SLJIT_REWRITABLE_JUMP) && !(jump->flags & JUMP_LABEL) && (jump->u.target <= 0xffffffff);
/* The relative jump below specialized for this case. */
@@ -72,6 +74,56 @@ static sljit_u8* generate_far_jump_code(struct sljit_jump *jump, sljit_u8 *code_
return code_ptr;
}
+static sljit_u8* generate_put_label_code(struct sljit_put_label *put_label, sljit_u8 *code_ptr, sljit_uw max_label)
+{
+ if (max_label > HALFWORD_MAX) {
+ put_label->addr -= put_label->flags;
+ put_label->flags = PATCH_MD;
+ return code_ptr;
+ }
+
+ if (put_label->flags == 0) {
+ /* Destination is register. */
+ code_ptr = (sljit_u8*)put_label->addr - 2 - sizeof(sljit_uw);
+
+ SLJIT_ASSERT((code_ptr[0] & 0xf8) == REX_W);
+ SLJIT_ASSERT((code_ptr[1] & 0xf8) == MOV_r_i32);
+
+ if ((code_ptr[0] & 0x07) != 0) {
+ code_ptr[0] = (sljit_u8)(code_ptr[0] & ~0x08);
+ code_ptr += 2 + sizeof(sljit_s32);
+ }
+ else {
+ code_ptr[0] = code_ptr[1];
+ code_ptr += 1 + sizeof(sljit_s32);
+ }
+
+ put_label->addr = (sljit_uw)code_ptr;
+ return code_ptr;
+ }
+
+ code_ptr -= put_label->flags + (2 + sizeof(sljit_uw));
+ SLJIT_MEMMOVE(code_ptr, code_ptr + (2 + sizeof(sljit_uw)), put_label->flags);
+
+ SLJIT_ASSERT((code_ptr[0] & 0xf8) == REX_W);
+
+ if ((code_ptr[1] & 0xf8) == MOV_r_i32) {
+ code_ptr += 2 + sizeof(sljit_uw);
+ SLJIT_ASSERT((code_ptr[0] & 0xf8) == REX_W);
+ }
+
+ SLJIT_ASSERT(code_ptr[1] == MOV_rm_r);
+
+ code_ptr[0] = (sljit_u8)(code_ptr[0] & ~0x4);
+ code_ptr[1] = MOV_rm_i32;
+ code_ptr[2] = (sljit_u8)(code_ptr[2] & ~(0x7 << 3));
+
+ code_ptr = (sljit_u8*)(put_label->addr - (2 + sizeof(sljit_uw)) + sizeof(sljit_s32));
+ put_label->addr = (sljit_uw)code_ptr;
+ put_label->flags = 0;
+ return code_ptr;
+}
+
SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compiler,
sljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds,
sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)
diff --git a/thirdparty/pcre2/src/sljit/sljitNativeX86_common.c b/thirdparty/pcre2/src/sljit/sljitNativeX86_common.c
index 6f02ee3e8b..6296da5382 100644
--- a/thirdparty/pcre2/src/sljit/sljitNativeX86_common.c
+++ b/thirdparty/pcre2/src/sljit/sljitNativeX86_common.c
@@ -428,13 +428,15 @@ static sljit_u8 get_jump_code(sljit_s32 type)
}
#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
-static sljit_u8* generate_far_jump_code(struct sljit_jump *jump, sljit_u8 *code_ptr, sljit_s32 type, sljit_sw executable_offset);
+static sljit_u8* generate_far_jump_code(struct sljit_jump *jump, sljit_u8 *code_ptr, sljit_sw executable_offset);
#else
-static sljit_u8* generate_far_jump_code(struct sljit_jump *jump, sljit_u8 *code_ptr, sljit_s32 type);
+static sljit_u8* generate_far_jump_code(struct sljit_jump *jump, sljit_u8 *code_ptr);
+static sljit_u8* generate_put_label_code(struct sljit_put_label *put_label, sljit_u8 *code_ptr, sljit_uw max_label);
#endif
-static sljit_u8* generate_near_jump_code(struct sljit_jump *jump, sljit_u8 *code_ptr, sljit_u8 *code, sljit_s32 type, sljit_sw executable_offset)
+static sljit_u8* generate_near_jump_code(struct sljit_jump *jump, sljit_u8 *code_ptr, sljit_u8 *code, sljit_sw executable_offset)
{
+ sljit_s32 type = jump->flags >> TYPE_SHIFT;
sljit_s32 short_jump;
sljit_uw label_addr;
@@ -447,7 +449,7 @@ static sljit_u8* generate_near_jump_code(struct sljit_jump *jump, sljit_u8 *code
#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
if ((sljit_sw)(label_addr - (jump->addr + 1)) > HALFWORD_MAX || (sljit_sw)(label_addr - (jump->addr + 1)) < HALFWORD_MIN)
- return generate_far_jump_code(jump, code_ptr, type);
+ return generate_far_jump_code(jump, code_ptr);
#endif
if (type == SLJIT_JUMP) {
@@ -497,6 +499,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
struct sljit_label *label;
struct sljit_jump *jump;
struct sljit_const *const_;
+ struct sljit_put_label *put_label;
CHECK_ERROR_PTR();
CHECK_PTR(check_sljit_generate_code(compiler));
@@ -511,6 +514,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
label = compiler->labels;
jump = compiler->jumps;
const_ = compiler->consts;
+ put_label = compiler->put_labels;
executable_offset = SLJIT_EXEC_OFFSET(code);
do {
@@ -525,27 +529,38 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
buf_ptr += len;
}
else {
- if (*buf_ptr >= 2) {
+ switch (*buf_ptr) {
+ case 0:
+ label->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset);
+ label->size = code_ptr - code;
+ label = label->next;
+ break;
+ case 1:
jump->addr = (sljit_uw)code_ptr;
if (!(jump->flags & SLJIT_REWRITABLE_JUMP))
- code_ptr = generate_near_jump_code(jump, code_ptr, code, *buf_ptr - 2, executable_offset);
+ code_ptr = generate_near_jump_code(jump, code_ptr, code, executable_offset);
else {
#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
- code_ptr = generate_far_jump_code(jump, code_ptr, *buf_ptr - 2, executable_offset);
+ code_ptr = generate_far_jump_code(jump, code_ptr, executable_offset);
#else
- code_ptr = generate_far_jump_code(jump, code_ptr, *buf_ptr - 2);
+ code_ptr = generate_far_jump_code(jump, code_ptr);
#endif
}
jump = jump->next;
- }
- else if (*buf_ptr == 0) {
- label->addr = ((sljit_uw)code_ptr) + executable_offset;
- label->size = code_ptr - code;
- label = label->next;
- }
- else { /* *buf_ptr is 1 */
+ break;
+ case 2:
const_->addr = ((sljit_uw)code_ptr) - sizeof(sljit_sw);
const_ = const_->next;
+ break;
+ default:
+ SLJIT_ASSERT(*buf_ptr == 3);
+ SLJIT_ASSERT(put_label->label);
+ put_label->addr = (sljit_uw)code_ptr;
+#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
+ code_ptr = generate_put_label_code(put_label, code_ptr, (sljit_uw)(SLJIT_ADD_EXEC_OFFSET(code, executable_offset) + put_label->label->size));
+#endif
+ put_label = put_label->next;
+ break;
}
buf_ptr++;
}
@@ -557,6 +572,8 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
SLJIT_ASSERT(!label);
SLJIT_ASSERT(!jump);
SLJIT_ASSERT(!const_);
+ SLJIT_ASSERT(!put_label);
+ SLJIT_ASSERT(code_ptr <= code + compiler->size);
jump = compiler->jumps;
while (jump) {
@@ -591,8 +608,24 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
jump = jump->next;
}
- /* Some space may be wasted because of short jumps. */
- SLJIT_ASSERT(code_ptr <= code + compiler->size);
+ put_label = compiler->put_labels;
+ while (put_label) {
+#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
+ sljit_unaligned_store_sw((void*)(put_label->addr - sizeof(sljit_sw)), (sljit_sw)put_label->label->addr);
+#else
+ if (put_label->flags & PATCH_MD) {
+ SLJIT_ASSERT(put_label->label->addr > HALFWORD_MAX);
+ sljit_unaligned_store_sw((void*)(put_label->addr - sizeof(sljit_sw)), (sljit_sw)put_label->label->addr);
+ }
+ else {
+ SLJIT_ASSERT(put_label->label->addr <= HALFWORD_MAX);
+ sljit_unaligned_store_s32((void*)(put_label->addr - sizeof(sljit_s32)), (sljit_s32)put_label->label->addr);
+ }
+#endif
+
+ put_label = put_label->next;
+ }
+
compiler->error = SLJIT_ERR_COMPILED;
compiler->executable_offset = executable_offset;
compiler->executable_size = code_ptr - code;
@@ -2481,7 +2514,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile
jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));
PTR_FAIL_IF_NULL(jump);
- set_jump(jump, compiler, type & SLJIT_REWRITABLE_JUMP);
+ set_jump(jump, compiler, (type & SLJIT_REWRITABLE_JUMP) | ((type & 0xff) << TYPE_SHIFT));
type &= 0xff;
/* Worst case size. */
@@ -2495,7 +2528,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile
PTR_FAIL_IF_NULL(inst);
*inst++ = 0;
- *inst++ = type + 2;
+ *inst++ = 1;
return jump;
}
@@ -2513,7 +2546,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compi
if (src == SLJIT_IMM) {
jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));
FAIL_IF_NULL(jump);
- set_jump(jump, compiler, JUMP_ADDR);
+ set_jump(jump, compiler, JUMP_ADDR | (type << TYPE_SHIFT));
jump->u.target = srcw;
/* Worst case size. */
@@ -2527,7 +2560,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compi
FAIL_IF_NULL(inst);
*inst++ = 0;
- *inst++ = type + 2;
+ *inst++ = 1;
}
else {
#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
@@ -2831,7 +2864,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compi
PTR_FAIL_IF(!inst);
*inst++ = 0;
- *inst++ = 1;
+ *inst++ = 2;
#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
if (dst & SLJIT_MEM)
@@ -2842,6 +2875,54 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compi
return const_;
}
+SLJIT_API_FUNC_ATTRIBUTE struct sljit_put_label* sljit_emit_put_label(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw)
+{
+ struct sljit_put_label *put_label;
+ sljit_u8 *inst;
+#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
+ sljit_s32 reg;
+ sljit_uw start_size;
+#endif
+
+ CHECK_ERROR_PTR();
+ CHECK_PTR(check_sljit_emit_put_label(compiler, dst, dstw));
+ ADJUST_LOCAL_OFFSET(dst, dstw);
+
+ CHECK_EXTRA_REGS(dst, dstw, (void)0);
+
+ put_label = (struct sljit_put_label*)ensure_abuf(compiler, sizeof(struct sljit_put_label));
+ PTR_FAIL_IF(!put_label);
+ set_put_label(put_label, compiler, 0);
+
+#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
+ compiler->mode32 = 0;
+ reg = FAST_IS_REG(dst) ? dst : TMP_REG1;
+
+ if (emit_load_imm64(compiler, reg, 0))
+ return NULL;
+#else
+ if (emit_mov(compiler, dst, dstw, SLJIT_IMM, 0))
+ return NULL;
+#endif
+
+#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
+ if (dst & SLJIT_MEM) {
+ start_size = compiler->size;
+ if (emit_mov(compiler, dst, dstw, TMP_REG1, 0))
+ return NULL;
+ put_label->flags = compiler->size - start_size;
+ }
+#endif
+
+ inst = (sljit_u8*)ensure_buf(compiler, 2);
+ PTR_FAIL_IF(!inst);
+
+ *inst++ = 0;
+ *inst++ = 3;
+
+ return put_label;
+}
+
SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target, sljit_sw executable_offset)
{
SLJIT_UNUSED_ARG(executable_offset);
diff --git a/thirdparty/pcre2/src/sljit/sljitUtils.c b/thirdparty/pcre2/src/sljit/sljitUtils.c
index 5c2a838932..857492a174 100644
--- a/thirdparty/pcre2/src/sljit/sljitUtils.c
+++ b/thirdparty/pcre2/src/sljit/sljitUtils.c
@@ -154,7 +154,13 @@ SLJIT_API_FUNC_ATTRIBUTE void SLJIT_FUNC sljit_release_lock(void)
#include "windows.h"
#else
/* Provides mmap function. */
+#include <sys/types.h>
#include <sys/mman.h>
+#ifndef MAP_ANON
+#ifdef MAP_ANONYMOUS
+#define MAP_ANON MAP_ANONYMOUS
+#endif
+#endif
/* For detecting the page size. */
#include <unistd.h>
diff --git a/thirdparty/recastnavigation/Recast/Include/Recast.h b/thirdparty/recastnavigation/Recast/Include/Recast.h
index e85c0d2e29..4d557389b5 100644
--- a/thirdparty/recastnavigation/Recast/Include/Recast.h
+++ b/thirdparty/recastnavigation/Recast/Include/Recast.h
@@ -332,6 +332,8 @@ struct rcCompactSpan
/// @ingroup recast
struct rcCompactHeightfield
{
+ rcCompactHeightfield();
+ ~rcCompactHeightfield();
int width; ///< The width of the heightfield. (Along the x-axis in cell units.)
int height; ///< The height of the heightfield. (Along the z-axis in cell units.)
int spanCount; ///< The number of spans in the heightfield.
@@ -376,6 +378,8 @@ struct rcHeightfieldLayer
/// @see rcAllocHeightfieldLayerSet, rcFreeHeightfieldLayerSet
struct rcHeightfieldLayerSet
{
+ rcHeightfieldLayerSet();
+ ~rcHeightfieldLayerSet();
rcHeightfieldLayer* layers; ///< The layers in the set. [Size: #nlayers]
int nlayers; ///< The number of layers in the set.
};
@@ -395,6 +399,8 @@ struct rcContour
/// @ingroup recast
struct rcContourSet
{
+ rcContourSet();
+ ~rcContourSet();
rcContour* conts; ///< An array of the contours in the set. [Size: #nconts]
int nconts; ///< The number of contours in the set.
float bmin[3]; ///< The minimum bounds in world space. [(x, y, z)]
@@ -411,6 +417,8 @@ struct rcContourSet
/// @ingroup recast
struct rcPolyMesh
{
+ rcPolyMesh();
+ ~rcPolyMesh();
unsigned short* verts; ///< The mesh vertices. [Form: (x, y, z) * #nverts]
unsigned short* polys; ///< Polygon and neighbor data. [Length: #maxpolys * 2 * #nvp]
unsigned short* regs; ///< The region id assigned to each polygon. [Length: #maxpolys]
diff --git a/thirdparty/recastnavigation/Recast/Include/RecastAlloc.h b/thirdparty/recastnavigation/Recast/Include/RecastAlloc.h
index 3cdd450d42..e436af9a01 100644
--- a/thirdparty/recastnavigation/Recast/Include/RecastAlloc.h
+++ b/thirdparty/recastnavigation/Recast/Include/RecastAlloc.h
@@ -20,6 +20,9 @@
#define RECASTALLOC_H
#include <stddef.h>
+#include <stdint.h>
+
+#include <RecastAssert.h>
/// Provides hint values to the memory allocator on how long the
/// memory is expected to be used.
@@ -58,64 +61,257 @@ void* rcAlloc(size_t size, rcAllocHint hint);
/// @see rcAlloc
void rcFree(void* ptr);
+/// An implementation of operator new usable for placement new. The default one is part of STL (which we don't use).
+/// rcNewTag is a dummy type used to differentiate our operator from the STL one, in case users import both Recast
+/// and STL.
+struct rcNewTag {};
+inline void* operator new(size_t, const rcNewTag&, void* p) { return p; }
+inline void operator delete(void*, const rcNewTag&, void*) {}
-/// A simple dynamic array of integers.
-class rcIntArray
-{
- int* m_data;
- int m_size, m_cap;
+/// Signed to avoid warnnings when comparing to int loop indexes, and common error with comparing to zero.
+/// MSVC2010 has a bug where ssize_t is unsigned (!!!).
+typedef intptr_t rcSizeType;
+#define RC_SIZE_MAX INTPTR_MAX
- void doResize(int n);
-
- // Explicitly disabled copy constructor and copy assignment operator.
- rcIntArray(const rcIntArray&);
- rcIntArray& operator=(const rcIntArray&);
+/// Macros to hint to the compiler about the likeliest branch. Please add a benchmark that demonstrates a performance
+/// improvement before introducing use cases.
+#if defined(__GNUC__) || defined(__clang__)
+#define rcLikely(x) __builtin_expect((x), true)
+#define rcUnlikely(x) __builtin_expect((x), false)
+#else
+#define rcLikely(x) (x)
+#define rcUnlikely(x) (x)
+#endif
-public:
- /// Constructs an instance with an initial array size of zero.
- rcIntArray() : m_data(0), m_size(0), m_cap(0) {}
+/// Variable-sized storage type. Mimics the interface of std::vector<T> with some notable differences:
+/// * Uses rcAlloc()/rcFree() to handle storage.
+/// * No support for a custom allocator.
+/// * Uses signed size instead of size_t to avoid warnings in for loops: "for (int i = 0; i < foo.size(); i++)"
+/// * Omits methods of limited utility: insert/erase, (bad performance), at (we don't use exceptions), operator=.
+/// * assign() and the pre-sizing constructor follow C++11 semantics -- they don't construct a temporary if no value is provided.
+/// * push_back() and resize() support adding values from the current vector. Range-based constructors and assign(begin, end) do not.
+/// * No specialization for bool.
+template <typename T, rcAllocHint H>
+class rcVectorBase {
+ rcSizeType m_size;
+ rcSizeType m_cap;
+ T* m_data;
+ // Constructs a T at the give address with either the copy constructor or the default.
+ static void construct(T* p, const T& v) { ::new(rcNewTag(), (void*)p) T(v); }
+ static void construct(T* p) { ::new(rcNewTag(), (void*)p) T; }
+ static void construct_range(T* begin, T* end);
+ static void construct_range(T* begin, T* end, const T& value);
+ static void copy_range(T* dst, const T* begin, const T* end);
+ void destroy_range(rcSizeType begin, rcSizeType end);
+ // Creates an array of the given size, copies all of this vector's data into it, and returns it.
+ T* allocate_and_copy(rcSizeType size);
+ void resize_impl(rcSizeType size, const T* value);
+ public:
+ typedef rcSizeType size_type;
+ typedef T value_type;
- /// Constructs an instance initialized to the specified size.
- /// @param[in] n The initial size of the integer array.
- rcIntArray(int n) : m_data(0), m_size(0), m_cap(0) { resize(n); }
- ~rcIntArray() { rcFree(m_data); }
+ rcVectorBase() : m_size(0), m_cap(0), m_data(0) {};
+ rcVectorBase(const rcVectorBase<T, H>& other) : m_size(0), m_cap(0), m_data(0) { assign(other.begin(), other.end()); }
+ explicit rcVectorBase(rcSizeType count) : m_size(0), m_cap(0), m_data(0) { resize(count); }
+ rcVectorBase(rcSizeType count, const T& value) : m_size(0), m_cap(0), m_data(0) { resize(count, value); }
+ rcVectorBase(const T* begin, const T* end) : m_size(0), m_cap(0), m_data(0) { assign(begin, end); }
+ ~rcVectorBase() { destroy_range(0, m_size); rcFree(m_data); }
- /// Specifies the new size of the integer array.
- /// @param[in] n The new size of the integer array.
- void resize(int n)
- {
- if (n > m_cap)
- doResize(n);
-
- m_size = n;
+ // Unlike in std::vector, we return a bool to indicate whether the alloc was successful.
+ bool reserve(rcSizeType size);
+
+ void assign(rcSizeType count, const T& value) { clear(); resize(count, value); }
+ void assign(const T* begin, const T* end);
+
+ void resize(rcSizeType size) { resize_impl(size, NULL); }
+ void resize(rcSizeType size, const T& value) { resize_impl(size, &value); }
+ // Not implemented as resize(0) because resize requires T to be default-constructible.
+ void clear() { destroy_range(0, m_size); m_size = 0; }
+
+ void push_back(const T& value);
+ void pop_back() { rcAssert(m_size > 0); back().~T(); m_size--; }
+
+ rcSizeType size() const { return m_size; }
+ rcSizeType capacity() const { return m_cap; }
+ bool empty() const { return size() == 0; }
+
+ const T& operator[](rcSizeType i) const { rcAssert(i >= 0 && i < m_size); return m_data[i]; }
+ T& operator[](rcSizeType i) { rcAssert(i >= 0 && i < m_size); return m_data[i]; }
+
+ const T& front() const { rcAssert(m_size); return m_data[0]; }
+ T& front() { rcAssert(m_size); return m_data[0]; }
+ const T& back() const { rcAssert(m_size); return m_data[m_size - 1]; };
+ T& back() { rcAssert(m_size); return m_data[m_size - 1]; };
+ const T* data() const { return m_data; }
+ T* data() { return m_data; }
+
+ T* begin() { return m_data; }
+ T* end() { return m_data + m_size; }
+ const T* begin() const { return m_data; }
+ const T* end() const { return m_data + m_size; }
+
+ void swap(rcVectorBase<T, H>& other);
+
+ // Explicitly deleted.
+ rcVectorBase& operator=(const rcVectorBase<T, H>& other);
+};
+
+template<typename T, rcAllocHint H>
+bool rcVectorBase<T, H>::reserve(rcSizeType count) {
+ if (count <= m_cap) {
+ return true;
+ }
+ T* new_data = allocate_and_copy(count);
+ if (!new_data) {
+ return false;
+ }
+ destroy_range(0, m_size);
+ rcFree(m_data);
+ m_data = new_data;
+ m_cap = count;
+ return true;
+}
+template <typename T, rcAllocHint H>
+T* rcVectorBase<T, H>::allocate_and_copy(rcSizeType size) {
+ rcAssert(RC_SIZE_MAX / static_cast<rcSizeType>(sizeof(T)) >= size);
+ T* new_data = static_cast<T*>(rcAlloc(sizeof(T) * size, H));
+ if (new_data) {
+ copy_range(new_data, m_data, m_data + m_size);
+ }
+ return new_data;
+}
+template <typename T, rcAllocHint H>
+void rcVectorBase<T, H>::assign(const T* begin, const T* end) {
+ clear();
+ reserve(end - begin);
+ m_size = end - begin;
+ copy_range(m_data, begin, end);
+}
+template <typename T, rcAllocHint H>
+void rcVectorBase<T, H>::push_back(const T& value) {
+ // rcLikely increases performance by ~50% on BM_rcVector_PushPreallocated,
+ // and by ~2-5% on BM_rcVector_Push.
+ if (rcLikely(m_size < m_cap)) {
+ construct(m_data + m_size++, value);
+ return;
}
- /// Push the specified integer onto the end of the array and increases the size by one.
- /// @param[in] item The new value.
- void push(int item) { resize(m_size+1); m_data[m_size-1] = item; }
+ rcAssert(RC_SIZE_MAX / 2 >= m_size);
+ rcSizeType new_cap = m_size ? 2*m_size : 1;
+ T* data = allocate_and_copy(new_cap);
+ // construct between allocate and destroy+free in case value is
+ // in this vector.
+ construct(data + m_size, value);
+ destroy_range(0, m_size);
+ m_size++;
+ m_cap = new_cap;
+ rcFree(m_data);
+ m_data = data;
+}
+template <typename T, rcAllocHint H>
+void rcVectorBase<T, H>::resize_impl(rcSizeType size, const T* value) {
+ if (size < m_size) {
+ destroy_range(size, m_size);
+ m_size = size;
+ } else if (size > m_size) {
+ T* new_data = allocate_and_copy(size);
+ // We defer deconstructing/freeing old data until after constructing
+ // new elements in case "value" is there.
+ if (value) {
+ construct_range(new_data + m_size, new_data + size, *value);
+ } else {
+ construct_range(new_data + m_size, new_data + size);
+ }
+ destroy_range(0, m_size);
+ rcFree(m_data);
+ m_data = new_data;
+ m_cap = size;
+ m_size = size;
+ }
+}
+template <typename T, rcAllocHint H>
+void rcVectorBase<T, H>::swap(rcVectorBase<T, H>& other) {
+ // TODO: Reorganize headers so we can use rcSwap here.
+ rcSizeType tmp_cap = other.m_cap;
+ rcSizeType tmp_size = other.m_size;
+ T* tmp_data = other.m_data;
- /// Returns the value at the end of the array and reduces the size by one.
- /// @return The value at the end of the array.
- int pop()
- {
- if (m_size > 0)
- m_size--;
-
- return m_data[m_size];
+ other.m_cap = m_cap;
+ other.m_size = m_size;
+ other.m_data = m_data;
+
+ m_cap = tmp_cap;
+ m_size = tmp_size;
+ m_data = tmp_data;
+}
+// static
+template <typename T, rcAllocHint H>
+void rcVectorBase<T, H>::construct_range(T* begin, T* end) {
+ for (T* p = begin; p < end; p++) {
+ construct(p);
+ }
+}
+// static
+template <typename T, rcAllocHint H>
+void rcVectorBase<T, H>::construct_range(T* begin, T* end, const T& value) {
+ for (T* p = begin; p < end; p++) {
+ construct(p, value);
+ }
+}
+// static
+template <typename T, rcAllocHint H>
+void rcVectorBase<T, H>::copy_range(T* dst, const T* begin, const T* end) {
+ for (rcSizeType i = 0 ; i < end - begin; i++) {
+ construct(dst + i, begin[i]);
}
+}
+template <typename T, rcAllocHint H>
+void rcVectorBase<T, H>::destroy_range(rcSizeType begin, rcSizeType end) {
+ for (rcSizeType i = begin; i < end; i++) {
+ m_data[i].~T();
+ }
+}
- /// The value at the specified array index.
- /// @warning Does not provide overflow protection.
- /// @param[in] i The index of the value.
- const int& operator[](int i) const { return m_data[i]; }
+template <typename T>
+class rcTempVector : public rcVectorBase<T, RC_ALLOC_TEMP> {
+ typedef rcVectorBase<T, RC_ALLOC_TEMP> Base;
+public:
+ rcTempVector() : Base() {}
+ explicit rcTempVector(rcSizeType size) : Base(size) {}
+ rcTempVector(rcSizeType size, const T& value) : Base(size, value) {}
+ rcTempVector(const rcTempVector<T>& other) : Base(other) {}
+ rcTempVector(const T* begin, const T* end) : Base(begin, end) {}
+};
+template <typename T>
+class rcPermVector : public rcVectorBase<T, RC_ALLOC_PERM> {
+ typedef rcVectorBase<T, RC_ALLOC_PERM> Base;
+public:
+ rcPermVector() : Base() {}
+ explicit rcPermVector(rcSizeType size) : Base(size) {}
+ rcPermVector(rcSizeType size, const T& value) : Base(size, value) {}
+ rcPermVector(const rcPermVector<T>& other) : Base(other) {}
+ rcPermVector(const T* begin, const T* end) : Base(begin, end) {}
+};
- /// The value at the specified array index.
- /// @warning Does not provide overflow protection.
- /// @param[in] i The index of the value.
- int& operator[](int i) { return m_data[i]; }
- /// The current size of the integer array.
- int size() const { return m_size; }
+/// Legacy class. Prefer rcVector<int>.
+class rcIntArray
+{
+ rcTempVector<int> m_impl;
+public:
+ rcIntArray() {}
+ rcIntArray(int n) : m_impl(n, 0) {}
+ void push(int item) { m_impl.push_back(item); }
+ void resize(int size) { m_impl.resize(size); }
+ int pop()
+ {
+ int v = m_impl.back();
+ m_impl.pop_back();
+ return v;
+ }
+ int size() const { return static_cast<int>(m_impl.size()); }
+ int& operator[](int index) { return m_impl[index]; }
+ int operator[](int index) const { return m_impl[index]; }
};
/// A simple helper class used to delete an array when it goes out of scope.
diff --git a/thirdparty/recastnavigation/Recast/Source/Recast.cpp b/thirdparty/recastnavigation/Recast/Source/Recast.cpp
index 8308d1973e..1b71710cdc 100644
--- a/thirdparty/recastnavigation/Recast/Source/Recast.cpp
+++ b/thirdparty/recastnavigation/Recast/Source/Recast.cpp
@@ -23,11 +23,34 @@
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
-#include <new>
#include "Recast.h"
#include "RecastAlloc.h"
#include "RecastAssert.h"
+namespace
+{
+/// Allocates and constructs an object of the given type, returning a pointer.
+/// TODO: Support constructor args.
+/// @param[in] hint Hint to the allocator.
+template <typename T>
+T* rcNew(rcAllocHint hint) {
+ T* ptr = (T*)rcAlloc(sizeof(T), hint);
+ ::new(rcNewTag(), (void*)ptr) T();
+ return ptr;
+}
+
+/// Destroys and frees an object allocated with rcNew.
+/// @param[in] ptr The object pointer to delete.
+template <typename T>
+void rcDelete(T* ptr) {
+ if (ptr) {
+ ptr->~T();
+ rcFree((void*)ptr);
+ }
+}
+} // namespace
+
+
float rcSqrt(float x)
{
return sqrtf(x);
@@ -73,9 +96,8 @@ void rcContext::log(const rcLogCategory category, const char* format, ...)
rcHeightfield* rcAllocHeightfield()
{
- return new (rcAlloc(sizeof(rcHeightfield), RC_ALLOC_PERM)) rcHeightfield;
+ return rcNew<rcHeightfield>(RC_ALLOC_PERM);
}
-
rcHeightfield::rcHeightfield()
: width()
, height()
@@ -104,84 +126,133 @@ rcHeightfield::~rcHeightfield()
void rcFreeHeightField(rcHeightfield* hf)
{
- if (!hf) return;
- hf->~rcHeightfield();
- rcFree(hf);
+ rcDelete(hf);
}
rcCompactHeightfield* rcAllocCompactHeightfield()
{
- rcCompactHeightfield* chf = (rcCompactHeightfield*)rcAlloc(sizeof(rcCompactHeightfield), RC_ALLOC_PERM);
- memset(chf, 0, sizeof(rcCompactHeightfield));
- return chf;
+ return rcNew<rcCompactHeightfield>(RC_ALLOC_PERM);
}
void rcFreeCompactHeightfield(rcCompactHeightfield* chf)
{
- if (!chf) return;
- rcFree(chf->cells);
- rcFree(chf->spans);
- rcFree(chf->dist);
- rcFree(chf->areas);
- rcFree(chf);
+ rcDelete(chf);
}
-rcHeightfieldLayerSet* rcAllocHeightfieldLayerSet()
+rcCompactHeightfield::rcCompactHeightfield()
+ : width(),
+ height(),
+ spanCount(),
+ walkableHeight(),
+ walkableClimb(),
+ borderSize(),
+ maxDistance(),
+ maxRegions(),
+ bmin(),
+ bmax(),
+ cs(),
+ ch(),
+ cells(),
+ spans(),
+ dist(),
+ areas()
{
- rcHeightfieldLayerSet* lset = (rcHeightfieldLayerSet*)rcAlloc(sizeof(rcHeightfieldLayerSet), RC_ALLOC_PERM);
- memset(lset, 0, sizeof(rcHeightfieldLayerSet));
- return lset;
+}
+rcCompactHeightfield::~rcCompactHeightfield()
+{
+ rcFree(cells);
+ rcFree(spans);
+ rcFree(dist);
+ rcFree(areas);
}
+rcHeightfieldLayerSet* rcAllocHeightfieldLayerSet()
+{
+ return rcNew<rcHeightfieldLayerSet>(RC_ALLOC_PERM);
+}
void rcFreeHeightfieldLayerSet(rcHeightfieldLayerSet* lset)
{
- if (!lset) return;
- for (int i = 0; i < lset->nlayers; ++i)
+ rcDelete(lset);
+}
+
+rcHeightfieldLayerSet::rcHeightfieldLayerSet()
+ : layers(), nlayers() {}
+rcHeightfieldLayerSet::~rcHeightfieldLayerSet()
+{
+ for (int i = 0; i < nlayers; ++i)
{
- rcFree(lset->layers[i].heights);
- rcFree(lset->layers[i].areas);
- rcFree(lset->layers[i].cons);
+ rcFree(layers[i].heights);
+ rcFree(layers[i].areas);
+ rcFree(layers[i].cons);
}
- rcFree(lset->layers);
- rcFree(lset);
+ rcFree(layers);
}
rcContourSet* rcAllocContourSet()
{
- rcContourSet* cset = (rcContourSet*)rcAlloc(sizeof(rcContourSet), RC_ALLOC_PERM);
- memset(cset, 0, sizeof(rcContourSet));
- return cset;
+ return rcNew<rcContourSet>(RC_ALLOC_PERM);
}
-
void rcFreeContourSet(rcContourSet* cset)
{
- if (!cset) return;
- for (int i = 0; i < cset->nconts; ++i)
+ rcDelete(cset);
+}
+
+rcContourSet::rcContourSet()
+ : conts(),
+ nconts(),
+ bmin(),
+ bmax(),
+ cs(),
+ ch(),
+ width(),
+ height(),
+ borderSize(),
+ maxError() {}
+rcContourSet::~rcContourSet()
+{
+ for (int i = 0; i < nconts; ++i)
{
- rcFree(cset->conts[i].verts);
- rcFree(cset->conts[i].rverts);
+ rcFree(conts[i].verts);
+ rcFree(conts[i].rverts);
}
- rcFree(cset->conts);
- rcFree(cset);
+ rcFree(conts);
}
+
rcPolyMesh* rcAllocPolyMesh()
{
- rcPolyMesh* pmesh = (rcPolyMesh*)rcAlloc(sizeof(rcPolyMesh), RC_ALLOC_PERM);
- memset(pmesh, 0, sizeof(rcPolyMesh));
- return pmesh;
+ return rcNew<rcPolyMesh>(RC_ALLOC_PERM);
}
-
void rcFreePolyMesh(rcPolyMesh* pmesh)
{
- if (!pmesh) return;
- rcFree(pmesh->verts);
- rcFree(pmesh->polys);
- rcFree(pmesh->regs);
- rcFree(pmesh->flags);
- rcFree(pmesh->areas);
- rcFree(pmesh);
+ rcDelete(pmesh);
+}
+
+rcPolyMesh::rcPolyMesh()
+ : verts(),
+ polys(),
+ regs(),
+ flags(),
+ areas(),
+ nverts(),
+ npolys(),
+ maxpolys(),
+ nvp(),
+ bmin(),
+ bmax(),
+ cs(),
+ ch(),
+ borderSize(),
+ maxEdgeError() {}
+
+rcPolyMesh::~rcPolyMesh()
+{
+ rcFree(verts);
+ rcFree(polys);
+ rcFree(regs);
+ rcFree(flags);
+ rcFree(areas);
}
rcPolyMeshDetail* rcAllocPolyMeshDetail()
diff --git a/thirdparty/recastnavigation/Recast/Source/RecastAlloc.cpp b/thirdparty/recastnavigation/Recast/Source/RecastAlloc.cpp
index 453b5fa6a6..bdc366116e 100644
--- a/thirdparty/recastnavigation/Recast/Source/RecastAlloc.cpp
+++ b/thirdparty/recastnavigation/Recast/Source/RecastAlloc.cpp
@@ -58,29 +58,3 @@ void rcFree(void* ptr)
if (ptr)
sRecastFreeFunc(ptr);
}
-
-/// @class rcIntArray
-///
-/// While it is possible to pre-allocate a specific array size during
-/// construction or by using the #resize method, certain methods will
-/// automatically resize the array as needed.
-///
-/// @warning The array memory is not initialized to zero when the size is
-/// manually set during construction or when using #resize.
-
-/// @par
-///
-/// Using this method ensures the array is at least large enough to hold
-/// the specified number of elements. This can improve performance by
-/// avoiding auto-resizing during use.
-void rcIntArray::doResize(int n)
-{
- if (!m_cap) m_cap = n;
- while (m_cap < n) m_cap *= 2;
- int* newData = (int*)rcAlloc(m_cap*sizeof(int), RC_ALLOC_TEMP);
- rcAssert(newData);
- if (m_size && newData) memcpy(newData, m_data, m_size*sizeof(int));
- rcFree(m_data);
- m_data = newData;
-}
-
diff --git a/thirdparty/recastnavigation/Recast/Source/RecastContour.cpp b/thirdparty/recastnavigation/Recast/Source/RecastContour.cpp
index 277ab01501..6574c11b6b 100644
--- a/thirdparty/recastnavigation/Recast/Source/RecastContour.cpp
+++ b/thirdparty/recastnavigation/Recast/Source/RecastContour.cpp
@@ -1009,7 +1009,7 @@ bool rcBuildContours(rcContext* ctx, rcCompactHeightfield& chf,
if (cset.nconts > 0)
{
// Calculate winding of all polygons.
- rcScopedDelete<char> winding((char*)rcAlloc(sizeof(char)*cset.nconts, RC_ALLOC_TEMP));
+ rcScopedDelete<signed char> winding((signed char*)rcAlloc(sizeof(signed char)*cset.nconts, RC_ALLOC_TEMP));
if (!winding)
{
ctx->log(RC_LOG_ERROR, "rcBuildContours: Out of memory 'hole' (%d).", cset.nconts);
diff --git a/thirdparty/recastnavigation/Recast/Source/RecastMeshDetail.cpp b/thirdparty/recastnavigation/Recast/Source/RecastMeshDetail.cpp
index f953132f74..9a423cab8a 100644
--- a/thirdparty/recastnavigation/Recast/Source/RecastMeshDetail.cpp
+++ b/thirdparty/recastnavigation/Recast/Source/RecastMeshDetail.cpp
@@ -557,15 +557,16 @@ static float polyMinExtent(const float* verts, const int nverts)
inline int prev(int i, int n) { return i-1 >= 0 ? i-1 : n-1; }
inline int next(int i, int n) { return i+1 < n ? i+1 : 0; }
-static void triangulateHull(const int /*nverts*/, const float* verts, const int nhull, const int* hull, rcIntArray& tris)
+static void triangulateHull(const int /*nverts*/, const float* verts, const int nhull, const int* hull, const int nin, rcIntArray& tris)
{
int start = 0, left = 1, right = nhull-1;
// Start from an ear with shortest perimeter.
// This tends to favor well formed triangles as starting point.
- float dmin = 0;
+ float dmin = FLT_MAX;
for (int i = 0; i < nhull; i++)
{
+ if (hull[i] >= nin) continue; // Ears are triangles with original vertices as middle vertex while others are actually line segments on edges
int pi = prev(i, nhull);
int ni = next(i, nhull);
const float* pv = &verts[hull[pi]*3];
@@ -770,7 +771,7 @@ static bool buildPolyDetail(rcContext* ctx, const float* in, const int nin,
// If the polygon minimum extent is small (sliver or small triangle), do not try to add internal points.
if (minExtent < sampleDist*2)
{
- triangulateHull(nverts, verts, nhull, hull, tris);
+ triangulateHull(nverts, verts, nhull, hull, nin, tris);
return true;
}
@@ -778,7 +779,7 @@ static bool buildPolyDetail(rcContext* ctx, const float* in, const int nin,
// We're using the triangulateHull instead of delaunayHull as it tends to
// create a bit better triangulation for long thin triangles when there
// are no internal points.
- triangulateHull(nverts, verts, nhull, hull, tris);
+ triangulateHull(nverts, verts, nhull, hull, nin, tris);
if (tris.size() == 0)
{
@@ -1140,7 +1141,8 @@ static void getHeightData(rcContext* ctx, const rcCompactHeightfield& chf,
static unsigned char getEdgeFlags(const float* va, const float* vb,
const float* vpoly, const int npoly)
{
- // Return true if edge (va,vb) is part of the polygon.
+ // The flag returned by this function matches dtDetailTriEdgeFlags in Detour.
+ // Figure out if edge (va,vb) is part of the polygon boundary.
static const float thrSqr = rcSqr(0.001f);
for (int i = 0, j = npoly-1; i < npoly; j=i++)
{
diff --git a/thirdparty/recastnavigation/Recast/Source/RecastRegion.cpp b/thirdparty/recastnavigation/Recast/Source/RecastRegion.cpp
index 38a2bd6bfa..e1fc0ee788 100644
--- a/thirdparty/recastnavigation/Recast/Source/RecastRegion.cpp
+++ b/thirdparty/recastnavigation/Recast/Source/RecastRegion.cpp
@@ -25,8 +25,17 @@
#include "Recast.h"
#include "RecastAlloc.h"
#include "RecastAssert.h"
-#include <new>
+namespace
+{
+struct LevelStackEntry
+{
+ LevelStackEntry(int x_, int y_, int index_) : x(x_), y(y_), index(index_) {}
+ int x;
+ int y;
+ int index;
+};
+} // namespace
static void calculateDistanceField(rcCompactHeightfield& chf, unsigned short* src, unsigned short& maxDist)
{
@@ -245,17 +254,15 @@ static bool floodRegion(int x, int y, int i,
unsigned short level, unsigned short r,
rcCompactHeightfield& chf,
unsigned short* srcReg, unsigned short* srcDist,
- rcIntArray& stack)
+ rcTempVector<LevelStackEntry>& stack)
{
const int w = chf.width;
const unsigned char area = chf.areas[i];
// Flood fill mark region.
- stack.resize(0);
- stack.push((int)x);
- stack.push((int)y);
- stack.push((int)i);
+ stack.clear();
+ stack.push_back(LevelStackEntry(x, y, i));
srcReg[i] = r;
srcDist[i] = 0;
@@ -264,9 +271,11 @@ static bool floodRegion(int x, int y, int i,
while (stack.size() > 0)
{
- int ci = stack.pop();
- int cy = stack.pop();
- int cx = stack.pop();
+ LevelStackEntry& back = stack.back();
+ int cx = back.x;
+ int cy = back.y;
+ int ci = back.index;
+ stack.pop_back();
const rcCompactSpan& cs = chf.spans[ci];
@@ -332,9 +341,7 @@ static bool floodRegion(int x, int y, int i,
{
srcReg[ai] = r;
srcDist[ai] = 0;
- stack.push(ax);
- stack.push(ay);
- stack.push(ai);
+ stack.push_back(LevelStackEntry(ax, ay, ai));
}
}
}
@@ -343,12 +350,20 @@ static bool floodRegion(int x, int y, int i,
return count > 0;
}
-static unsigned short* expandRegions(int maxIter, unsigned short level,
- rcCompactHeightfield& chf,
- unsigned short* srcReg, unsigned short* srcDist,
- unsigned short* dstReg, unsigned short* dstDist,
- rcIntArray& stack,
- bool fillStack)
+// Struct to keep track of entries in the region table that have been changed.
+struct DirtyEntry
+{
+ DirtyEntry(int index_, unsigned short region_, unsigned short distance2_)
+ : index(index_), region(region_), distance2(distance2_) {}
+ int index;
+ unsigned short region;
+ unsigned short distance2;
+};
+static void expandRegions(int maxIter, unsigned short level,
+ rcCompactHeightfield& chf,
+ unsigned short* srcReg, unsigned short* srcDist,
+ rcTempVector<LevelStackEntry>& stack,
+ bool fillStack)
{
const int w = chf.width;
const int h = chf.height;
@@ -356,7 +371,7 @@ static unsigned short* expandRegions(int maxIter, unsigned short level,
if (fillStack)
{
// Find cells revealed by the raised level.
- stack.resize(0);
+ stack.clear();
for (int y = 0; y < h; ++y)
{
for (int x = 0; x < w; ++x)
@@ -366,9 +381,7 @@ static unsigned short* expandRegions(int maxIter, unsigned short level,
{
if (chf.dist[i] >= level && srcReg[i] == 0 && chf.areas[i] != RC_NULL_AREA)
{
- stack.push(x);
- stack.push(y);
- stack.push(i);
+ stack.push_back(LevelStackEntry(x, y, i));
}
}
}
@@ -377,27 +390,26 @@ static unsigned short* expandRegions(int maxIter, unsigned short level,
else // use cells in the input stack
{
// mark all cells which already have a region
- for (int j=0; j<stack.size(); j+=3)
+ for (int j=0; j<stack.size(); j++)
{
- int i = stack[j+2];
+ int i = stack[j].index;
if (srcReg[i] != 0)
- stack[j+2] = -1;
+ stack[j].index = -1;
}
}
+ rcTempVector<DirtyEntry> dirtyEntries;
int iter = 0;
while (stack.size() > 0)
{
int failed = 0;
+ dirtyEntries.clear();
- memcpy(dstReg, srcReg, sizeof(unsigned short)*chf.spanCount);
- memcpy(dstDist, srcDist, sizeof(unsigned short)*chf.spanCount);
-
- for (int j = 0; j < stack.size(); j += 3)
+ for (int j = 0; j < stack.size(); j++)
{
- int x = stack[j+0];
- int y = stack[j+1];
- int i = stack[j+2];
+ int x = stack[j].x;
+ int y = stack[j].y;
+ int i = stack[j].index;
if (i < 0)
{
failed++;
@@ -426,9 +438,8 @@ static unsigned short* expandRegions(int maxIter, unsigned short level,
}
if (r)
{
- stack[j+2] = -1; // mark as used
- dstReg[i] = r;
- dstDist[i] = d2;
+ stack[j].index = -1; // mark as used
+ dirtyEntries.push_back(DirtyEntry(i, r, d2));
}
else
{
@@ -436,11 +447,14 @@ static unsigned short* expandRegions(int maxIter, unsigned short level,
}
}
- // rcSwap source and dest.
- rcSwap(srcReg, dstReg);
- rcSwap(srcDist, dstDist);
+ // Copy entries that differ between src and dst to keep them in sync.
+ for (int i = 0; i < dirtyEntries.size(); i++) {
+ int idx = dirtyEntries[i].index;
+ srcReg[idx] = dirtyEntries[i].region;
+ srcDist[idx] = dirtyEntries[i].distance2;
+ }
- if (failed*3 == stack.size())
+ if (failed == stack.size())
break;
if (level > 0)
@@ -450,16 +464,14 @@ static unsigned short* expandRegions(int maxIter, unsigned short level,
break;
}
}
-
- return srcReg;
}
static void sortCellsByLevel(unsigned short startLevel,
rcCompactHeightfield& chf,
- unsigned short* srcReg,
- unsigned int nbStacks, rcIntArray* stacks,
+ const unsigned short* srcReg,
+ unsigned int nbStacks, rcTempVector<LevelStackEntry>* stacks,
unsigned short loglevelsPerStack) // the levels per stack (2 in our case) as a bit shift
{
const int w = chf.width;
@@ -467,7 +479,7 @@ static void sortCellsByLevel(unsigned short startLevel,
startLevel = startLevel >> loglevelsPerStack;
for (unsigned int j=0; j<nbStacks; ++j)
- stacks[j].resize(0);
+ stacks[j].clear();
// put all cells in the level range into the appropriate stacks
for (int y = 0; y < h; ++y)
@@ -487,26 +499,23 @@ static void sortCellsByLevel(unsigned short startLevel,
if (sId < 0)
sId = 0;
- stacks[sId].push(x);
- stacks[sId].push(y);
- stacks[sId].push(i);
+ stacks[sId].push_back(LevelStackEntry(x, y, i));
}
}
}
}
-static void appendStacks(rcIntArray& srcStack, rcIntArray& dstStack,
- unsigned short* srcReg)
+static void appendStacks(const rcTempVector<LevelStackEntry>& srcStack,
+ rcTempVector<LevelStackEntry>& dstStack,
+ const unsigned short* srcReg)
{
- for (int j=0; j<srcStack.size(); j+=3)
+ for (int j=0; j<srcStack.size(); j++)
{
- int i = srcStack[j+2];
+ int i = srcStack[j].index;
if ((i < 0) || (srcReg[i] != 0))
continue;
- dstStack.push(srcStack[j]);
- dstStack.push(srcStack[j+1]);
- dstStack.push(srcStack[j+2]);
+ dstStack.push_back(srcStack[j]);
}
}
@@ -671,7 +680,7 @@ static bool isRegionConnectedToBorder(const rcRegion& reg)
return false;
}
-static bool isSolidEdge(rcCompactHeightfield& chf, unsigned short* srcReg,
+static bool isSolidEdge(rcCompactHeightfield& chf, const unsigned short* srcReg,
int x, int y, int i, int dir)
{
const rcCompactSpan& s = chf.spans[i];
@@ -690,7 +699,7 @@ static bool isSolidEdge(rcCompactHeightfield& chf, unsigned short* srcReg,
static void walkContour(int x, int y, int i, int dir,
rcCompactHeightfield& chf,
- unsigned short* srcReg,
+ const unsigned short* srcReg,
rcIntArray& cont)
{
int startDir = dir;
@@ -786,16 +795,15 @@ static bool mergeAndFilterRegions(rcContext* ctx, int minRegionArea, int mergeRe
const int h = chf.height;
const int nreg = maxRegionId+1;
- rcRegion* regions = (rcRegion*)rcAlloc(sizeof(rcRegion)*nreg, RC_ALLOC_TEMP);
- if (!regions)
- {
+ rcTempVector<rcRegion> regions;
+ if (!regions.reserve(nreg)) {
ctx->log(RC_LOG_ERROR, "mergeAndFilterRegions: Out of memory 'regions' (%d).", nreg);
return false;
}
// Construct regions
for (int i = 0; i < nreg; ++i)
- new(&regions[i]) rcRegion((unsigned short)i);
+ regions.push_back(rcRegion((unsigned short) i));
// Find edge of a region and find connections around the contour.
for (int y = 0; y < h; ++y)
@@ -1021,11 +1029,6 @@ static bool mergeAndFilterRegions(rcContext* ctx, int minRegionArea, int mergeRe
if (regions[i].overlap)
overlaps.push(regions[i].id);
- for (int i = 0; i < nreg; ++i)
- regions[i].~rcRegion();
- rcFree(regions);
-
-
return true;
}
@@ -1041,22 +1044,21 @@ static void addUniqueConnection(rcRegion& reg, int n)
static bool mergeAndFilterLayerRegions(rcContext* ctx, int minRegionArea,
unsigned short& maxRegionId,
rcCompactHeightfield& chf,
- unsigned short* srcReg, rcIntArray& /*overlaps*/)
+ unsigned short* srcReg)
{
const int w = chf.width;
const int h = chf.height;
const int nreg = maxRegionId+1;
- rcRegion* regions = (rcRegion*)rcAlloc(sizeof(rcRegion)*nreg, RC_ALLOC_TEMP);
- if (!regions)
- {
+ rcTempVector<rcRegion> regions;
+
+ // Construct regions
+ if (!regions.reserve(nreg)) {
ctx->log(RC_LOG_ERROR, "mergeAndFilterLayerRegions: Out of memory 'regions' (%d).", nreg);
return false;
}
-
- // Construct regions
for (int i = 0; i < nreg; ++i)
- new(&regions[i]) rcRegion((unsigned short)i);
+ regions.push_back(rcRegion((unsigned short) i));
// Find region neighbours and overlapping regions.
rcIntArray lregs(32);
@@ -1234,10 +1236,6 @@ static bool mergeAndFilterLayerRegions(rcContext* ctx, int minRegionArea,
srcReg[i] = regions[srcReg[i]].id;
}
- for (int i = 0; i < nreg; ++i)
- regions[i].~rcRegion();
- rcFree(regions);
-
return true;
}
@@ -1391,9 +1389,9 @@ bool rcBuildRegionsMonotone(rcContext* ctx, rcCompactHeightfield& chf,
paintRectRegion(w-bw, w, 0, h, id|RC_BORDER_REG, chf, srcReg); id++;
paintRectRegion(0, w, 0, bh, id|RC_BORDER_REG, chf, srcReg); id++;
paintRectRegion(0, w, h-bh, h, id|RC_BORDER_REG, chf, srcReg); id++;
-
- chf.borderSize = borderSize;
}
+
+ chf.borderSize = borderSize;
rcIntArray prev(256);
@@ -1535,7 +1533,7 @@ bool rcBuildRegions(rcContext* ctx, rcCompactHeightfield& chf,
const int w = chf.width;
const int h = chf.height;
- rcScopedDelete<unsigned short> buf((unsigned short*)rcAlloc(sizeof(unsigned short)*chf.spanCount*4, RC_ALLOC_TEMP));
+ rcScopedDelete<unsigned short> buf((unsigned short*)rcAlloc(sizeof(unsigned short)*chf.spanCount*2, RC_ALLOC_TEMP));
if (!buf)
{
ctx->log(RC_LOG_ERROR, "rcBuildRegions: Out of memory 'tmp' (%d).", chf.spanCount*4);
@@ -1546,17 +1544,15 @@ bool rcBuildRegions(rcContext* ctx, rcCompactHeightfield& chf,
const int LOG_NB_STACKS = 3;
const int NB_STACKS = 1 << LOG_NB_STACKS;
- rcIntArray lvlStacks[NB_STACKS];
+ rcTempVector<LevelStackEntry> lvlStacks[NB_STACKS];
for (int i=0; i<NB_STACKS; ++i)
- lvlStacks[i].resize(1024);
+ lvlStacks[i].reserve(256);
- rcIntArray stack(1024);
- rcIntArray visited(1024);
+ rcTempVector<LevelStackEntry> stack;
+ stack.reserve(256);
unsigned short* srcReg = buf;
unsigned short* srcDist = buf+chf.spanCount;
- unsigned short* dstReg = buf+chf.spanCount*2;
- unsigned short* dstDist = buf+chf.spanCount*3;
memset(srcReg, 0, sizeof(unsigned short)*chf.spanCount);
memset(srcDist, 0, sizeof(unsigned short)*chf.spanCount);
@@ -1581,9 +1577,9 @@ bool rcBuildRegions(rcContext* ctx, rcCompactHeightfield& chf,
paintRectRegion(w-bw, w, 0, h, regionId|RC_BORDER_REG, chf, srcReg); regionId++;
paintRectRegion(0, w, 0, bh, regionId|RC_BORDER_REG, chf, srcReg); regionId++;
paintRectRegion(0, w, h-bh, h, regionId|RC_BORDER_REG, chf, srcReg); regionId++;
-
- chf.borderSize = borderSize;
}
+
+ chf.borderSize = borderSize;
int sId = -1;
while (level > 0)
@@ -1604,22 +1600,19 @@ bool rcBuildRegions(rcContext* ctx, rcCompactHeightfield& chf,
rcScopedTimer timerExpand(ctx, RC_TIMER_BUILD_REGIONS_EXPAND);
// Expand current regions until no empty connected cells found.
- if (expandRegions(expandIters, level, chf, srcReg, srcDist, dstReg, dstDist, lvlStacks[sId], false) != srcReg)
- {
- rcSwap(srcReg, dstReg);
- rcSwap(srcDist, dstDist);
- }
+ expandRegions(expandIters, level, chf, srcReg, srcDist, lvlStacks[sId], false);
}
{
rcScopedTimer timerFloor(ctx, RC_TIMER_BUILD_REGIONS_FLOOD);
// Mark new regions with IDs.
- for (int j = 0; j<lvlStacks[sId].size(); j += 3)
+ for (int j = 0; j<lvlStacks[sId].size(); j++)
{
- int x = lvlStacks[sId][j];
- int y = lvlStacks[sId][j+1];
- int i = lvlStacks[sId][j+2];
+ LevelStackEntry current = lvlStacks[sId][j];
+ int x = current.x;
+ int y = current.y;
+ int i = current.index;
if (i >= 0 && srcReg[i] == 0)
{
if (floodRegion(x, y, i, level, regionId, chf, srcReg, srcDist, stack))
@@ -1638,11 +1631,7 @@ bool rcBuildRegions(rcContext* ctx, rcCompactHeightfield& chf,
}
// Expand current regions until no empty connected cells found.
- if (expandRegions(expandIters*8, 0, chf, srcReg, srcDist, dstReg, dstDist, stack, true) != srcReg)
- {
- rcSwap(srcReg, dstReg);
- rcSwap(srcDist, dstDist);
- }
+ expandRegions(expandIters*8, 0, chf, srcReg, srcDist, stack, true);
ctx->stopTimer(RC_TIMER_BUILD_REGIONS_WATERSHED);
@@ -1709,9 +1698,9 @@ bool rcBuildLayerRegions(rcContext* ctx, rcCompactHeightfield& chf,
paintRectRegion(w-bw, w, 0, h, id|RC_BORDER_REG, chf, srcReg); id++;
paintRectRegion(0, w, 0, bh, id|RC_BORDER_REG, chf, srcReg); id++;
paintRectRegion(0, w, h-bh, h, id|RC_BORDER_REG, chf, srcReg); id++;
-
- chf.borderSize = borderSize;
}
+
+ chf.borderSize = borderSize;
rcIntArray prev(256);
@@ -1809,9 +1798,8 @@ bool rcBuildLayerRegions(rcContext* ctx, rcCompactHeightfield& chf,
rcScopedTimer timerFilter(ctx, RC_TIMER_BUILD_REGIONS_FILTER);
// Merge monotone regions to layers and remove small regions.
- rcIntArray overlaps;
chf.maxRegions = id;
- if (!mergeAndFilterLayerRegions(ctx, minRegionArea, chf.maxRegions, chf, srcReg, overlaps))
+ if (!mergeAndFilterLayerRegions(ctx, minRegionArea, chf.maxRegions, chf, srcReg))
return false;
}
diff --git a/thirdparty/tinyexr/tinyexr.h b/thirdparty/tinyexr/tinyexr.h
index bfc52b51a5..7e8956f7d3 100644
--- a/thirdparty/tinyexr/tinyexr.h
+++ b/thirdparty/tinyexr/tinyexr.h
@@ -105,6 +105,19 @@ extern "C" {
// http://computation.llnl.gov/projects/floating-point-compression
#endif
+#ifndef TINYEXR_USE_THREAD
+#define TINYEXR_USE_THREAD (0) // No threaded loading.
+// http://computation.llnl.gov/projects/floating-point-compression
+#endif
+
+#ifndef TINYEXR_USE_OPENMP
+#ifdef _OPENMP
+#define TINYEXR_USE_OPENMP (1)
+#else
+#define TINYEXR_USE_OPENMP (0)
+#endif
+#endif
+
#define TINYEXR_SUCCESS (0)
#define TINYEXR_ERROR_INVALID_MAGIC_NUMBER (-1)
#define TINYEXR_ERROR_INVALID_EXR_VERSION (-2)
@@ -118,6 +131,7 @@ extern "C" {
#define TINYEXR_ERROR_UNSUPPORTED_FEATURE (-10)
#define TINYEXR_ERROR_CANT_WRITE_FILE (-11)
#define TINYEXR_ERROR_SERIALZATION_FAILED (-12)
+#define TINYEXR_ERROR_LAYER_NOT_FOUND (-13)
// @note { OpenEXR file format: http://www.openexr.com/openexrfilelayout.pdf }
@@ -263,7 +277,7 @@ typedef struct _DeepImage {
int pad0;
} DeepImage;
-// @deprecated { to be removed. }
+// @deprecated { For backward compatibility. Not recommended to use. }
// Loads single-frame OpenEXR image. Assume EXR image contains A(single channel
// alpha) or RGB(A) channels.
// Application must free image data as returned by `out_rgba`
@@ -273,6 +287,27 @@ typedef struct _DeepImage {
extern int LoadEXR(float **out_rgba, int *width, int *height,
const char *filename, const char **err);
+// Loads single-frame OpenEXR image by specifing layer name. Assume EXR image contains A(single channel
+// alpha) or RGB(A) channels.
+// Application must free image data as returned by `out_rgba`
+// Result image format is: float x RGBA x width x hight
+// Returns negative value and may set error string in `err` when there's an
+// error
+// When the specified layer name is not found in the EXR file, the function will return `TINYEXR_ERROR_LAYER_NOT_FOUND`.
+extern int LoadEXRWithLayer(float **out_rgba, int *width, int *height,
+ const char *filename, const char *layer_name, const char **err);
+
+//
+// Get layer infos from EXR file.
+//
+// @param[out] layer_names List of layer names. Application must free memory after using this.
+// @param[out] num_layers The number of layers
+// @param[out] err Error string(wll be filled when the function returns error code). Free it using FreeEXRErrorMessage after using this value.
+//
+// @return TINYEXR_SUCCEES upon success.
+//
+extern int EXRLayers(const char *filename, const char **layer_names[], int *num_layers, const char **err);
+
// @deprecated { to be removed. }
// Simple wrapper API for ParseEXRHeaderFromFile.
// checking given file is a EXR file(by just look up header)
@@ -472,7 +507,7 @@ extern int LoadEXRFromMemory(float **out_rgba, int *width, int *height,
#include <cstring>
#include <sstream>
-//#include <iostream> // debug
+// #include <iostream> // debug
#include <limits>
#include <string>
@@ -481,9 +516,15 @@ extern int LoadEXRFromMemory(float **out_rgba, int *width, int *height,
#if __cplusplus > 199711L
// C++11
#include <cstdint>
+
+#if TINYEXR_USE_THREAD
+#include <atomic>
+#include <thread>
+#endif
+
#endif // __cplusplus > 199711L
-#ifdef _OPENMP
+#if TINYEXR_USE_OPENMP
#include <omp.h>
#endif
@@ -6917,6 +6958,10 @@ void *mz_zip_extract_archive_file_to_heap(const char *pZip_filename,
}
#endif
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+
#endif // MINIZ_HEADER_FILE_ONLY
/*
@@ -6952,9 +6997,6 @@ void *mz_zip_extract_archive_file_to_heap(const char *pZip_filename,
#pragma clang diagnostic pop
#endif
-#ifdef _MSC_VER
-#pragma warning(pop)
-#endif
} // namespace miniz
#else
@@ -9954,9 +9996,9 @@ static bool DecodePixelData(/* out */ unsigned char **out_images,
return false;
}
- if (!tinyexr::DecompressRle(reinterpret_cast<unsigned char *>(&outBuf.at(0)),
- dstLen, data_ptr,
- static_cast<unsigned long>(data_len))) {
+ if (!tinyexr::DecompressRle(
+ reinterpret_cast<unsigned char *>(&outBuf.at(0)), dstLen, data_ptr,
+ static_cast<unsigned long>(data_len))) {
return false;
}
@@ -10272,7 +10314,7 @@ static bool DecodePixelData(/* out */ unsigned char **out_images,
return true;
}
-static void DecodeTiledPixelData(
+static bool DecodeTiledPixelData(
unsigned char **out_images, int *width, int *height,
const int *requested_pixel_types, const unsigned char *data_ptr,
size_t data_len, int compression_type, int line_order, int data_width,
@@ -10298,11 +10340,11 @@ static void DecodeTiledPixelData(
}
// Image size = tile size.
- DecodePixelData(out_images, requested_pixel_types, data_ptr, data_len,
- compression_type, line_order, (*width), tile_size_y,
- /* stride */ tile_size_x, /* y */ 0, /* line_no */ 0,
- (*height), pixel_data_size, num_attributes, attributes,
- num_channels, channels, channel_offset_list);
+ return DecodePixelData(out_images, requested_pixel_types, data_ptr, data_len,
+ compression_type, line_order, (*width), tile_size_y,
+ /* stride */ tile_size_x, /* y */ 0, /* line_no */ 0,
+ (*height), pixel_data_size, num_attributes, attributes,
+ num_channels, channels, channel_offset_list);
}
static bool ComputeChannelLayout(std::vector<size_t> *channel_offset_list,
@@ -10851,85 +10893,141 @@ static int DecodeChunk(EXRImage *exr_image, const EXRHeader *exr_header,
exr_image->tiles = static_cast<EXRTile *>(
calloc(sizeof(EXRTile), static_cast<size_t>(num_tiles)));
+ int err_code = TINYEXR_SUCCESS;
+
+#if (__cplusplus > 199711L) && (TINYEXR_USE_THREAD > 0)
+
+ std::vector<std::thread> workers;
+ std::atomic<size_t> tile_count(0);
+
+ int num_threads = std::max(1, int(std::thread::hardware_concurrency()));
+ if (num_threads > int(num_tiles)) {
+ num_threads = int(num_tiles);
+ }
+
+ for (int t = 0; t < num_threads; t++) {
+ workers.emplace_back(std::thread([&]() {
+ size_t tile_idx = 0;
+ while ((tile_idx = tile_count++) < num_tiles) {
+
+#else
for (size_t tile_idx = 0; tile_idx < num_tiles; tile_idx++) {
- // Allocate memory for each tile.
- exr_image->tiles[tile_idx].images = tinyexr::AllocateImage(
- num_channels, exr_header->channels, exr_header->requested_pixel_types,
- exr_header->tile_size_x, exr_header->tile_size_y);
-
- // 16 byte: tile coordinates
- // 4 byte : data size
- // ~ : data(uncompressed or compressed)
- if (offsets[tile_idx] + sizeof(int) * 5 > size) {
- if (err) {
- (*err) += "Insufficient data size.\n";
- }
- return TINYEXR_ERROR_INVALID_DATA;
- }
+#endif
+ // Allocate memory for each tile.
+ exr_image->tiles[tile_idx].images = tinyexr::AllocateImage(
+ num_channels, exr_header->channels,
+ exr_header->requested_pixel_types, exr_header->tile_size_x,
+ exr_header->tile_size_y);
+
+ // 16 byte: tile coordinates
+ // 4 byte : data size
+ // ~ : data(uncompressed or compressed)
+ if (offsets[tile_idx] + sizeof(int) * 5 > size) {
+ // TODO(LTE): atomic
+ if (err) {
+ (*err) += "Insufficient data size.\n";
+ }
+ err_code = TINYEXR_ERROR_INVALID_DATA;
+ break;
+ }
- size_t data_size = size_t(size - (offsets[tile_idx] + sizeof(int) * 5));
- const unsigned char *data_ptr =
- reinterpret_cast<const unsigned char *>(head + offsets[tile_idx]);
+ size_t data_size =
+ size_t(size - (offsets[tile_idx] + sizeof(int) * 5));
+ const unsigned char *data_ptr =
+ reinterpret_cast<const unsigned char *>(head + offsets[tile_idx]);
+
+ int tile_coordinates[4];
+ memcpy(tile_coordinates, data_ptr, sizeof(int) * 4);
+ tinyexr::swap4(
+ reinterpret_cast<unsigned int *>(&tile_coordinates[0]));
+ tinyexr::swap4(
+ reinterpret_cast<unsigned int *>(&tile_coordinates[1]));
+ tinyexr::swap4(
+ reinterpret_cast<unsigned int *>(&tile_coordinates[2]));
+ tinyexr::swap4(
+ reinterpret_cast<unsigned int *>(&tile_coordinates[3]));
+
+ // @todo{ LoD }
+ if (tile_coordinates[2] != 0) {
+ err_code = TINYEXR_ERROR_UNSUPPORTED_FEATURE;
+ break;
+ }
+ if (tile_coordinates[3] != 0) {
+ err_code = TINYEXR_ERROR_UNSUPPORTED_FEATURE;
+ break;
+ }
- int tile_coordinates[4];
- memcpy(tile_coordinates, data_ptr, sizeof(int) * 4);
- tinyexr::swap4(reinterpret_cast<unsigned int *>(&tile_coordinates[0]));
- tinyexr::swap4(reinterpret_cast<unsigned int *>(&tile_coordinates[1]));
- tinyexr::swap4(reinterpret_cast<unsigned int *>(&tile_coordinates[2]));
- tinyexr::swap4(reinterpret_cast<unsigned int *>(&tile_coordinates[3]));
+ int data_len;
+ memcpy(&data_len, data_ptr + 16,
+ sizeof(int)); // 16 = sizeof(tile_coordinates)
+ tinyexr::swap4(reinterpret_cast<unsigned int *>(&data_len));
- // @todo{ LoD }
- if (tile_coordinates[2] != 0) {
- return TINYEXR_ERROR_UNSUPPORTED_FEATURE;
- }
- if (tile_coordinates[3] != 0) {
- return TINYEXR_ERROR_UNSUPPORTED_FEATURE;
- }
+ if (data_len < 4 || size_t(data_len) > data_size) {
+ // TODO(LTE): atomic
+ if (err) {
+ (*err) += "Insufficient data length.\n";
+ }
+ err_code = TINYEXR_ERROR_INVALID_DATA;
+ break;
+ }
- int data_len;
- memcpy(&data_len, data_ptr + 16,
- sizeof(int)); // 16 = sizeof(tile_coordinates)
- tinyexr::swap4(reinterpret_cast<unsigned int *>(&data_len));
+ // Move to data addr: 20 = 16 + 4;
+ data_ptr += 20;
+
+ bool ret = tinyexr::DecodeTiledPixelData(
+ exr_image->tiles[tile_idx].images,
+ &(exr_image->tiles[tile_idx].width),
+ &(exr_image->tiles[tile_idx].height),
+ exr_header->requested_pixel_types, data_ptr,
+ static_cast<size_t>(data_len), exr_header->compression_type,
+ exr_header->line_order, data_width, data_height,
+ tile_coordinates[0], tile_coordinates[1], exr_header->tile_size_x,
+ exr_header->tile_size_y, static_cast<size_t>(pixel_data_size),
+ static_cast<size_t>(exr_header->num_custom_attributes),
+ exr_header->custom_attributes,
+ static_cast<size_t>(exr_header->num_channels),
+ exr_header->channels, channel_offset_list);
+
+ if (!ret) {
+ // TODO(LTE): atomic
+ if (err) {
+ (*err) += "Failed to decode tile data.\n";
+ }
+ err_code = TINYEXR_ERROR_INVALID_DATA;
+ }
- if (data_len < 4 || size_t(data_len) > data_size) {
- if (err) {
- (*err) += "Insufficient data length.\n";
+ exr_image->tiles[tile_idx].offset_x = tile_coordinates[0];
+ exr_image->tiles[tile_idx].offset_y = tile_coordinates[1];
+ exr_image->tiles[tile_idx].level_x = tile_coordinates[2];
+ exr_image->tiles[tile_idx].level_y = tile_coordinates[3];
+
+#if (__cplusplus > 199711L) && (TINYEXR_USE_THREAD > 0)
}
- return TINYEXR_ERROR_INVALID_DATA;
- }
+ }));
+ } // num_thread loop
- // Move to data addr: 20 = 16 + 4;
- data_ptr += 20;
-
- tinyexr::DecodeTiledPixelData(
- exr_image->tiles[tile_idx].images,
- &(exr_image->tiles[tile_idx].width),
- &(exr_image->tiles[tile_idx].height),
- exr_header->requested_pixel_types, data_ptr,
- static_cast<size_t>(data_len), exr_header->compression_type,
- exr_header->line_order, data_width, data_height, tile_coordinates[0],
- tile_coordinates[1], exr_header->tile_size_x, exr_header->tile_size_y,
- static_cast<size_t>(pixel_data_size),
- static_cast<size_t>(exr_header->num_custom_attributes),
- exr_header->custom_attributes,
- static_cast<size_t>(exr_header->num_channels), exr_header->channels,
- channel_offset_list);
-
- exr_image->tiles[tile_idx].offset_x = tile_coordinates[0];
- exr_image->tiles[tile_idx].offset_y = tile_coordinates[1];
- exr_image->tiles[tile_idx].level_x = tile_coordinates[2];
- exr_image->tiles[tile_idx].level_y = tile_coordinates[3];
-
- exr_image->num_tiles = static_cast<int>(num_tiles);
+ for (auto &t : workers) {
+ t.join();
}
+
+#else
+ }
+#endif
+
+ if (err_code != TINYEXR_SUCCESS) {
+ return err_code;
+ }
+
+ exr_image->num_tiles = static_cast<int>(num_tiles);
} else { // scanline format
// Don't allow too large image(256GB * pixel_data_size or more). Workaround
// for #104.
size_t total_data_len =
size_t(data_width) * size_t(data_height) * size_t(num_channels);
- const bool total_data_len_overflown = sizeof(void*) == 8 ? (total_data_len >= 0x4000000000) : false;
- if ((total_data_len == 0) || total_data_len_overflown ) {
+ const bool total_data_len_overflown =
+ sizeof(void *) == 8 ? (total_data_len >= 0x4000000000) : false;
+ if ((total_data_len == 0) || total_data_len_overflown) {
if (err) {
std::stringstream ss;
ss << "Image data size is zero or too large: width = " << data_width
@@ -10944,85 +11042,118 @@ static int DecodeChunk(EXRImage *exr_image, const EXRHeader *exr_header,
num_channels, exr_header->channels, exr_header->requested_pixel_types,
data_width, data_height);
-#ifdef _OPENMP
+#if (__cplusplus > 199711L) && (TINYEXR_USE_THREAD > 0)
+ std::vector<std::thread> workers;
+ std::atomic<int> y_count(0);
+
+ int num_threads = std::max(1, int(std::thread::hardware_concurrency()));
+ if (num_threads > int(num_blocks)) {
+ num_threads = int(num_blocks);
+ }
+
+ for (int t = 0; t < num_threads; t++) {
+ workers.emplace_back(std::thread([&]() {
+ int y = 0;
+ while ((y = y_count++) < int(num_blocks)) {
+
+#else
+
+#if TINYEXR_USE_OPENMP
#pragma omp parallel for
#endif
for (int y = 0; y < static_cast<int>(num_blocks); y++) {
- size_t y_idx = static_cast<size_t>(y);
-
- if (offsets[y_idx] + sizeof(int) * 2 > size) {
- invalid_data = true;
- } else {
- // 4 byte: scan line
- // 4 byte: data size
- // ~ : pixel data(uncompressed or compressed)
- size_t data_size = size_t(size - (offsets[y_idx] + sizeof(int) * 2));
- const unsigned char *data_ptr =
- reinterpret_cast<const unsigned char *>(head + offsets[y_idx]);
-
- int line_no;
- memcpy(&line_no, data_ptr, sizeof(int));
- int data_len;
- memcpy(&data_len, data_ptr + 4, sizeof(int));
- tinyexr::swap4(reinterpret_cast<unsigned int *>(&line_no));
- tinyexr::swap4(reinterpret_cast<unsigned int *>(&data_len));
-
- if (size_t(data_len) > data_size) {
- invalid_data = true;
-
- } else if ((line_no > (2 << 20)) || (line_no < -(2 << 20))) {
- // Too large value. Assume this is invalid
- // 2**20 = 1048576 = heuristic value.
- invalid_data = true;
- } else if (data_len == 0) {
- // TODO(syoyo): May be ok to raise the threshold for example `data_len
- // < 4`
- invalid_data = true;
- } else {
- // line_no may be negative.
- int end_line_no = (std::min)(line_no + num_scanline_blocks,
- (exr_header->data_window[3] + 1));
- int num_lines = end_line_no - line_no;
+#endif
+ size_t y_idx = static_cast<size_t>(y);
- if (num_lines <= 0) {
+ if (offsets[y_idx] + sizeof(int) * 2 > size) {
invalid_data = true;
} else {
- // Move to data addr: 8 = 4 + 4;
- data_ptr += 8;
-
- // Adjust line_no with data_window.bmin.y
-
- // overflow check
- tinyexr_int64 lno = static_cast<tinyexr_int64>(line_no) - static_cast<tinyexr_int64>(exr_header->data_window[1]);
- if (lno > std::numeric_limits<int>::max()) {
- line_no = -1; // invalid
- } else if (lno < -std::numeric_limits<int>::max()) {
- line_no = -1; // invalid
- } else {
- line_no -= exr_header->data_window[1];
- }
+ // 4 byte: scan line
+ // 4 byte: data size
+ // ~ : pixel data(uncompressed or compressed)
+ size_t data_size =
+ size_t(size - (offsets[y_idx] + sizeof(int) * 2));
+ const unsigned char *data_ptr =
+ reinterpret_cast<const unsigned char *>(head + offsets[y_idx]);
+
+ int line_no;
+ memcpy(&line_no, data_ptr, sizeof(int));
+ int data_len;
+ memcpy(&data_len, data_ptr + 4, sizeof(int));
+ tinyexr::swap4(reinterpret_cast<unsigned int *>(&line_no));
+ tinyexr::swap4(reinterpret_cast<unsigned int *>(&data_len));
+
+ if (size_t(data_len) > data_size) {
+ invalid_data = true;
- if (line_no < 0) {
+ } else if ((line_no > (2 << 20)) || (line_no < -(2 << 20))) {
+ // Too large value. Assume this is invalid
+ // 2**20 = 1048576 = heuristic value.
+ invalid_data = true;
+ } else if (data_len == 0) {
+ // TODO(syoyo): May be ok to raise the threshold for example
+ // `data_len < 4`
invalid_data = true;
} else {
- if (!tinyexr::DecodePixelData(
- exr_image->images, exr_header->requested_pixel_types,
- data_ptr, static_cast<size_t>(data_len),
- exr_header->compression_type, exr_header->line_order,
- data_width, data_height, data_width, y, line_no,
- num_lines, static_cast<size_t>(pixel_data_size),
- static_cast<size_t>(exr_header->num_custom_attributes),
- exr_header->custom_attributes,
- static_cast<size_t>(exr_header->num_channels),
- exr_header->channels, channel_offset_list)) {
+ // line_no may be negative.
+ int end_line_no = (std::min)(line_no + num_scanline_blocks,
+ (exr_header->data_window[3] + 1));
+
+ int num_lines = end_line_no - line_no;
+
+ if (num_lines <= 0) {
invalid_data = true;
+ } else {
+ // Move to data addr: 8 = 4 + 4;
+ data_ptr += 8;
+
+ // Adjust line_no with data_window.bmin.y
+
+ // overflow check
+ tinyexr_int64 lno =
+ static_cast<tinyexr_int64>(line_no) -
+ static_cast<tinyexr_int64>(exr_header->data_window[1]);
+ if (lno > std::numeric_limits<int>::max()) {
+ line_no = -1; // invalid
+ } else if (lno < -std::numeric_limits<int>::max()) {
+ line_no = -1; // invalid
+ } else {
+ line_no -= exr_header->data_window[1];
+ }
+
+ if (line_no < 0) {
+ invalid_data = true;
+ } else {
+ if (!tinyexr::DecodePixelData(
+ exr_image->images, exr_header->requested_pixel_types,
+ data_ptr, static_cast<size_t>(data_len),
+ exr_header->compression_type, exr_header->line_order,
+ data_width, data_height, data_width, y, line_no,
+ num_lines, static_cast<size_t>(pixel_data_size),
+ static_cast<size_t>(
+ exr_header->num_custom_attributes),
+ exr_header->custom_attributes,
+ static_cast<size_t>(exr_header->num_channels),
+ exr_header->channels, channel_offset_list)) {
+ invalid_data = true;
+ }
+ }
}
}
}
+
+#if (__cplusplus > 199711L) && (TINYEXR_USE_THREAD > 0)
}
- }
+ }));
+ }
+
+ for (auto &t : workers) {
+ t.join();
+ }
+#else
} // omp parallel
+#endif
}
if (invalid_data) {
@@ -11219,6 +11350,9 @@ static int DecodeEXRImage(EXRImage *exr_image, const EXRHeader *exr_header,
tinyexr::SetErrorMessage(e, err);
}
+#if 1
+ FreeEXRImage(exr_image);
+#else
// release memory(if exists)
if ((exr_header->num_channels > 0) && exr_image && exr_image->images) {
for (size_t c = 0; c < size_t(exr_header->num_channels); c++) {
@@ -11230,16 +11364,114 @@ static int DecodeEXRImage(EXRImage *exr_image, const EXRHeader *exr_header,
free(exr_image->images);
exr_image->images = NULL;
}
+#endif
}
return ret;
}
}
+static void GetLayers(const EXRHeader& exr_header, std::vector<std::string>& layer_names) {
+ // Naive implementation
+ // Group channels by layers
+ // go over all channel names, split by periods
+ // collect unique names
+ layer_names.clear();
+ for (int c = 0; c < exr_header.num_channels; c++) {
+ std::string full_name(exr_header.channels[c].name);
+ const size_t pos = full_name.find_last_of('.');
+ if (pos != std::string::npos && pos != 0 && pos + 1 < full_name.size()) {
+ full_name.erase(pos);
+ if (std::find(layer_names.begin(), layer_names.end(), full_name) == layer_names.end())
+ layer_names.push_back(full_name);
+ }
+ }
+}
+
+struct LayerChannel {
+ explicit LayerChannel (size_t i, std::string n)
+ : index(i)
+ , name(n)
+ {}
+ size_t index;
+ std::string name;
+};
+
+static void ChannelsInLayer(const EXRHeader& exr_header, const std::string layer_name, std::vector<LayerChannel>& channels) {
+ channels.clear();
+ for (int c = 0; c < exr_header.num_channels; c++) {
+ std::string ch_name(exr_header.channels[c].name);
+ if (layer_name.empty()) {
+ const size_t pos = ch_name.find_last_of('.');
+ if (pos != std::string::npos && pos < ch_name.size()) {
+ ch_name = ch_name.substr(pos + 1);
+ }
+ } else {
+ const size_t pos = ch_name.find(layer_name + '.');
+ if (pos == std::string::npos)
+ continue;
+ if (pos == 0) {
+ ch_name = ch_name.substr(layer_name.size() + 1);
+ }
+ }
+ LayerChannel ch(size_t(c), ch_name);
+ channels.push_back(ch);
+ }
+}
+
} // namespace tinyexr
+int EXRLayers(const char *filename, const char **layer_names[], int *num_layers, const char **err) {
+ EXRVersion exr_version;
+ EXRHeader exr_header;
+ InitEXRHeader(&exr_header);
+
+ {
+ int ret = ParseEXRVersionFromFile(&exr_version, filename);
+ if (ret != TINYEXR_SUCCESS) {
+ tinyexr::SetErrorMessage("Invalid EXR header.", err);
+ return ret;
+ }
+
+ if (exr_version.multipart || exr_version.non_image) {
+ tinyexr::SetErrorMessage(
+ "Loading multipart or DeepImage is not supported in LoadEXR() API",
+ err);
+ return TINYEXR_ERROR_INVALID_DATA; // @fixme.
+ }
+ }
+
+ int ret = ParseEXRHeaderFromFile(&exr_header, &exr_version, filename, err);
+ if (ret != TINYEXR_SUCCESS) {
+ FreeEXRHeader(&exr_header);
+ return ret;
+ }
+
+ std::vector<std::string> layer_vec;
+ tinyexr::GetLayers(exr_header, layer_vec);
+
+ (*num_layers) = int(layer_vec.size());
+ (*layer_names) = static_cast<const char **>(
+ malloc(sizeof(const char *) * static_cast<size_t>(layer_vec.size())));
+ for (size_t c = 0; c < static_cast<size_t>(layer_vec.size()); c++) {
+#ifdef _MSC_VER
+ (*layer_names)[c] = _strdup(layer_vec[c].c_str());
+#else
+ (*layer_names)[c] = strdup(layer_vec[c].c_str());
+#endif
+ }
+
+ FreeEXRHeader(&exr_header);
+ return TINYEXR_SUCCESS;
+}
+
int LoadEXR(float **out_rgba, int *width, int *height, const char *filename,
const char **err) {
+ return LoadEXRWithLayer(out_rgba, width, height, filename, /* layername */NULL, err);
+}
+
+int LoadEXRWithLayer(float **out_rgba, int *width, int *height, const char *filename, const char *layername,
+ const char **err) {
if (out_rgba == NULL) {
tinyexr::SetErrorMessage("Invalid argument for LoadEXR()", err);
return TINYEXR_ERROR_INVALID_ARGUMENT;
@@ -11254,7 +11486,9 @@ int LoadEXR(float **out_rgba, int *width, int *height, const char *filename,
{
int ret = ParseEXRVersionFromFile(&exr_version, filename);
if (ret != TINYEXR_SUCCESS) {
- tinyexr::SetErrorMessage("Invalid EXR header.", err);
+ std::stringstream ss;
+ ss << "Failed to open EXR file or read version info from EXR file. code(" << ret << ")";
+ tinyexr::SetErrorMessage(ss.str(), err);
return ret;
}
@@ -11281,6 +11515,7 @@ int LoadEXR(float **out_rgba, int *width, int *height, const char *filename,
}
}
+ // TODO: Probably limit loading to layers (channels) selected by layer index
{
int ret = LoadEXRImageFromFile(&exr_image, &exr_header, filename, err);
if (ret != TINYEXR_SUCCESS) {
@@ -11294,19 +11529,40 @@ int LoadEXR(float **out_rgba, int *width, int *height, const char *filename,
int idxG = -1;
int idxB = -1;
int idxA = -1;
- for (int c = 0; c < exr_header.num_channels; c++) {
- if (strcmp(exr_header.channels[c].name, "R") == 0) {
- idxR = c;
- } else if (strcmp(exr_header.channels[c].name, "G") == 0) {
- idxG = c;
- } else if (strcmp(exr_header.channels[c].name, "B") == 0) {
- idxB = c;
- } else if (strcmp(exr_header.channels[c].name, "A") == 0) {
- idxA = c;
+
+ std::vector<std::string> layer_names;
+ tinyexr::GetLayers(exr_header, layer_names);
+
+ std::vector<tinyexr::LayerChannel> channels;
+ tinyexr::ChannelsInLayer(exr_header, layername == NULL ? "" : std::string(layername), channels);
+
+ if (channels.size() < 1) {
+ tinyexr::SetErrorMessage("Layer Not Found", err);
+ FreeEXRHeader(&exr_header);
+ FreeEXRImage(&exr_image);
+ return TINYEXR_ERROR_LAYER_NOT_FOUND;
+ }
+
+ size_t ch_count = channels.size() < 4 ? channels.size() : 4;
+ for (size_t c = 0; c < ch_count; c++) {
+ const tinyexr::LayerChannel &ch = channels[c];
+
+ if (ch.name == "R") {
+ idxR = int(ch.index);
+ }
+ else if (ch.name == "G") {
+ idxG = int(ch.index);
+ }
+ else if (ch.name == "B") {
+ idxB = int(ch.index);
+ }
+ else if (ch.name == "A") {
+ idxA = int(ch.index);
}
}
- if (exr_header.num_channels == 1) {
+ if (channels.size() == 1) {
+ int chIdx = int(channels.front().index);
// Grayscale channel only.
(*out_rgba) = reinterpret_cast<float *>(
@@ -11333,19 +11589,19 @@ int LoadEXR(float **out_rgba, int *width, int *height, const char *filename,
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];
+ reinterpret_cast<float **>(src)[chIdx][srcIdx];
(*out_rgba)[4 * idx + 1] =
- reinterpret_cast<float **>(src)[0][srcIdx];
+ reinterpret_cast<float **>(src)[chIdx][srcIdx];
(*out_rgba)[4 * idx + 2] =
- reinterpret_cast<float **>(src)[0][srcIdx];
+ reinterpret_cast<float **>(src)[chIdx][srcIdx];
(*out_rgba)[4 * idx + 3] =
- reinterpret_cast<float **>(src)[0][srcIdx];
+ reinterpret_cast<float **>(src)[chIdx][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];
+ const float val = reinterpret_cast<float **>(exr_image.images)[chIdx][i];
(*out_rgba)[4 * i + 0] = val;
(*out_rgba)[4 * i + 1] = val;
(*out_rgba)[4 * i + 2] = val;
@@ -11358,22 +11614,22 @@ int LoadEXR(float **out_rgba, int *width, int *height, const char *filename,
if (idxR == -1) {
tinyexr::SetErrorMessage("R channel not found", err);
- // @todo { free exr_image }
FreeEXRHeader(&exr_header);
+ FreeEXRImage(&exr_image);
return TINYEXR_ERROR_INVALID_DATA;
}
if (idxG == -1) {
tinyexr::SetErrorMessage("G channel not found", err);
- // @todo { free exr_image }
FreeEXRHeader(&exr_header);
+ FreeEXRImage(&exr_image);
return TINYEXR_ERROR_INVALID_DATA;
}
if (idxB == -1) {
tinyexr::SetErrorMessage("B channel not found", err);
- // @todo { free exr_image }
FreeEXRHeader(&exr_header);
+ FreeEXRImage(&exr_image);
return TINYEXR_ERROR_INVALID_DATA;
}
@@ -11446,7 +11702,7 @@ int IsEXR(const char *filename) {
int ret = ParseEXRVersionFromFile(&exr_version, filename);
if (ret != TINYEXR_SUCCESS) {
- return TINYEXR_ERROR_INVALID_HEADER;
+ return ret;
}
return TINYEXR_SUCCESS;
@@ -11509,7 +11765,9 @@ int LoadEXRFromMemory(float **out_rgba, int *width, int *height,
int ret = ParseEXRVersionFromMemory(&exr_version, memory, size);
if (ret != TINYEXR_SUCCESS) {
- tinyexr::SetErrorMessage("Failed to parse EXR version", err);
+ std::stringstream ss;
+ ss << "Failed to parse EXR version. code(" << ret << ")";
+ tinyexr::SetErrorMessage(ss.str(), err);
return ret;
}
@@ -11967,9 +12225,11 @@ size_t SaveEXRImageToMemory(const EXRImage *exr_image,
}
#endif
+ // TOOD(LTE): C++11 thread
+
// Use signed int since some OpenMP compiler doesn't allow unsigned type for
// `parallel for`
-#ifdef _OPENMP
+#if TINYEXR_USE_OPENMP
#pragma omp parallel for
#endif
for (int i = 0; i < num_blocks; i++) {
diff --git a/thirdparty/vhacd/0005-fix-scale-calculation.patch b/thirdparty/vhacd/0005-fix-scale-calculation.patch
new file mode 100644
index 0000000000..4b05f64fbf
--- /dev/null
+++ b/thirdparty/vhacd/0005-fix-scale-calculation.patch
@@ -0,0 +1,20 @@
+diff --git a/thirdparty/vhacd/inc/vhacdVolume.h b/thirdparty/vhacd/inc/vhacdVolume.h
+index 8c47fa1e2c..c445f20122 100644
+--- a/thirdparty/vhacd/inc/vhacdVolume.h
++++ b/thirdparty/vhacd/inc/vhacdVolume.h
+@@ -316,13 +316,13 @@ void Volume::Voxelize(const T* const points, const uint32_t stridePoints, const
+
+ double d[3] = { m_maxBB[0] - m_minBB[0], m_maxBB[1] - m_minBB[1], m_maxBB[2] - m_minBB[2] };
+ double r;
+- if (d[0] > d[1] && d[0] > d[2]) {
++ if (d[0] >= d[1] && d[0] >= d[2]) {
+ r = d[0];
+ m_dim[0] = dim;
+ m_dim[1] = 2 + static_cast<size_t>(dim * d[1] / d[0]);
+ m_dim[2] = 2 + static_cast<size_t>(dim * d[2] / d[0]);
+ }
+- else if (d[1] > d[0] && d[1] > d[2]) {
++ else if (d[1] >= d[0] && d[1] >= d[2]) {
+ r = d[1];
+ m_dim[1] = dim;
+ m_dim[0] = 2 + static_cast<size_t>(dim * d[0] / d[1]);
diff --git a/thirdparty/vhacd/inc/vhacdVolume.h b/thirdparty/vhacd/inc/vhacdVolume.h
index 8c47fa1e2c..c445f20122 100644
--- a/thirdparty/vhacd/inc/vhacdVolume.h
+++ b/thirdparty/vhacd/inc/vhacdVolume.h
@@ -316,13 +316,13 @@ void Volume::Voxelize(const T* const points, const uint32_t stridePoints, const
double d[3] = { m_maxBB[0] - m_minBB[0], m_maxBB[1] - m_minBB[1], m_maxBB[2] - m_minBB[2] };
double r;
- if (d[0] > d[1] && d[0] > d[2]) {
+ if (d[0] >= d[1] && d[0] >= d[2]) {
r = d[0];
m_dim[0] = dim;
m_dim[1] = 2 + static_cast<size_t>(dim * d[1] / d[0]);
m_dim[2] = 2 + static_cast<size_t>(dim * d[2] / d[0]);
}
- else if (d[1] > d[0] && d[1] > d[2]) {
+ else if (d[1] >= d[0] && d[1] >= d[2]) {
r = d[1];
m_dim[1] = dim;
m_dim[0] = 2 + static_cast<size_t>(dim * d[0] / d[1]);