summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--AUTHORS.md4
-rw-r--r--DONORS.md46
-rw-r--r--core/bind/core_bind.cpp5
-rw-r--r--core/bind/core_bind.h1
-rw-r--r--core/io/logger.cpp4
-rw-r--r--core/os/os.h1
-rw-r--r--doc/classes/@GlobalScope.xml3
-rw-r--r--doc/classes/AABB.xml2
-rw-r--r--doc/classes/Animation.xml228
-rw-r--r--doc/classes/AnimationPlayer.xml4
-rw-r--r--doc/classes/AnimationTrackEditPlugin.xml15
-rw-r--r--doc/classes/AudioServer.xml2
-rw-r--r--doc/classes/AudioStream.xml2
-rw-r--r--doc/classes/AudioStreamPlayer.xml4
-rw-r--r--doc/classes/AudioStreamPlayer2D.xml4
-rw-r--r--doc/classes/AudioStreamPlayer3D.xml4
-rw-r--r--doc/classes/BakedLightmap.xml2
-rw-r--r--doc/classes/Basis.xml4
-rw-r--r--doc/classes/CanvasItem.xml4
-rw-r--r--doc/classes/CanvasLayer.xml4
-rw-r--r--doc/classes/CollisionShape.xml2
-rw-r--r--doc/classes/CollisionShape2D.xml2
-rw-r--r--doc/classes/Control.xml4
-rw-r--r--doc/classes/DirectionalLight.xml2
-rw-r--r--doc/classes/Directory.xml2
-rw-r--r--doc/classes/EditorPlugin.xml2
-rw-r--r--doc/classes/Environment.xml4
-rw-r--r--doc/classes/File.xml2
-rw-r--r--doc/classes/FileDialog.xml6
-rw-r--r--doc/classes/GIProbe.xml2
-rw-r--r--doc/classes/HTTPClient.xml4
-rw-r--r--doc/classes/HTTPRequest.xml2
-rw-r--r--doc/classes/Image.xml6
-rw-r--r--doc/classes/Input.xml2
-rw-r--r--doc/classes/InputEvent.xml4
-rw-r--r--doc/classes/InputEventAction.xml2
-rw-r--r--doc/classes/InputEventJoypadButton.xml2
-rw-r--r--doc/classes/InputEventJoypadMotion.xml2
-rw-r--r--doc/classes/InputEventKey.xml2
-rw-r--r--doc/classes/InputEventMouse.xml2
-rw-r--r--doc/classes/InputEventMouseButton.xml2
-rw-r--r--doc/classes/InputEventMouseMotion.xml2
-rw-r--r--doc/classes/InputEventScreenDrag.xml2
-rw-r--r--doc/classes/InputEventScreenTouch.xml2
-rw-r--r--doc/classes/InputEventWithModifiers.xml2
-rw-r--r--doc/classes/InputMap.xml2
-rw-r--r--doc/classes/JavaScript.xml2
-rw-r--r--doc/classes/KinematicBody.xml2
-rw-r--r--doc/classes/Light.xml2
-rw-r--r--doc/classes/NetworkedMultiplayerPeer.xml2
-rw-r--r--doc/classes/Node.xml2
-rw-r--r--doc/classes/Node2D.xml2
-rw-r--r--doc/classes/Object.xml2
-rw-r--r--doc/classes/OmniLight.xml2
-rw-r--r--doc/classes/Physics2DDirectSpaceState.xml2
-rw-r--r--doc/classes/PhysicsBody.xml2
-rw-r--r--doc/classes/PhysicsBody2D.xml2
-rw-r--r--doc/classes/PhysicsDirectSpaceState.xml2
-rw-r--r--doc/classes/Plane.xml2
-rw-r--r--doc/classes/PopupMenu.xml18
-rw-r--r--doc/classes/ProjectSettings.xml530
-rw-r--r--doc/classes/Quat.xml4
-rw-r--r--doc/classes/Rect2.xml2
-rw-r--r--doc/classes/ReflectionProbe.xml2
-rw-r--r--doc/classes/RichTextLabel.xml2
-rw-r--r--doc/classes/RigidBody.xml2
-rw-r--r--doc/classes/SceneTree.xml4
-rw-r--r--doc/classes/Script.xml2
-rw-r--r--doc/classes/ScrollContainer.xml12
-rw-r--r--doc/classes/Shader.xml2
-rw-r--r--doc/classes/Shape.xml2
-rw-r--r--doc/classes/Shape2D.xml2
-rw-r--r--doc/classes/Spatial.xml2
-rw-r--r--doc/classes/SpatialMaterial.xml2
-rw-r--r--doc/classes/SpotLight.xml2
-rw-r--r--doc/classes/StreamPeerSSL.xml2
-rw-r--r--doc/classes/TileMap.xml2
-rw-r--r--doc/classes/Transform.xml4
-rw-r--r--doc/classes/Tween.xml6
-rw-r--r--doc/classes/Vector2.xml2
-rw-r--r--doc/classes/Vector3.xml2
-rw-r--r--doc/classes/Viewport.xml12
-rw-r--r--doc/classes/World.xml2
-rw-r--r--doc/classes/World2D.xml2
-rw-r--r--doc/classes/WorldEnvironment.xml2
-rwxr-xr-xdoc/tools/makerst.py30
-rw-r--r--drivers/gles2/shader_compiler_gles2.cpp2
-rw-r--r--editor/doc/doc_data.cpp32
-rw-r--r--editor/doc/doc_data.h2
-rw-r--r--editor/editor_help.cpp7
-rw-r--r--editor/editor_node.cpp43
-rw-r--r--editor/editor_node.h2
-rw-r--r--editor/editor_settings.cpp28
-rw-r--r--editor/editor_themes.cpp36
-rw-r--r--editor/plugins/canvas_item_editor_plugin.cpp86
-rw-r--r--editor/plugins/canvas_item_editor_plugin.h10
-rw-r--r--editor/plugins/script_text_editor.cpp30
-rw-r--r--editor/settings_config_dialog.cpp2
-rw-r--r--main/tests/test_main.cpp13
-rw-r--r--modules/csg/csg_shape.cpp9
-rw-r--r--modules/enet/doc_classes/NetworkedMultiplayerENet.xml4
-rw-r--r--modules/gdscript/doc_classes/GDScript.xml2
-rw-r--r--modules/gdscript/gdscript_editor.cpp7
-rw-r--r--modules/gridmap/doc_classes/GridMap.xml2
-rw-r--r--modules/visual_script/doc_classes/VisualScript.xml2
-rw-r--r--platform/osx/os_osx.h2
-rw-r--r--platform/osx/os_osx.mm7
-rw-r--r--platform/windows/os_windows.cpp29
-rw-r--r--platform/windows/os_windows.h5
-rw-r--r--platform/x11/os_x11.cpp22
-rw-r--r--platform/x11/os_x11.h5
-rw-r--r--scene/3d/particles.cpp4
-rw-r--r--scene/gui/line_edit.cpp3
-rw-r--r--scene/gui/tab_container.cpp40
-rw-r--r--scene/gui/text_edit.cpp3
-rw-r--r--scene/resources/primitive_meshes.cpp42
-rw-r--r--servers/visual/visual_server_scene.cpp99
-rw-r--r--servers/visual/visual_server_scene.h5
118 files changed, 1411 insertions, 267 deletions
diff --git a/AUTHORS.md b/AUTHORS.md
index 67563298f2..12494a487d 100644
--- a/AUTHORS.md
+++ b/AUTHORS.md
@@ -38,6 +38,7 @@ name is available.
Ariel Manzur (punto-)
Bastiaan Olij (BastiaanOlij)
Ben Brookshire (sheepandshepherd)
+ Benjamin (Nallebeorn)
Bernard Liebl (poke1024)
Bojidar Marinov (bojidar-bg)
Błażej Szczygieł (zaps166)
@@ -61,6 +62,7 @@ name is available.
Hubert Jarosz (Marqin)
Hugo Locurcio (Calinou)
Ian Bishop (ianb96)
+ Ibrahn Sahir (ibrahn)
Ignacio Etcheverry (neikeq)
Indah Sylvia (ISylvox)
J08nY
@@ -71,6 +73,7 @@ name is available.
Juan Linietsky (reduz)
Julian Murgia (StraToN)
Justo Delgado (mrcdk)
+ Kelly Thomas (KellyThomas)
Kostadin Damyanov (Max-Might)
Leon Krause (eska014)
Marc Gilleron (Zylann)
@@ -85,6 +88,7 @@ name is available.
Nathan Warden (NathanWarden)
Nuno Donato (nunodonato)
Ovnuniarchos
+ Pascal Richter (ShyRed)
Patrick (firefly2442)
Paul Batty (Paulb23)
Paul Joannon (paulloz)
diff --git a/DONORS.md b/DONORS.md
index c0ab24390a..da0f5bca75 100644
--- a/DONORS.md
+++ b/DONORS.md
@@ -22,7 +22,6 @@ generous deed immortalized in the next stable release of Godot Engine.
## Mini sponsors
- Andreas
Brandon Lamb
Christian Uldall Pedersen
Christopher Igoe
@@ -44,6 +43,7 @@ generous deed immortalized in the next stable release of Godot Engine.
Stephan Lanfermann
Stoney Meyerhoeffer
Thomas Mathews
+ VilliHaukka
## Gold donors
@@ -51,11 +51,11 @@ generous deed immortalized in the next stable release of Godot Engine.
Alexander Otto
Asdf
cheese65536
- Jake Bo
+ K9Kraken
Kris Michael
Manuele Finocchiaro
+ Nathanael Beisiegel
Officine Pixel S.n.c.
- Rémi Verschelde
Zaven Muradyan
Allen Schade
@@ -64,7 +64,7 @@ generous deed immortalized in the next stable release of Godot Engine.
Bernhard Liebl
Catalin Moldovan
DeepSquid
- Duane Johnson
+ Fidget Sinner
Florian Breisch
Gary Oberbrunner
Johannes Wuensch
@@ -72,6 +72,7 @@ generous deed immortalized in the next stable release of Godot Engine.
Joshua Lesperance
Libre-Dépanne
Matthew Bennett
+ Olafur Gislason
Paul LaMotte
Ranoller
Svenne Krap
@@ -82,20 +83,21 @@ generous deed immortalized in the next stable release of Godot Engine.
Chris Serino
Conrad Curry
Craig Smith
+ Daniel Egger
David Churchill
Dean Harmon
Dexter Miguel
- Garrett Dockins
Guilherme Felipe de C. G. da Silva
John
Justo Delgado Baudí
+ KTL
Laurence Bannister
Rami
Robert Willes
Robin Arys
+ Ronnie Ashlock
Rufus Xavier Sarsaparilla
ScottMakesGames
- Testus Maximus
Thomas Bjarnelöf
William Connell
Wojciech Chojnacki
@@ -109,21 +111,20 @@ generous deed immortalized in the next stable release of Godot Engine.
Chris Petrich
Chris Wilson
Cody Parker
+ Corey Auger
D
Daniel Eliasinski
E.G.
Eric Monson
flesk
- François Cantin
G Barnes
GGGames.org
Giovanni Solimeno
Hasen Judy
Heath Hayes
+ Jay Horton
Jeppe Zapp
- Jeremi Biernacki
joe513
- John O'Mahoney
Jordan M Lucas
Juraj Móza
Justin Arnold
@@ -137,10 +138,11 @@ generous deed immortalized in the next stable release of Godot Engine.
Patrick Schnorbus
Pete Goodwin
Phyronnaz
- SeokHui Lee
- Simon De Greve
+ Ruben Soares Luis
Sofox
+ Stoned Xander
Ted
+ Tim Dalporto
Trent McPheron
Vladimir
@@ -158,6 +160,7 @@ generous deed immortalized in the next stable release of Godot Engine.
Arthur S. Muszynski
Aubrey Falconer
Avencherus
+ Bailey
Bastian Böhm
Benedikt
Benjamin Beshara
@@ -172,7 +175,8 @@ generous deed immortalized in the next stable release of Godot Engine.
Christian Winter
Christopher Schmitt
Collin Shooltz
- Daniel Egger
+ Daniel Delgado Corona
+ Daniel Johnson
Daniel Kaplan
DanielMaximiano
Daniel Mircea
@@ -180,18 +184,18 @@ generous deed immortalized in the next stable release of Godot Engine.
David Cravens
David May
Dominik Wetzel
+ Duy Kevin Nguyen
Edward Herbert
Eric Martini
Fabian Becker
fengjiongmax
Francesco Lisi
- Frédéric Alix
G3Dev sàrl
- Geequlim
Gerrit Großkopf
Gerrit Procee
Gilberto K. Otubo
Guldoman
+ Gumichan01
Heribert Hirth
hubert jenkins
Hunter Jones
@@ -211,7 +215,6 @@ generous deed immortalized in the next stable release of Godot Engine.
Josh 'Cheeseness' Bush
Juan Negrier
Judd
- JuDelCo
Julian Murgia
Justin Luk
KC Chan
@@ -221,26 +224,26 @@ generous deed immortalized in the next stable release of Godot Engine.
Krzysztof Jankowski
Lars pfeffer
Linus Lind Lundgren
+ Luis Moraes
Macil
magodev
Martin Eigel
+ Martins Odabi
Matthew Fitzpatrick
- Matthias Hölzl
Max R.R. Collada
- memoryruins
+ Maxwell
mhilbrunner
Michael Dürwald
Michael Gringauz
Michael Labbe
Mikael Olsson
MoM
- monokrome
Moritz Laass
+ Natrim
nee
Neil Blakey-Milner
Nick Pavlica
Niclas Eriksen
- Nicolás Montaña
Nicolas SAN AGUSTIN
Niko Leopold
nivardus
@@ -257,6 +260,8 @@ generous deed immortalized in the next stable release of Godot Engine.
Pierre-Igor Berthet
Pietro Vertechi
Piotr Kaczmarski
+ Rea
+ Rémi Verschelde
Richman Stewart
Roger Burgess
Roger Smith
@@ -264,12 +269,11 @@ generous deed immortalized in the next stable release of Godot Engine.
Ryan Whited
Samuel El-Borai
Sasori Olkof
- Scott D. Yelich
Sootstone
+ Stefan Butucea
Theo Cranmore
Thibault Barbaroux
Thomas Bell
- Thomas Herzog & Xananax
Thomas Kurz
Tomasz Wacławek
Tom Larrow
diff --git a/core/bind/core_bind.cpp b/core/bind/core_bind.cpp
index b7f20588f2..372cff4412 100644
--- a/core/bind/core_bind.cpp
+++ b/core/bind/core_bind.cpp
@@ -348,6 +348,11 @@ bool _OS::get_borderless_window() const {
return OS::get_singleton()->get_borderless_window();
}
+void _OS::set_ime_active(const bool p_active) {
+
+ return OS::get_singleton()->set_ime_active(p_active);
+}
+
void _OS::set_ime_position(const Point2 &p_pos) {
return OS::get_singleton()->set_ime_position(p_pos);
diff --git a/core/bind/core_bind.h b/core/bind/core_bind.h
index 1de5e43b27..560d9e9873 100644
--- a/core/bind/core_bind.h
+++ b/core/bind/core_bind.h
@@ -183,6 +183,7 @@ public:
virtual bool get_window_per_pixel_transparency_enabled() const;
virtual void set_window_per_pixel_transparency_enabled(bool p_enabled);
+ virtual void set_ime_active(const bool p_active);
virtual void set_ime_position(const Point2 &p_pos);
Error native_video_play(String p_path, float p_volume, String p_audio_track, String p_subtitle_track);
diff --git a/core/io/logger.cpp b/core/io/logger.cpp
index 8a5d683b56..786bec461b 100644
--- a/core/io/logger.cpp
+++ b/core/io/logger.cpp
@@ -112,7 +112,7 @@ void RotatedFileLogger::clear_old_backups() {
int max_backups = max_files - 1; // -1 for the current file
String basename = base_path.get_file().get_basename();
- String extension = "." + base_path.get_extension();
+ String extension = base_path.get_extension();
DirAccess *da = DirAccess::open(base_path.get_base_dir());
if (!da) {
@@ -123,7 +123,7 @@ void RotatedFileLogger::clear_old_backups() {
String f = da->get_next();
Set<String> backups;
while (f != String()) {
- if (!da->current_is_dir() && f.begins_with(basename) && f.ends_with(extension) && f != base_path.get_file()) {
+ if (!da->current_is_dir() && f.begins_with(basename) && f.get_extension() == extension && f != base_path.get_file()) {
backups.insert(f);
}
f = da->get_next();
diff --git a/core/os/os.h b/core/os/os.h
index b36f94060c..adf01a90e7 100644
--- a/core/os/os.h
+++ b/core/os/os.h
@@ -232,6 +232,7 @@ public:
virtual Size2 get_layered_buffer_size() { return Size2(0, 0); }
virtual void swap_layered_buffer() {}
+ virtual void set_ime_active(const bool p_active) {}
virtual void set_ime_position(const Point2 &p_pos) {}
virtual void set_ime_intermediate_text_callback(ImeCallback p_callback, void *p_inp) {}
diff --git a/doc/classes/@GlobalScope.xml b/doc/classes/@GlobalScope.xml
index 840d884a8c..7f94676e93 100644
--- a/doc/classes/@GlobalScope.xml
+++ b/doc/classes/@GlobalScope.xml
@@ -29,9 +29,6 @@
<member name="Geometry" type="Geometry" setter="" getter="">
[Geometry] singleton
</member>
- <member name="GodotSharp" type="GodotSharp" setter="" getter="">
- [GodotSharp] singleton
- </member>
<member name="IP" type="IP" setter="" getter="">
[IP] singleton
</member>
diff --git a/doc/classes/AABB.xml b/doc/classes/AABB.xml
index 730c395f10..b9061e0b87 100644
--- a/doc/classes/AABB.xml
+++ b/doc/classes/AABB.xml
@@ -7,7 +7,7 @@
AABB consists of a position, a size, and several utility functions. It is typically used for fast overlap tests.
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/math/index.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/math/index.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/Animation.xml b/doc/classes/Animation.xml
index ea503f8aa9..c6b868c058 100644
--- a/doc/classes/Animation.xml
+++ b/doc/classes/Animation.xml
@@ -8,7 +8,7 @@
Animations are just data containers, and must be added to odes such as an [AnimationPlayer] or [AnimationTreePlayer] to be played back.
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/animation/index.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/animation/index.html</link>
</tutorials>
<demos>
</demos>
@@ -24,6 +24,214 @@
Add a track to the Animation. The track type must be specified as any of the values in the TYPE_* enumeration.
</description>
</method>
+ <method name="animation_track_get_key_animation" qualifiers="const">
+ <return type="String">
+ </return>
+ <argument index="0" name="idx" type="int">
+ </argument>
+ <argument index="1" name="key_idx" type="int">
+ </argument>
+ <description>
+ </description>
+ </method>
+ <method name="animation_track_insert_key">
+ <return type="int">
+ </return>
+ <argument index="0" name="track" type="int">
+ </argument>
+ <argument index="1" name="time" type="float">
+ </argument>
+ <argument index="2" name="animation" type="String">
+ </argument>
+ <description>
+ </description>
+ </method>
+ <method name="animation_track_set_key_animation">
+ <return type="void">
+ </return>
+ <argument index="0" name="idx" type="int">
+ </argument>
+ <argument index="1" name="key_idx" type="int">
+ </argument>
+ <argument index="2" name="animation" type="String">
+ </argument>
+ <description>
+ </description>
+ </method>
+ <method name="audio_track_get_key_end_offset" qualifiers="const">
+ <return type="float">
+ </return>
+ <argument index="0" name="idx" type="int">
+ </argument>
+ <argument index="1" name="key_idx" type="int">
+ </argument>
+ <description>
+ </description>
+ </method>
+ <method name="audio_track_get_key_start_offset" qualifiers="const">
+ <return type="float">
+ </return>
+ <argument index="0" name="idx" type="int">
+ </argument>
+ <argument index="1" name="key_idx" type="int">
+ </argument>
+ <description>
+ </description>
+ </method>
+ <method name="audio_track_get_key_stream" qualifiers="const">
+ <return type="Resource">
+ </return>
+ <argument index="0" name="idx" type="int">
+ </argument>
+ <argument index="1" name="key_idx" type="int">
+ </argument>
+ <description>
+ </description>
+ </method>
+ <method name="audio_track_insert_key">
+ <return type="int">
+ </return>
+ <argument index="0" name="track" type="int">
+ </argument>
+ <argument index="1" name="time" type="float">
+ </argument>
+ <argument index="2" name="stream" type="Resource">
+ </argument>
+ <argument index="3" name="start_offset" type="float" default="0">
+ </argument>
+ <argument index="4" name="end_offset" type="float" default="0">
+ </argument>
+ <description>
+ </description>
+ </method>
+ <method name="audio_track_set_key_end_offset">
+ <return type="void">
+ </return>
+ <argument index="0" name="idx" type="int">
+ </argument>
+ <argument index="1" name="key_idx" type="int">
+ </argument>
+ <argument index="2" name="offset" type="float">
+ </argument>
+ <description>
+ </description>
+ </method>
+ <method name="audio_track_set_key_start_offset">
+ <return type="void">
+ </return>
+ <argument index="0" name="idx" type="int">
+ </argument>
+ <argument index="1" name="key_idx" type="int">
+ </argument>
+ <argument index="2" name="offset" type="float">
+ </argument>
+ <description>
+ </description>
+ </method>
+ <method name="audio_track_set_key_stream">
+ <return type="void">
+ </return>
+ <argument index="0" name="idx" type="int">
+ </argument>
+ <argument index="1" name="key_idx" type="int">
+ </argument>
+ <argument index="2" name="stream" type="Resource">
+ </argument>
+ <description>
+ </description>
+ </method>
+ <method name="bezier_track_get_key_in_handle" qualifiers="const">
+ <return type="Vector2">
+ </return>
+ <argument index="0" name="idx" type="int">
+ </argument>
+ <argument index="1" name="key_idx" type="int">
+ </argument>
+ <description>
+ </description>
+ </method>
+ <method name="bezier_track_get_key_out_handle" qualifiers="const">
+ <return type="Vector2">
+ </return>
+ <argument index="0" name="idx" type="int">
+ </argument>
+ <argument index="1" name="key_idx" type="int">
+ </argument>
+ <description>
+ </description>
+ </method>
+ <method name="bezier_track_get_key_value" qualifiers="const">
+ <return type="float">
+ </return>
+ <argument index="0" name="idx" type="int">
+ </argument>
+ <argument index="1" name="key_idx" type="int">
+ </argument>
+ <description>
+ </description>
+ </method>
+ <method name="bezier_track_insert_key">
+ <return type="int">
+ </return>
+ <argument index="0" name="track" type="int">
+ </argument>
+ <argument index="1" name="time" type="float">
+ </argument>
+ <argument index="2" name="value" type="float">
+ </argument>
+ <argument index="3" name="in_handle" type="Vector2" default="Vector2( 0, 0 )">
+ </argument>
+ <argument index="4" name="out_handle" type="Vector2" default="Vector2( 0, 0 )">
+ </argument>
+ <description>
+ </description>
+ </method>
+ <method name="bezier_track_interpolate" qualifiers="const">
+ <return type="float">
+ </return>
+ <argument index="0" name="track" type="int">
+ </argument>
+ <argument index="1" name="time" type="float">
+ </argument>
+ <description>
+ </description>
+ </method>
+ <method name="bezier_track_set_key_in_handle">
+ <return type="void">
+ </return>
+ <argument index="0" name="idx" type="int">
+ </argument>
+ <argument index="1" name="key_idx" type="int">
+ </argument>
+ <argument index="2" name="in_handle" type="Vector2">
+ </argument>
+ <description>
+ </description>
+ </method>
+ <method name="bezier_track_set_key_out_handle">
+ <return type="void">
+ </return>
+ <argument index="0" name="idx" type="int">
+ </argument>
+ <argument index="1" name="key_idx" type="int">
+ </argument>
+ <argument index="2" name="out_handle" type="Vector2">
+ </argument>
+ <description>
+ </description>
+ </method>
+ <method name="bezier_track_set_key_value">
+ <return type="void">
+ </return>
+ <argument index="0" name="idx" type="int">
+ </argument>
+ <argument index="1" name="key_idx" type="int">
+ </argument>
+ <argument index="2" name="value" type="float">
+ </argument>
+ <description>
+ </description>
+ </method>
<method name="clear">
<return type="void">
</return>
@@ -347,6 +555,16 @@
Set the path of a track. Paths must be valid scene-tree paths to a node, and must be specified starting from the parent node of the node that will reproduce the animation. Tracks that control properties or bones must append their name after the path, separated by ":". Example: "character/skeleton:ankle" or "character/mesh:transform/local"
</description>
</method>
+ <method name="track_swap">
+ <return type="void">
+ </return>
+ <argument index="0" name="idx" type="int">
+ </argument>
+ <argument index="1" name="with_idx" type="int">
+ </argument>
+ <description>
+ </description>
+ </method>
<method name="transform_track_insert_key">
<return type="int">
</return>
@@ -430,6 +648,12 @@
<constant name="TYPE_METHOD" value="2" enum="TrackType">
Method tracks call functions with given arguments per key.
</constant>
+ <constant name="TYPE_BEZIER" value="3" enum="TrackType">
+ </constant>
+ <constant name="TYPE_AUDIO" value="4" enum="TrackType">
+ </constant>
+ <constant name="TYPE_ANIMATION" value="5" enum="TrackType">
+ </constant>
<constant name="INTERPOLATION_NEAREST" value="0" enum="InterpolationType">
No interpolation (nearest value).
</constant>
@@ -448,5 +672,7 @@
<constant name="UPDATE_TRIGGER" value="2" enum="UpdateMode">
Update at the keyframes.
</constant>
+ <constant name="UPDATE_CAPTURE" value="3" enum="UpdateMode">
+ </constant>
</constants>
</class>
diff --git a/doc/classes/AnimationPlayer.xml b/doc/classes/AnimationPlayer.xml
index 673bbbea59..e1b3c7a9c9 100644
--- a/doc/classes/AnimationPlayer.xml
+++ b/doc/classes/AnimationPlayer.xml
@@ -7,8 +7,8 @@
An animation player is used for general purpose playback of [Animation] resources. It contains a dictionary of animations (referenced by name) and custom blend times between their transitions. Additionally, animations can be played and blended in different channels.
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/getting_started/step_by_step/animations.html
- http://docs.godotengine.org/en/3.0/tutorials/animation/index.html
+ <link>http://docs.godotengine.org/en/3.0/getting_started/step_by_step/animations.html</link>
+ <link>http://docs.godotengine.org/en/3.0/tutorials/animation/index.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/AnimationTrackEditPlugin.xml b/doc/classes/AnimationTrackEditPlugin.xml
new file mode 100644
index 0000000000..f322a556b1
--- /dev/null
+++ b/doc/classes/AnimationTrackEditPlugin.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<class name="AnimationTrackEditPlugin" inherits="Reference" category="Core" version="3.1">
+ <brief_description>
+ </brief_description>
+ <description>
+ </description>
+ <tutorials>
+ </tutorials>
+ <demos>
+ </demos>
+ <methods>
+ </methods>
+ <constants>
+ </constants>
+</class>
diff --git a/doc/classes/AudioServer.xml b/doc/classes/AudioServer.xml
index 7b3ba632cc..51df1e99dd 100644
--- a/doc/classes/AudioServer.xml
+++ b/doc/classes/AudioServer.xml
@@ -7,7 +7,7 @@
AudioServer is a low level server interface for audio access. It is in charge of creating sample data (playable audio) as well as its playback via a voice interface.
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/audio/audio_buses.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/audio/audio_buses.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/AudioStream.xml b/doc/classes/AudioStream.xml
index d332277248..15bbb1625c 100644
--- a/doc/classes/AudioStream.xml
+++ b/doc/classes/AudioStream.xml
@@ -7,7 +7,7 @@
Base class for audio streams. Audio streams are used for music playback, or other types of streamed sounds that don't fit or require more flexibility than a [Sample].
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/audio/audio_streams.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/audio/audio_streams.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/AudioStreamPlayer.xml b/doc/classes/AudioStreamPlayer.xml
index 7d9fcf3e01..00d03d2b20 100644
--- a/doc/classes/AudioStreamPlayer.xml
+++ b/doc/classes/AudioStreamPlayer.xml
@@ -7,8 +7,8 @@
Plays background audio.
</description>
<tutorials>
- http://docs.godotengine.org/en/latest/learning/features/audio/index.html
- http://docs.godotengine.org/en/3.0/tutorials/audio/audio_streams.html
+ <link>http://docs.godotengine.org/en/latest/learning/features/audio/index.html</link>
+ <link>http://docs.godotengine.org/en/3.0/tutorials/audio/audio_streams.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/AudioStreamPlayer2D.xml b/doc/classes/AudioStreamPlayer2D.xml
index 81beab245d..03b0a3aa81 100644
--- a/doc/classes/AudioStreamPlayer2D.xml
+++ b/doc/classes/AudioStreamPlayer2D.xml
@@ -7,8 +7,8 @@
Plays audio that dampens with distance from screen center.
</description>
<tutorials>
- http://docs.godotengine.org/en/latest/learning/features/audio/index.html
- http://docs.godotengine.org/en/3.0/tutorials/audio/audio_streams.html
+ <link>http://docs.godotengine.org/en/latest/learning/features/audio/index.html</link>
+ <link>http://docs.godotengine.org/en/3.0/tutorials/audio/audio_streams.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/AudioStreamPlayer3D.xml b/doc/classes/AudioStreamPlayer3D.xml
index 311efb7495..2746938c1d 100644
--- a/doc/classes/AudioStreamPlayer3D.xml
+++ b/doc/classes/AudioStreamPlayer3D.xml
@@ -7,8 +7,8 @@
Plays a sound effect with directed sound effects, dampens with distance if needed, generates effect of hearable position in space.
</description>
<tutorials>
- http://docs.godotengine.org/en/latest/learning/features/audio/index.html
- http://docs.godotengine.org/en/3.0/tutorials/audio/audio_streams.html
+ <link>http://docs.godotengine.org/en/latest/learning/features/audio/index.html</link>
+ <link>http://docs.godotengine.org/en/3.0/tutorials/audio/audio_streams.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/BakedLightmap.xml b/doc/classes/BakedLightmap.xml
index 45c60302a6..77895249e5 100644
--- a/doc/classes/BakedLightmap.xml
+++ b/doc/classes/BakedLightmap.xml
@@ -5,7 +5,7 @@
<description>
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/3d/baked_lightmaps.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/3d/baked_lightmaps.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/Basis.xml b/doc/classes/Basis.xml
index b9dc763820..fe8debe1a9 100644
--- a/doc/classes/Basis.xml
+++ b/doc/classes/Basis.xml
@@ -8,8 +8,8 @@
For such use, it is composed of a scaling and a rotation matrix, in that order (M = R.S).
</description>
<tutorials>
- http://docs.godotengine.org/en/latest/tutorials/3d/using_transforms.html
- http://docs.godotengine.org/en/latest/tutorials/math/rotations.html
+ <link>http://docs.godotengine.org/en/latest/tutorials/3d/using_transforms.html</link>
+ <link>http://docs.godotengine.org/en/latest/tutorials/math/rotations.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/CanvasItem.xml b/doc/classes/CanvasItem.xml
index c8622be4ad..a04e38af5c 100644
--- a/doc/classes/CanvasItem.xml
+++ b/doc/classes/CanvasItem.xml
@@ -11,8 +11,8 @@
Ultimately, a transform notification can be requested, which will notify the node that its global position changed in case the parent tree changed.
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/2d/2d_transforms.html
- http://docs.godotengine.org/en/3.0/tutorials/2d/custom_drawing_in_2d.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/2d/2d_transforms.html</link>
+ <link>http://docs.godotengine.org/en/3.0/tutorials/2d/custom_drawing_in_2d.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/CanvasLayer.xml b/doc/classes/CanvasLayer.xml
index 3e4d1b29f7..d4412e15c9 100644
--- a/doc/classes/CanvasLayer.xml
+++ b/doc/classes/CanvasLayer.xml
@@ -7,8 +7,8 @@
Canvas drawing layer. [CanvasItem] nodes that are direct or indirect children of a [code]CanvasLayer[/code] will be drawn in that layer. The layer is a numeric index that defines the draw order. The default 2D scene renders with index 0, so a [code]CanvasLayer[/code] with index -1 will be drawn below, and one with index 1 will be drawn above. This is very useful for HUDs (in layer 1+ or above), or backgrounds (in layer -1 or below).
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/2d/2d_transforms.html
- http://docs.godotengine.org/en/3.0/tutorials/2d/canvas_layers.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/2d/2d_transforms.html</link>
+ <link>http://docs.godotengine.org/en/3.0/tutorials/2d/canvas_layers.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/CollisionShape.xml b/doc/classes/CollisionShape.xml
index 95fa1175c3..682c9340df 100644
--- a/doc/classes/CollisionShape.xml
+++ b/doc/classes/CollisionShape.xml
@@ -7,7 +7,7 @@
Editor facility for creating and editing collision shapes in 3D space. You can use this node to represent all sorts of collision shapes, for example, add this to an [Area] to give it a detection shape, or add it to a [PhysicsBody] to create a solid object. [b]IMPORTANT[/b]: this is an Editor-only helper to create shapes, use [method get_shape] to get the actual shape.
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/physics/physics_introduction.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/physics/physics_introduction.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/CollisionShape2D.xml b/doc/classes/CollisionShape2D.xml
index 3136f132bf..3312fad99c 100644
--- a/doc/classes/CollisionShape2D.xml
+++ b/doc/classes/CollisionShape2D.xml
@@ -7,7 +7,7 @@
Editor facility for creating and editing collision shapes in 2D space. You can use this node to represent all sorts of collision shapes, for example, add this to an [Area2D] to give it a detection shape, or add it to a [PhysicsBody2D] to create a solid object. [b]IMPORTANT[/b]: this is an Editor-only helper to create shapes, use [method get_shape] to get the actual shape.
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/physics/physics_introduction.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/physics/physics_introduction.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/Control.xml b/doc/classes/Control.xml
index 9413a8aa34..52382337cf 100644
--- a/doc/classes/Control.xml
+++ b/doc/classes/Control.xml
@@ -13,8 +13,8 @@
[Theme] resources change the Control's appearance. If you change the [Theme] on a [code]Control[/code] node, it affects all of its children. To override some of the theme's parameters, call one of the [code]add_*_override[/code] methods, like [method add_font_override]. You can override the theme with the inspector.
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/gui/index.html
- http://docs.godotengine.org/en/3.0/tutorials/2d/custom_drawing_in_2d.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/gui/index.html</link>
+ <link>http://docs.godotengine.org/en/3.0/tutorials/2d/custom_drawing_in_2d.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/DirectionalLight.xml b/doc/classes/DirectionalLight.xml
index 5e492b74da..ef75182811 100644
--- a/doc/classes/DirectionalLight.xml
+++ b/doc/classes/DirectionalLight.xml
@@ -7,7 +7,7 @@
A DirectionalLight is a type of [Light] node that emits light constantly in one direction (the negative z axis of the node). It is used lights with strong intensity that are located far away from the scene to model sunlight or moonlight. The worldspace location of the DirectionalLight transform (origin) is ignored, only the basis is used do determine light direction.
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/3d/lights_and_shadows.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/3d/lights_and_shadows.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/Directory.xml b/doc/classes/Directory.xml
index 040ccf4462..d8ad208fa7 100644
--- a/doc/classes/Directory.xml
+++ b/doc/classes/Directory.xml
@@ -23,7 +23,7 @@
[/codeblock]
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/getting_started/step_by_step/filesystem.html
+ <link>http://docs.godotengine.org/en/3.0/getting_started/step_by_step/filesystem.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/EditorPlugin.xml b/doc/classes/EditorPlugin.xml
index 860d98ab62..b9945f3f73 100644
--- a/doc/classes/EditorPlugin.xml
+++ b/doc/classes/EditorPlugin.xml
@@ -7,7 +7,7 @@
Plugins are used by the editor to extend functionality. The most common types of plugins are those which edit a given node or resource type, import plugins and export plugins.
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/development/plugins/index.html
+ <link>http://docs.godotengine.org/en/3.0/development/plugins/index.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/Environment.xml b/doc/classes/Environment.xml
index 18adaa645c..cd2584ed43 100644
--- a/doc/classes/Environment.xml
+++ b/doc/classes/Environment.xml
@@ -13,8 +13,8 @@
- Adjustments
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/3d/environment_and_post_processing.html
- http://docs.godotengine.org/en/3.0/tutorials/3d/high_dynamic_range.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/3d/environment_and_post_processing.html</link>
+ <link>http://docs.godotengine.org/en/3.0/tutorials/3d/high_dynamic_range.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/File.xml b/doc/classes/File.xml
index 78aa1b1a61..20054ac9dc 100644
--- a/doc/classes/File.xml
+++ b/doc/classes/File.xml
@@ -22,7 +22,7 @@
[/codeblock]
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/getting_started/step_by_step/filesystem.html
+ <link>http://docs.godotengine.org/en/3.0/getting_started/step_by_step/filesystem.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/FileDialog.xml b/doc/classes/FileDialog.xml
index b165d8fb8c..247228d265 100644
--- a/doc/classes/FileDialog.xml
+++ b/doc/classes/FileDialog.xml
@@ -33,6 +33,12 @@
<description>
</description>
</method>
+ <method name="get_line_edit">
+ <return type="LineEdit">
+ </return>
+ <description>
+ </description>
+ </method>
<method name="get_vbox">
<return type="VBoxContainer">
</return>
diff --git a/doc/classes/GIProbe.xml b/doc/classes/GIProbe.xml
index fde91d09ac..77dea73564 100644
--- a/doc/classes/GIProbe.xml
+++ b/doc/classes/GIProbe.xml
@@ -5,7 +5,7 @@
<description>
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/3d/gi_probes.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/3d/gi_probes.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/HTTPClient.xml b/doc/classes/HTTPClient.xml
index 018b548ef1..08e2f649a0 100644
--- a/doc/classes/HTTPClient.xml
+++ b/doc/classes/HTTPClient.xml
@@ -10,8 +10,8 @@
For more information on HTTP, see https://developer.mozilla.org/en-US/docs/Web/HTTP (or read RFC 2616 to get it straight from the source: https://tools.ietf.org/html/rfc2616).
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/networking/http_client_class.html
- http://docs.godotengine.org/en/3.0/tutorials/networking/ssl_certificates.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/networking/http_client_class.html</link>
+ <link>http://docs.godotengine.org/en/3.0/tutorials/networking/ssl_certificates.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/HTTPRequest.xml b/doc/classes/HTTPRequest.xml
index ec9f86993f..c5bb10a23a 100644
--- a/doc/classes/HTTPRequest.xml
+++ b/doc/classes/HTTPRequest.xml
@@ -8,7 +8,7 @@
Can be used to make HTTP requests, i.e. download or upload files or web content via HTTP.
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/networking/ssl_certificates.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/networking/ssl_certificates.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/Image.xml b/doc/classes/Image.xml
index 760b0c6bdc..9fc7672a80 100644
--- a/doc/classes/Image.xml
+++ b/doc/classes/Image.xml
@@ -393,6 +393,12 @@
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.
</description>
</method>
+ <method name="rgbe_to_srgb">
+ <return type="Image">
+ </return>
+ <description>
+ </description>
+ </method>
<method name="save_png" qualifiers="const">
<return type="int" enum="Error">
</return>
diff --git a/doc/classes/Input.xml b/doc/classes/Input.xml
index f92f8da5dd..a4346c1485 100644
--- a/doc/classes/Input.xml
+++ b/doc/classes/Input.xml
@@ -7,7 +7,7 @@
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 Project Settings / Input Map tab. Or be set with [InputMap].
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/inputs/index.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/inputs/index.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/InputEvent.xml b/doc/classes/InputEvent.xml
index cbed2285df..993d62d188 100644
--- a/doc/classes/InputEvent.xml
+++ b/doc/classes/InputEvent.xml
@@ -7,8 +7,8 @@
Base class of all sort of input event. See [method Node._input].
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/inputs/inputevent.html
- http://docs.godotengine.org/en/3.0/tutorials/2d/2d_transforms.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/inputs/inputevent.html</link>
+ <link>http://docs.godotengine.org/en/3.0/tutorials/2d/2d_transforms.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/InputEventAction.xml b/doc/classes/InputEventAction.xml
index e50c43c045..16000231cb 100644
--- a/doc/classes/InputEventAction.xml
+++ b/doc/classes/InputEventAction.xml
@@ -7,7 +7,7 @@
Contains a generic action which can be targeted from several type of inputs. Actions can be created from the project settings menu [code]Project &gt; Project Settings &gt; Input Map[/code]. See [method Node._input].
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/inputs/inputevent.html#actions
+ <link>http://docs.godotengine.org/en/3.0/tutorials/inputs/inputevent.html#actions</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/InputEventJoypadButton.xml b/doc/classes/InputEventJoypadButton.xml
index 9614b0805b..adaeae685e 100644
--- a/doc/classes/InputEventJoypadButton.xml
+++ b/doc/classes/InputEventJoypadButton.xml
@@ -7,7 +7,7 @@
Input event type for gamepad buttons. For joysticks see [InputEventJoypadMotion].
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/inputs/inputevent.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/inputs/inputevent.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/InputEventJoypadMotion.xml b/doc/classes/InputEventJoypadMotion.xml
index b01f2a3fe1..f86aec4ce0 100644
--- a/doc/classes/InputEventJoypadMotion.xml
+++ b/doc/classes/InputEventJoypadMotion.xml
@@ -7,7 +7,7 @@
Stores information about joystick motions. One [code]InputEventJoypadMotion[/code] represents one axis at a time.
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/inputs/inputevent.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/inputs/inputevent.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/InputEventKey.xml b/doc/classes/InputEventKey.xml
index 410738c68e..7503e53188 100644
--- a/doc/classes/InputEventKey.xml
+++ b/doc/classes/InputEventKey.xml
@@ -7,7 +7,7 @@
Stores key presses on the keyboard. Supports key presses, key releases and [member echo] events.
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/inputs/inputevent.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/inputs/inputevent.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/InputEventMouse.xml b/doc/classes/InputEventMouse.xml
index 96a0116c3c..06de96890a 100644
--- a/doc/classes/InputEventMouse.xml
+++ b/doc/classes/InputEventMouse.xml
@@ -7,7 +7,7 @@
Stores general mouse events information.
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/inputs/inputevent.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/inputs/inputevent.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/InputEventMouseButton.xml b/doc/classes/InputEventMouseButton.xml
index 73190c7283..fd326f97d5 100644
--- a/doc/classes/InputEventMouseButton.xml
+++ b/doc/classes/InputEventMouseButton.xml
@@ -7,7 +7,7 @@
Contains mouse click information. See [method Node._input].
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/inputs/mouse_and_input_coordinates.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/inputs/mouse_and_input_coordinates.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/InputEventMouseMotion.xml b/doc/classes/InputEventMouseMotion.xml
index 83aa28c693..05e3e79d26 100644
--- a/doc/classes/InputEventMouseMotion.xml
+++ b/doc/classes/InputEventMouseMotion.xml
@@ -7,7 +7,7 @@
Contains mouse motion information. Supports relative, absolute positions and speed. See [method Node._input].
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/inputs/mouse_and_input_coordinates.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/inputs/mouse_and_input_coordinates.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/InputEventScreenDrag.xml b/doc/classes/InputEventScreenDrag.xml
index a2ac8d587f..f777d90ccb 100644
--- a/doc/classes/InputEventScreenDrag.xml
+++ b/doc/classes/InputEventScreenDrag.xml
@@ -8,7 +8,7 @@
Contains screen drag information. See [method Node._input].
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/inputs/inputevent.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/inputs/inputevent.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/InputEventScreenTouch.xml b/doc/classes/InputEventScreenTouch.xml
index 64b9550f9d..39cd0a9657 100644
--- a/doc/classes/InputEventScreenTouch.xml
+++ b/doc/classes/InputEventScreenTouch.xml
@@ -8,7 +8,7 @@
Stores multi-touch press/release information. Supports touch press, touch release and [member index] for multi-touch count and order.
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/inputs/inputevent.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/inputs/inputevent.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/InputEventWithModifiers.xml b/doc/classes/InputEventWithModifiers.xml
index 2d046cbfd2..9c1814fedd 100644
--- a/doc/classes/InputEventWithModifiers.xml
+++ b/doc/classes/InputEventWithModifiers.xml
@@ -7,7 +7,7 @@
Contains keys events information with modifiers support like [code]SHIFT[/code] or [code]ALT[/code]. See [method Node._input].
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/inputs/inputevent.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/inputs/inputevent.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/InputMap.xml b/doc/classes/InputMap.xml
index 3399a3f096..2f5fb49dba 100644
--- a/doc/classes/InputMap.xml
+++ b/doc/classes/InputMap.xml
@@ -7,7 +7,7 @@
Manages all [InputEventAction] which can be created/modified from the project settings menu [code]Project &gt; Project Settings &gt; Input Map[/code] or in code with [method add_action] and [method action_add_event]. See [method Node._input].
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/inputs/inputevent.html#inputmap
+ <link>http://docs.godotengine.org/en/3.0/tutorials/inputs/inputevent.html#inputmap</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/JavaScript.xml b/doc/classes/JavaScript.xml
index 1d40b990a9..17588717c2 100644
--- a/doc/classes/JavaScript.xml
+++ b/doc/classes/JavaScript.xml
@@ -7,7 +7,7 @@
The JavaScript singleton is implemented only in HTML5 export. It's used to access the browser's JavaScript context. This allows interaction with embedding pages or calling third-party JavaScript APIs.
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/getting_started/workflow/export/exporting_for_web.html#calling-javascript-from-script
+ <link>http://docs.godotengine.org/en/3.0/getting_started/workflow/export/exporting_for_web.html#calling-javascript-from-script</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/KinematicBody.xml b/doc/classes/KinematicBody.xml
index 5553602db2..ae33ed5205 100644
--- a/doc/classes/KinematicBody.xml
+++ b/doc/classes/KinematicBody.xml
@@ -9,7 +9,7 @@
Kinematic Characters: KinematicBody also has an API for moving objects (the [method move_and_collide] and [method move_and_slide] methods) while performing collision tests. This makes them really useful to implement characters that collide against a world, but that don't require advanced physics.
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/physics/kinematic_character_2d.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/physics/kinematic_character_2d.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/Light.xml b/doc/classes/Light.xml
index e05ed2d0b1..e9b36c2f9d 100644
--- a/doc/classes/Light.xml
+++ b/doc/classes/Light.xml
@@ -7,7 +7,7 @@
Light is the abstract base class for light nodes, so it shouldn't be used directly (It can't be instanced). Other types of light nodes inherit from it. Light contains the common variables and parameters used for lighting.
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/3d/lights_and_shadows.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/3d/lights_and_shadows.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/NetworkedMultiplayerPeer.xml b/doc/classes/NetworkedMultiplayerPeer.xml
index 2780334384..e878b3a746 100644
--- a/doc/classes/NetworkedMultiplayerPeer.xml
+++ b/doc/classes/NetworkedMultiplayerPeer.xml
@@ -7,7 +7,7 @@
Manages the connection to network peers. Assigns unique IDs to each client connected to the server.
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/networking/high_level_multiplayer.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/networking/high_level_multiplayer.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/Node.xml b/doc/classes/Node.xml
index 0fe576a39d..8bae412053 100644
--- a/doc/classes/Node.xml
+++ b/doc/classes/Node.xml
@@ -17,7 +17,7 @@
[b]Networking with nodes:[/b] After connecting to a server (or making one, see [NetworkedMultiplayerENet]) it is possible to use the built-in RPC (remote procedure call) system to communicate over the network. By calling [method rpc] with a method name, it will be called locally and in all connected peers (peers = clients and the server that accepts connections). To identify which node receives the RPC call Godot will use its [NodePath] (make sure node names are the same on all peers). Also take a look at the high-level networking tutorial and corresponding demos.
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/getting_started/step_by_step/scenes_and_nodes.html
+ <link>http://docs.godotengine.org/en/3.0/getting_started/step_by_step/scenes_and_nodes.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/Node2D.xml b/doc/classes/Node2D.xml
index a61678041f..13eabeca17 100644
--- a/doc/classes/Node2D.xml
+++ b/doc/classes/Node2D.xml
@@ -7,7 +7,7 @@
A 2D game object, with a position, rotation and scale. All 2D physics nodes and sprites inherit from Node2D. Use Node2D as a parent node to move, scale and rotate children in a 2D project. Also gives control on the node's render order.
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/2d/custom_drawing_in_2d.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/2d/custom_drawing_in_2d.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/Object.xml b/doc/classes/Object.xml
index 0717836366..ab49bc468c 100644
--- a/doc/classes/Object.xml
+++ b/doc/classes/Object.xml
@@ -16,7 +16,7 @@
</demos>
<methods>
<method name="_get" qualifiers="virtual">
- <return type="void">
+ <return type="Variant">
</return>
<argument index="0" name="property" type="String">
</argument>
diff --git a/doc/classes/OmniLight.xml b/doc/classes/OmniLight.xml
index 0ed133f52e..ff2e77ffbe 100644
--- a/doc/classes/OmniLight.xml
+++ b/doc/classes/OmniLight.xml
@@ -7,7 +7,7 @@
An OmniDirectional light is a type of [Light] node that emits lights in all directions. The light is attenuated through the distance and this attenuation can be configured by changing the energy, radius and attenuation parameters of [Light].
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/3d/lights_and_shadows.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/3d/lights_and_shadows.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/Physics2DDirectSpaceState.xml b/doc/classes/Physics2DDirectSpaceState.xml
index b55702dac4..f0fee77a5a 100644
--- a/doc/classes/Physics2DDirectSpaceState.xml
+++ b/doc/classes/Physics2DDirectSpaceState.xml
@@ -7,7 +7,7 @@
Direct access object to a space in the [Physics2DServer]. It's used mainly to do queries against objects and areas residing in a given space.
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/physics/ray-casting.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/physics/ray-casting.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/PhysicsBody.xml b/doc/classes/PhysicsBody.xml
index e252aaa048..14053c6a35 100644
--- a/doc/classes/PhysicsBody.xml
+++ b/doc/classes/PhysicsBody.xml
@@ -7,7 +7,7 @@
PhysicsBody is an abstract base class for implementing a physics body. All *Body types inherit from it.
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/physics/physics_introduction.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/physics/physics_introduction.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/PhysicsBody2D.xml b/doc/classes/PhysicsBody2D.xml
index 42b1eac5e4..ccc704c7ec 100644
--- a/doc/classes/PhysicsBody2D.xml
+++ b/doc/classes/PhysicsBody2D.xml
@@ -7,7 +7,7 @@
PhysicsBody2D is an abstract base class for implementing a physics body. All *Body2D types inherit from it.
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/physics/physics_introduction.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/physics/physics_introduction.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/PhysicsDirectSpaceState.xml b/doc/classes/PhysicsDirectSpaceState.xml
index fabf153dac..3f0e1a4f70 100644
--- a/doc/classes/PhysicsDirectSpaceState.xml
+++ b/doc/classes/PhysicsDirectSpaceState.xml
@@ -7,7 +7,7 @@
Direct access object to a space in the [PhysicsServer]. It's used mainly to do queries against objects and areas residing in a given space.
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/physics/ray-casting.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/physics/ray-casting.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/Plane.xml b/doc/classes/Plane.xml
index ca035ad383..6f616401cb 100644
--- a/doc/classes/Plane.xml
+++ b/doc/classes/Plane.xml
@@ -7,7 +7,7 @@
Plane represents a normalized plane equation. Basically, "normal" is the normal of the plane (a,b,c normalized), and "d" is the distance from the origin to the plane (in the direction of "normal"). "Over" or "Above" the plane is considered the side of the plane towards where the normal is pointing.
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/math/index.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/math/index.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/PopupMenu.xml b/doc/classes/PopupMenu.xml
index 166a4be2b0..89d8c43c00 100644
--- a/doc/classes/PopupMenu.xml
+++ b/doc/classes/PopupMenu.xml
@@ -303,6 +303,14 @@
Return whether the item is a separator. If it is, it would be displayed as a line.
</description>
</method>
+ <method name="is_item_shortcut_disabled" qualifiers="const">
+ <return type="bool">
+ </return>
+ <argument index="0" name="idx" type="int">
+ </argument>
+ <description>
+ </description>
+ </method>
<method name="remove_item">
<return type="void">
</return>
@@ -433,6 +441,16 @@
<description>
</description>
</method>
+ <method name="set_item_shortcut_disabled">
+ <return type="void">
+ </return>
+ <argument index="0" name="idx" type="int">
+ </argument>
+ <argument index="1" name="disabled" type="bool">
+ </argument>
+ <description>
+ </description>
+ </method>
<method name="set_item_submenu">
<return type="void">
</return>
diff --git a/doc/classes/ProjectSettings.xml b/doc/classes/ProjectSettings.xml
index 44bba8bd20..666f6b4710 100644
--- a/doc/classes/ProjectSettings.xml
+++ b/doc/classes/ProjectSettings.xml
@@ -156,6 +156,536 @@
</description>
</method>
</methods>
+ <members>
+ <member name="application/boot_splash/fullsize" type="bool" setter="" getter="">
+ Scale the boot splash image to the full window length when engine starts (will leave it as default pixel size otherwise).
+ </member>
+ <member name="application/boot_splash/image" type="String" setter="" getter="">
+ Path to an image used for boot splash.
+ </member>
+ <member name="application/config/custom_user_dir_name" type="String" setter="" getter="">
+ This directory is used for storing persistent data (user:// filesystem). If a custom name is set, then system paths will be used to store this on Desktop (AppData on Windows, user ~/.config on Unixes, etc), else the Godot config folder is used. This name needs to be unique, and it's recommended to set it to something before publishing.
+ the "use_custom_user_dir" setting must be enabled for this to take effect.
+ </member>
+ <member name="application/config/icon" type="String" setter="" getter="">
+ Icon used for the project, set when project loads. Exporters will use this icon when possible to.
+ </member>
+ <member name="application/config/name" type="String" setter="" getter="">
+ Name of the project. It is used from both project manager and by the exporters. Overriding this as name.locale allows setting it in multiple languages.
+ </member>
+ <member name="application/config/use_custom_user_dir" type="bool" setter="" getter="">
+ Allow the project to save to it's own custom user dir (in AppData on windows or ~/.config on unixes). This setting only works for desktop exporters. A name must be set in the "custom_user_dir_name" setting for this to take effect.
+ </member>
+ <member name="application/run/disable_stderr" type="bool" setter="" getter="">
+ Disable printing to stderr on exported build.
+ </member>
+ <member name="application/run/disable_stdout" type="bool" setter="" getter="">
+ Disable printing to stdout on exported build.
+ </member>
+ <member name="application/run/frame_delay_msec" type="int" setter="" getter="">
+ Force a delay between frames in the main loop. This may be useful if you plan to disable vsync.
+ </member>
+ <member name="application/run/low_processor_mode" type="bool" setter="" getter="">
+ Turn on low processor mode. This setting only works on desktops. The screen is not redrawn if nothing changes visually. This is meant for writing applications and editors, but is pretty useless (and can hurt performance) on games.
+ </member>
+ <member name="application/run/low_processor_mode_sleep_usec" type="int" setter="" getter="">
+ Amount of sleeping between frames when the low_processor_mode is enabled. This effectively reduces CPU usage when this mode is enabled.
+ </member>
+ <member name="application/run/main_scene" type="String" setter="" getter="">
+ Path to the main scene file that will be loaded when the project runs.
+ </member>
+ <member name="audio/channel_disable_threshold_db" type="float" setter="" getter="">
+ Audio buses will disable automatically when sound goes below a given DB threshold for a given time. This saves CPU as effects assigned to that bus will no longer do any processing.
+ </member>
+ <member name="audio/channel_disable_time" type="float" setter="" getter="">
+ Audio buses will disable automatically when sound goes below a given DB threshold for a given time. This saves CPU as effects assigned to that bus will no longer do any processing.
+ </member>
+ <member name="audio/driver" type="String" setter="" getter="">
+ </member>
+ <member name="audio/mix_rate" type="int" setter="" getter="">
+ Mix rate used for audio. In general, it's better to not touch this and leave it to the host operating system.
+ </member>
+ <member name="audio/output_latency" type="int" setter="" getter="">
+ </member>
+ <member name="audio/video_delay_compensation_ms" type="int" setter="" getter="">
+ Setting to harcode audio delay when playing video. Best to leave this untouched unless you know what you are doing.
+ </member>
+ <member name="compression/formats/gzip/compression_level" type="int" setter="" getter="">
+ Default compression level for gzip. Affects compressed scenes and resources.
+ </member>
+ <member name="compression/formats/zlib/compression_level" type="int" setter="" getter="">
+ Default compression level for zlib. Affects compressed scenes and resources.
+ </member>
+ <member name="compression/formats/zstd/compression_level" type="int" setter="" getter="">
+ Default compression level for zstd. Affects compressed scenes and resources.
+ </member>
+ <member name="compression/formats/zstd/long_distance_matching" type="bool" setter="" getter="">
+ Enable long distance matching in zstd.
+ </member>
+ <member name="compression/formats/zstd/window_log_size" type="int" setter="" getter="">
+ </member>
+ <member name="debug/settings/crash_handler/message" type="String" setter="" getter="">
+ </member>
+ <member name="debug/settings/fps/force_fps" type="int" setter="" getter="">
+ </member>
+ <member name="debug/settings/gdscript/max_call_stack" type="int" setter="" getter="">
+ Maximum call stack allowed for debugging GDScript.
+ </member>
+ <member name="debug/settings/profiler/max_functions" type="int" setter="" getter="">
+ Maximum amount of functions per frame allowed when profiling.
+ </member>
+ <member name="debug/settings/stdout/print_fps" type="bool" setter="" getter="">
+ Print frames per second to stdout. Not very useful in general.
+ </member>
+ <member name="debug/settings/stdout/verbose_stdout" type="bool" setter="" getter="">
+ Print more information to stdout when running. It shows info such as memory leaks, which scenes and resources are being loaded, etc.
+ </member>
+ <member name="debug/settings/visual_script/max_call_stack" type="int" setter="" getter="">
+ Maximum call stack in visual scripting, to avoid infinite recursion.
+ </member>
+ <member name="display/mouse_cursor/custom_image" type="String" setter="" getter="">
+ Custom image for the mouse cursor.
+ </member>
+ <member name="display/mouse_cursor/custom_image_hotspot" type="Vector2" setter="" getter="">
+ Hotspot for the custom mouse cursor image.
+ </member>
+ <member name="display/window/allow_per_pixel_transparency" type="bool" setter="" getter="">
+ Allow per pixel transparency in a Desktop window. This affects performance if not needed, so leave it off.
+ </member>
+ <member name="display/window/dpi/allow_hidpi" type="bool" setter="" getter="">
+ Allow HiDPI display on Windows and OSX. On Desktop Linux, this can't be enabled or disabled.
+ </member>
+ <member name="display/window/energy_saving/keep_screen_on" type="bool" setter="" getter="">
+ Force keep the screen on, so the screensaver does not take over. Works on Desktop and Mobile.
+ </member>
+ <member name="display/window/handheld/orientation" type="String" setter="" getter="">
+ Default orientation for cell phone or tablet.
+ </member>
+ <member name="display/window/per_pixel_transparency" type="bool" setter="" getter="">
+ </member>
+ <member name="display/window/per_pixel_transparency_splash" type="bool" setter="" getter="">
+ </member>
+ <member name="display/window/size/always_on_top" type="bool" setter="" getter="">
+ Force the window to be always on top.
+ </member>
+ <member name="display/window/size/borderless" type="bool" setter="" getter="">
+ Force the window to be borderless.
+ </member>
+ <member name="display/window/size/fullscreen" type="bool" setter="" getter="">
+ Set the window to full screen when it starts.
+ </member>
+ <member name="display/window/size/height" type="int" setter="" getter="">
+ Set the main window height. On desktop, this is the default window size. Stretch mode settings use this also as a reference when enabled.
+ </member>
+ <member name="display/window/size/resizable" type="bool" setter="" getter="">
+ Allow the window to be resizable by default.
+ </member>
+ <member name="display/window/size/test_height" type="int" setter="" getter="">
+ Test a different height for the window. The main use for this is to test with stretch modes.
+ </member>
+ <member name="display/window/size/test_width" type="int" setter="" getter="">
+ Test a different width for the window. The main use for this is to test with stretch modes.
+ </member>
+ <member name="display/window/size/width" type="int" setter="" getter="">
+ Set the main window width. On desktop, this is the default window size. Stretch mode settings use this also as a reference when enabled.
+ </member>
+ <member name="display/window/vsync/use_vsync" type="bool" setter="" getter="">
+ Use VSync. Don't be stupid, don't turn this off.
+ </member>
+ <member name="editor/active" type="bool" setter="" getter="">
+ Internal editor setting, don't touch.
+ </member>
+ <member name="gui/common/default_scroll_deadzone" type="int" setter="" getter="">
+ </member>
+ <member name="gui/common/swap_ok_cancel" type="bool" setter="" getter="">
+ Enable swap OK and Cancel buttons on dialogs. This is because Windows/MacOS/Desktop Linux may use them in different order, so the GUI swaps them depending on the host OS. Disable this behavior by turning this setting off.
+ </member>
+ <member name="gui/theme/custom" type="String" setter="" getter="">
+ Use a custom theme resource, set a path to it here.
+ </member>
+ <member name="gui/theme/custom_font" type="String" setter="" getter="">
+ USe a custom default font resource, set a path to it here.
+ </member>
+ <member name="gui/theme/use_hidpi" type="bool" setter="" getter="">
+ Make sure the theme used works with hidpi.
+ </member>
+ <member name="gui/timers/incremental_search_max_interval_msec" type="int" setter="" getter="">
+ Timer setting for incremental search in Tree, IntemList, etc. controls.
+ </member>
+ <member name="gui/timers/text_edit_idle_detect_sec" type="int" setter="" getter="">
+ Timer for detecting idle in the editor.
+ </member>
+ <member name="input/ui_accept" type="Array" setter="" getter="">
+ </member>
+ <member name="input/ui_cancel" type="Array" setter="" getter="">
+ </member>
+ <member name="input/ui_down" type="Array" setter="" getter="">
+ </member>
+ <member name="input/ui_end" type="Array" setter="" getter="">
+ </member>
+ <member name="input/ui_focus_next" type="Array" setter="" getter="">
+ </member>
+ <member name="input/ui_focus_prev" type="Array" setter="" getter="">
+ </member>
+ <member name="input/ui_home" type="Array" setter="" getter="">
+ </member>
+ <member name="input/ui_left" type="Array" setter="" getter="">
+ </member>
+ <member name="input/ui_page_down" type="Array" setter="" getter="">
+ </member>
+ <member name="input/ui_page_up" type="Array" setter="" getter="">
+ </member>
+ <member name="input/ui_right" type="Array" setter="" getter="">
+ </member>
+ <member name="input/ui_select" type="Array" setter="" getter="">
+ </member>
+ <member name="input/ui_up" type="Array" setter="" getter="">
+ </member>
+ <member name="input_devices/pointing/emulate_mouse_from_touch" type="bool" setter="" getter="">
+ </member>
+ <member name="input_devices/pointing/emulate_touch_from_mouse" type="bool" setter="" getter="">
+ </member>
+ <member name="layer_names/2d_physics/layer_1" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/2d_physics/layer_10" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/2d_physics/layer_11" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/2d_physics/layer_12" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/2d_physics/layer_13" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/2d_physics/layer_14" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/2d_physics/layer_15" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/2d_physics/layer_16" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/2d_physics/layer_17" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/2d_physics/layer_18" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/2d_physics/layer_19" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/2d_physics/layer_2" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/2d_physics/layer_20" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/2d_physics/layer_3" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/2d_physics/layer_4" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/2d_physics/layer_5" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/2d_physics/layer_6" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/2d_physics/layer_7" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/2d_physics/layer_8" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/2d_physics/layer_9" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/2d_render/layer_1" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/2d_render/layer_10" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/2d_render/layer_11" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/2d_render/layer_12" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/2d_render/layer_13" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/2d_render/layer_14" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/2d_render/layer_15" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/2d_render/layer_16" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/2d_render/layer_17" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/2d_render/layer_18" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/2d_render/layer_19" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/2d_render/layer_2" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/2d_render/layer_20" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/2d_render/layer_3" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/2d_render/layer_4" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/2d_render/layer_5" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/2d_render/layer_6" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/2d_render/layer_7" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/2d_render/layer_8" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/2d_render/layer_9" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/3d_physics/layer_1" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/3d_physics/layer_10" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/3d_physics/layer_11" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/3d_physics/layer_12" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/3d_physics/layer_13" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/3d_physics/layer_14" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/3d_physics/layer_15" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/3d_physics/layer_16" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/3d_physics/layer_17" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/3d_physics/layer_18" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/3d_physics/layer_19" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/3d_physics/layer_2" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/3d_physics/layer_20" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/3d_physics/layer_3" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/3d_physics/layer_4" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/3d_physics/layer_5" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/3d_physics/layer_6" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/3d_physics/layer_7" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/3d_physics/layer_8" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/3d_physics/layer_9" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/3d_render/layer_1" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/3d_render/layer_10" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/3d_render/layer_11" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/3d_render/layer_12" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/3d_render/layer_13" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/3d_render/layer_14" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/3d_render/layer_15" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/3d_render/layer_16" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/3d_render/layer_17" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/3d_render/layer_18" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/3d_render/layer_19" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/3d_render/layer_2" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/3d_render/layer_20" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/3d_render/layer_3" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/3d_render/layer_4" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/3d_render/layer_5" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/3d_render/layer_6" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/3d_render/layer_7" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/3d_render/layer_8" type="String" setter="" getter="">
+ </member>
+ <member name="layer_names/3d_render/layer_9" type="String" setter="" getter="">
+ </member>
+ <member name="locale/fallback" type="String" setter="" getter="">
+ </member>
+ <member name="locale/test" type="String" setter="" getter="">
+ </member>
+ <member name="logging/file_logging/enable_file_logging" type="bool" setter="" getter="">
+ Log all output to a file.
+ </member>
+ <member name="logging/file_logging/log_path" type="String" setter="" getter="">
+ Path to logs withint he project. Using an user:// based path is recommended.
+ </member>
+ <member name="logging/file_logging/max_log_files" type="int" setter="" getter="">
+ Amount of log files (used for rotation)/
+ </member>
+ <member name="memory/limits/message_queue/max_size_kb" type="int" setter="" getter="">
+ 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.
+ </member>
+ <member name="memory/limits/multithreaded_server/rid_pool_prealloc" type="int" setter="" getter="">
+ This is used by servers when used in multi threading mode (servers and visual). RIDs are preallocated to avoid stalling the server requesting them on threads. If servers get stalled too often when loading resources in a thread, increase this number.
+ </member>
+ <member name="network/limits/debugger_stdout/max_chars_per_second" type="int" setter="" getter="">
+ 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.
+ </member>
+ <member name="network/limits/debugger_stdout/max_errors_per_frame" type="int" setter="" getter="">
+ Maximum amount of errors allowed to send as output from the debugger. Over this value, content is dropped. This helps not to stall the debugger connection.
+ </member>
+ <member name="network/limits/debugger_stdout/max_messages_per_frame" type="int" setter="" getter="">
+ Maximum amount of messages allowed to send as output from the debugger. Over this value, content is dropped. This helps not to stall the debugger connection.
+ </member>
+ <member name="network/limits/packet_peer_stream/max_buffer_po2" type="int" setter="" getter="">
+ Default size of packet peer stream for deserializing godot data. Over this size, data is dropped.
+ </member>
+ <member name="network/remote_fs/max_pages" type="int" setter="" getter="">
+ Maximum amount of pages used for remote filesystem (used by debugging).
+ </member>
+ <member name="network/remote_fs/page_read_ahead" type="int" setter="" getter="">
+ Amount of read ahead used by remote filesystem. Improves latency.
+ </member>
+ <member name="network/remote_fs/page_size" type="int" setter="" getter="">
+ Page size used by remote filesystem.
+ </member>
+ <member name="network/ssl/certificates" type="String" setter="" getter="">
+ If your game or application uses HTTPS, a certificates file is needed. It must be set here.
+ </member>
+ <member name="node/name_casing" type="int" setter="" getter="">
+ When creating nodes names automatically, set the type of casing in this project. This is mostly an editor setting.
+ </member>
+ <member name="node/name_num_separator" type="int" setter="" getter="">
+ What to use to separate node name from number. This is mostly an editor setting.
+ </member>
+ <member name="physics/2d/physics_engine" type="String" setter="" getter="">
+ </member>
+ <member name="physics/2d/thread_model" type="int" setter="" getter="">
+ Set 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 only physics process.
+ </member>
+ <member name="physics/3d/physics_engine" type="String" setter="" getter="">
+ </member>
+ <member name="physics/common/physics_fps" type="int" setter="" getter="">
+ Frames per second used in the physics. Physics always needs a fixed amount of frames per second.
+ </member>
+ <member name="physics/common/physics_jitter_fix" type="float" setter="" getter="">
+ Fix to improve physics jitter, specially on monitors where refresh rate is different than physics FPS.
+ </member>
+ <member name="rendering/environment/default_clear_color" type="Color" setter="" getter="">
+ Default background clear color.
+ </member>
+ <member name="rendering/limits/buffers/blend_shape_max_buffer_size_kb" type="int" setter="" getter="">
+ Max buffer size for blend shapes. Any blend shape bigger than this will not work.
+ </member>
+ <member name="rendering/limits/buffers/canvas_polygon_buffer_size_kb" type="int" setter="" getter="">
+ Max buffer size for drawing polygons. Any polygon bigger than this will not work.
+ </member>
+ <member name="rendering/limits/buffers/canvas_polygon_index_buffer_size_kb" type="int" setter="" getter="">
+ Max index buffer size for drawing polygons. Any polygon bigger than this will not work.
+ </member>
+ <member name="rendering/limits/buffers/immediate_buffer_size_kb" type="int" setter="" getter="">
+ Max buffer size for drawing immediate objects (ImmediateGeometry nodes). Nodes using more than this size will not work.
+ </member>
+ <member name="rendering/limits/rendering/max_renderable_elements" type="int" setter="" getter="">
+ 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 mesh themselves.
+ </member>
+ <member name="rendering/limits/time/time_rollover_secs" type="int" setter="" getter="">
+ Shaders have a time variable that constantly increases. At some point it needs to be rolled back to zero to avoid numerical errors on shader animations. This setting specifies when.
+ </member>
+ <member name="rendering/quality/2d/use_pixel_snap" type="bool" setter="" getter="">
+ Force snapping of polygons to pixels in 2D rendering. May help in some pixel art styles.
+ </member>
+ <member name="rendering/quality/depth_prepass/disable_for_vendors" type="String" setter="" getter="">
+ Disable depth pre-pass for some GPU vendors (usually mobile), as their architecture already does this.
+ </member>
+ <member name="rendering/quality/depth_prepass/enable" type="bool" setter="" getter="">
+ Do a previous depth pass before rendering materials. This increases performance in scenes with high overdraw, when complex materials and lighting are used.
+ </member>
+ <member name="rendering/quality/directional_shadow/size" type="int" setter="" getter="">
+ Size in pixels of the directional shadow.
+ </member>
+ <member name="rendering/quality/directional_shadow/size.mobile" type="int" setter="" getter="">
+ </member>
+ <member name="rendering/quality/driver/driver_name" type="String" setter="" getter="">
+ </member>
+ <member name="rendering/quality/filters/anisotropic_filter_level" type="int" setter="" getter="">
+ Maximum Anisotropic filter level used for textures when anisotropy enabled.
+ </member>
+ <member name="rendering/quality/filters/use_nearest_mipmap_filter" type="bool" setter="" getter="">
+ Force to use nearest mipmap filtering when using mipmaps. This may increase performance in mobile as less memory bandwidth is used.
+ </member>
+ <member name="rendering/quality/intended_usage/framebuffer_allocation" type="int" setter="" getter="">
+ Strategy used for framebuffer allocation. The simpler it is, the less memory it uses (but the least features it supports).
+ </member>
+ <member name="rendering/quality/intended_usage/framebuffer_allocation.mobile" type="int" setter="" getter="">
+ </member>
+ <member name="rendering/quality/intended_usage/framebuffer_mode" type="int" setter="" getter="">
+ </member>
+ <member name="rendering/quality/reflections/high_quality_ggx" type="bool" setter="" getter="">
+ For reflection probes and panorama backgrounds (sky), use a high amount of samples to create ggx blurred versions (used for roughness).
+ </member>
+ <member name="rendering/quality/reflections/high_quality_ggx.mobile" type="bool" setter="" getter="">
+ </member>
+ <member name="rendering/quality/reflections/texture_array_reflections" type="bool" setter="" getter="">
+ For reflection probes and panorama backgrounds (sky), use a texure array instead of mipmaps. This reduces jitter noise on reflections, but costs more performance and memory.
+ </member>
+ <member name="rendering/quality/reflections/texture_array_reflections.mobile" type="bool" setter="" getter="">
+ </member>
+ <member name="rendering/quality/shading/force_vertex_shading" type="bool" setter="" getter="">
+ Force vertex shading for all rendering. This can increase performance a lot, but also reduces quality inmensely. Can work to optimize on very low end mobile.
+ </member>
+ <member name="rendering/quality/shading/force_vertex_shading.mobile" type="bool" setter="" getter="">
+ </member>
+ <member name="rendering/quality/shadow_atlas/quadrant_0_subdiv" type="int" setter="" getter="">
+ Subdivision quadrant size for shadow mapping. See shadow mapping documentation.
+ </member>
+ <member name="rendering/quality/shadow_atlas/quadrant_1_subdiv" type="int" setter="" getter="">
+ Subdivision quadrant size for shadow mapping. See shadow mapping documentation.
+ </member>
+ <member name="rendering/quality/shadow_atlas/quadrant_2_subdiv" type="int" setter="" getter="">
+ Subdivision quadrant size for shadow mapping. See shadow mapping documentation.
+ </member>
+ <member name="rendering/quality/shadow_atlas/quadrant_3_subdiv" type="int" setter="" getter="">
+ Subdivision quadrant size for shadow mapping. See shadow mapping documentation.
+ </member>
+ <member name="rendering/quality/shadow_atlas/size" type="int" setter="" getter="">
+ Size for shadow atlas (used for point and omni lights). See documentation.
+ </member>
+ <member name="rendering/quality/shadow_atlas/size.mobile" type="int" setter="" getter="">
+ </member>
+ <member name="rendering/quality/shadows/filter_mode" type="int" setter="" getter="">
+ Shadow filter mode. The more complex the filter, the more memory bandwidth required.
+ </member>
+ <member name="rendering/quality/shadows/filter_mode.mobile" type="int" setter="" getter="">
+ </member>
+ <member name="rendering/quality/subsurface_scattering/follow_surface" type="bool" setter="" getter="">
+ Improves quality of subsurface scattering, but cost significantly increases.
+ </member>
+ <member name="rendering/quality/subsurface_scattering/quality" type="int" setter="" getter="">
+ Quality setting for subsurface scaterring (samples taken).
+ </member>
+ <member name="rendering/quality/subsurface_scattering/scale" type="int" setter="" getter="">
+ </member>
+ <member name="rendering/quality/subsurface_scattering/weight_samples" type="bool" setter="" getter="">
+ Weight subsurface scattering samples. Helps to avoid reading samples from unrelated parts of the screen.
+ </member>
+ <member name="rendering/quality/voxel_cone_tracing/high_quality" type="bool" setter="" getter="">
+ Use high quality voxel cone tracing (looks better, but requires a higher end GPU).
+ </member>
+ <member name="rendering/threads/thread_model" type="int" setter="" getter="">
+ Thread model for rendering. Rendering on a thread can vastly improve performance, but syncinc to the main thread can cause a bit more jitter.
+ </member>
+ <member name="rendering/vram_compression/import_etc" type="bool" setter="" getter="">
+ If the project uses this compression (usually low end mobile), texture importer will import these.
+ </member>
+ <member name="rendering/vram_compression/import_etc2" type="bool" setter="" getter="">
+ If the project uses this compression (usually high end mobile), texture importer will import these.
+ </member>
+ <member name="rendering/vram_compression/import_pvrtc" type="bool" setter="" getter="">
+ If the project uses this compression (usually iOS), texture importer will import these.
+ </member>
+ <member name="rendering/vram_compression/import_s3tc" type="bool" setter="" getter="">
+ If the project uses this compression (usually Desktop and Consoles), texture importer will import these.
+ </member>
+ <member name="script" type="Script" setter="" getter="">
+ </member>
+ </members>
<constants>
</constants>
</class>
diff --git a/doc/classes/Quat.xml b/doc/classes/Quat.xml
index 589f7d00c6..f1a6ce5c0b 100644
--- a/doc/classes/Quat.xml
+++ b/doc/classes/Quat.xml
@@ -10,8 +10,8 @@
Quaternions need to be (re)normalized.
</description>
<tutorials>
- http://docs.godotengine.org/en/latest/tutorials/3d/using_transforms.html#interpolating-with-quaternions
- http://docs.godotengine.org/en/latest/tutorials/math/rotations.html
+ <link>http://docs.godotengine.org/en/latest/tutorials/3d/using_transforms.html#interpolating-with-quaternions</link>
+ <link>http://docs.godotengine.org/en/latest/tutorials/math/rotations.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/Rect2.xml b/doc/classes/Rect2.xml
index 1961aee8b5..c21106074b 100644
--- a/doc/classes/Rect2.xml
+++ b/doc/classes/Rect2.xml
@@ -7,7 +7,7 @@
Rect2 consists of a position, a size, and several utility functions. It is typically used for fast overlap tests.
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/math/index.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/math/index.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/ReflectionProbe.xml b/doc/classes/ReflectionProbe.xml
index 36a0c9cfda..a9a897ebaf 100644
--- a/doc/classes/ReflectionProbe.xml
+++ b/doc/classes/ReflectionProbe.xml
@@ -5,7 +5,7 @@
<description>
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/3d/reflection_probes.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/3d/reflection_probes.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/RichTextLabel.xml b/doc/classes/RichTextLabel.xml
index 4ec4bbee4f..618f2f42b2 100644
--- a/doc/classes/RichTextLabel.xml
+++ b/doc/classes/RichTextLabel.xml
@@ -8,7 +8,7 @@
Note that assignments to [member bbcode_text] clear the tag stack and reconstruct it from the property's contents. Any edits made to [member bbcode_text] will erase previous edits made from other manual sources such as [method append_bbcode] and the [code]push_*[/code] / [method pop] methods.
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/gui/bbcode_in_richtextlabel.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/gui/bbcode_in_richtextlabel.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/RigidBody.xml b/doc/classes/RigidBody.xml
index 3190aed5ed..4253560f67 100644
--- a/doc/classes/RigidBody.xml
+++ b/doc/classes/RigidBody.xml
@@ -10,7 +10,7 @@
If you need to override the default physics behavior, you can write a custom force integration. See [member custom_integrator].
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/physics/physics_introduction.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/physics/physics_introduction.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/SceneTree.xml b/doc/classes/SceneTree.xml
index 7c8feae5b3..f5a19ede0c 100644
--- a/doc/classes/SceneTree.xml
+++ b/doc/classes/SceneTree.xml
@@ -7,8 +7,8 @@
As one of the most important classes, the [code]SceneTree[/code] manages the hierarchy of nodes in a scene as well as scenes themselves. Nodes can be added, retrieved and removed. The whole scene tree (and thus the current scene) can be paused. Scenes can be loaded, switched and reloaded. You can also use the SceneTree to organize your nodes into groups: every node can be assigned as many groups as you want to create, e.g. a "enemy" group. You can then iterate these groups or even call methods and set properties on all the group's members at once.
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/getting_started/step_by_step/scene_tree.html
- http://docs.godotengine.org/en/3.0/tutorials/viewports/multiple_resolutions.html
+ <link>http://docs.godotengine.org/en/3.0/getting_started/step_by_step/scene_tree.html</link>
+ <link>http://docs.godotengine.org/en/3.0/tutorials/viewports/multiple_resolutions.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/Script.xml b/doc/classes/Script.xml
index 97f6a60f01..09c60afc2f 100644
--- a/doc/classes/Script.xml
+++ b/doc/classes/Script.xml
@@ -8,7 +8,7 @@
The 'new' method of a script subclass creates a new instance. [method Object.set_script] extends an existing object, if that object's class matches one of the script's base classes.
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/getting_started/step_by_step/scripting.html
+ <link>http://docs.godotengine.org/en/3.0/getting_started/step_by_step/scripting.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/ScrollContainer.xml b/doc/classes/ScrollContainer.xml
index 3a99a203ae..02f58a88cb 100644
--- a/doc/classes/ScrollContainer.xml
+++ b/doc/classes/ScrollContainer.xml
@@ -11,6 +11,18 @@
<demos>
</demos>
<methods>
+ <method name="get_h_scrollbar">
+ <return type="HScrollBar">
+ </return>
+ <description>
+ </description>
+ </method>
+ <method name="get_v_scrollbar">
+ <return type="VScrollBar">
+ </return>
+ <description>
+ </description>
+ </method>
</methods>
<members>
<member name="scroll_deadzone" type="int" setter="set_deadzone" getter="get_deadzone">
diff --git a/doc/classes/Shader.xml b/doc/classes/Shader.xml
index 7c07778a05..76049d8947 100644
--- a/doc/classes/Shader.xml
+++ b/doc/classes/Shader.xml
@@ -7,7 +7,7 @@
This class allows you to define a custom shader program that can be used for various materials to render objects.
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/shading/index.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/shading/index.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/Shape.xml b/doc/classes/Shape.xml
index 582e4f80c3..fcd01bc25a 100644
--- a/doc/classes/Shape.xml
+++ b/doc/classes/Shape.xml
@@ -7,7 +7,7 @@
Base class for all 3D shape resources. All 3D shapes that inherit from this can be set into a [PhysicsBody] or [Area].
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/physics/physics_introduction.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/physics/physics_introduction.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/Shape2D.xml b/doc/classes/Shape2D.xml
index ad20bf607a..6c13496fc4 100644
--- a/doc/classes/Shape2D.xml
+++ b/doc/classes/Shape2D.xml
@@ -7,7 +7,7 @@
Base class for all 2D Shapes. All 2D shape types inherit from this.
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/physics/physics_introduction.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/physics/physics_introduction.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/Spatial.xml b/doc/classes/Spatial.xml
index 9ef60109de..46f2bedfc2 100644
--- a/doc/classes/Spatial.xml
+++ b/doc/classes/Spatial.xml
@@ -9,7 +9,7 @@
Affine operations (rotate, scale, translate) happen in parent's local coordinate system, unless the Spatial object is set as top level. Affine operations in this coordinate system correspond to direct affine operations on the Spatial's transform. The word local below refers to this coordinate system. The coordinate system that is attached to the Spatial object itself is referred to as object-local coordinate system.
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/3d/introduction_to_3d.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/3d/introduction_to_3d.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/SpatialMaterial.xml b/doc/classes/SpatialMaterial.xml
index 5feaf70e9d..b45f2a13d4 100644
--- a/doc/classes/SpatialMaterial.xml
+++ b/doc/classes/SpatialMaterial.xml
@@ -5,7 +5,7 @@
<description>
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/3d/spatial_material.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/3d/spatial_material.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/SpotLight.xml b/doc/classes/SpotLight.xml
index 57a802d325..1f81e9e5c2 100644
--- a/doc/classes/SpotLight.xml
+++ b/doc/classes/SpotLight.xml
@@ -7,7 +7,7 @@
A SpotLight light is a type of [Light] node that emits lights in a specific direction, in the shape of a cone. The light is attenuated through the distance and this attenuation can be configured by changing the energy, radius and attenuation parameters of [Light]. TODO: Image of a spotlight.
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/3d/lights_and_shadows.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/3d/lights_and_shadows.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/StreamPeerSSL.xml b/doc/classes/StreamPeerSSL.xml
index d7350ac1d5..3081abd5c4 100644
--- a/doc/classes/StreamPeerSSL.xml
+++ b/doc/classes/StreamPeerSSL.xml
@@ -7,7 +7,7 @@
SSL Stream peer. This object can be used to connect to SSL servers.
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/networking/ssl_certificates.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/networking/ssl_certificates.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/TileMap.xml b/doc/classes/TileMap.xml
index 5af29d96cd..656063771d 100644
--- a/doc/classes/TileMap.xml
+++ b/doc/classes/TileMap.xml
@@ -7,7 +7,7 @@
Node for 2D tile-based maps. Tilemaps use a [TileSet] which contain a list of tiles (textures plus optional collision, navigation, and/or occluder shapes) which are used to create grid-based maps.
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/2d/using_tilemaps.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/2d/using_tilemaps.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/Transform.xml b/doc/classes/Transform.xml
index 4567f1681c..0dd8038b36 100644
--- a/doc/classes/Transform.xml
+++ b/doc/classes/Transform.xml
@@ -7,8 +7,8 @@
Represents one or many transformations in 3D space such as translation, rotation, or scaling. It consists of a [Basis] "basis" and an [Vector3] "origin". It is similar to a 3x4 matrix.
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/math/index.html
- http://docs.godotengine.org/en/latest/tutorials/3d/using_transforms.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/math/index.html</link>
+ <link>http://docs.godotengine.org/en/latest/tutorials/3d/using_transforms.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/Tween.xml b/doc/classes/Tween.xml
index 2332c1a7aa..d82694d328 100644
--- a/doc/classes/Tween.xml
+++ b/doc/classes/Tween.xml
@@ -181,6 +181,12 @@
Returns [code]true[/code] if any tweens are currently running. Note that this method doesn't consider tweens that have ended.
</description>
</method>
+ <method name="is_stopped" qualifiers="const">
+ <return type="bool">
+ </return>
+ <description>
+ </description>
+ </method>
<method name="remove">
<return type="bool">
</return>
diff --git a/doc/classes/Vector2.xml b/doc/classes/Vector2.xml
index 923be94db9..26e2da09d6 100644
--- a/doc/classes/Vector2.xml
+++ b/doc/classes/Vector2.xml
@@ -7,7 +7,7 @@
2-element structure that can be used to represent positions in 2d space or any other pair of numeric values.
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/math/index.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/math/index.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/Vector3.xml b/doc/classes/Vector3.xml
index edd0965b64..c754b27f1e 100644
--- a/doc/classes/Vector3.xml
+++ b/doc/classes/Vector3.xml
@@ -7,7 +7,7 @@
Vector3 is one of the core classes of the engine, and includes several built-in helper functions to perform basic vector math operations.
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/math/index.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/math/index.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/Viewport.xml b/doc/classes/Viewport.xml
index 4878f7d932..af0712d357 100644
--- a/doc/classes/Viewport.xml
+++ b/doc/classes/Viewport.xml
@@ -6,14 +6,14 @@
<description>
A Viewport creates a different view into the screen, or a sub-view inside another viewport. Children 2D Nodes will display on it, and children Camera 3D nodes will render on it too.
Optionally, a viewport can have its own 2D or 3D world, so they don't share what they draw with other viewports.
- If a viewport is a child of a [Control], it will automatically take up its same rect and position, otherwise they must be set manually.
+ If a viewport is a child of a [ViewportContainer], it will automatically take up its size, otherwise it must be set manually.
Viewports can also choose to be audio listeners, so they generate positional audio depending on a 2D or 3D camera child of it.
Also, viewports can be assigned to different screens in case the devices have multiple screens.
Finally, viewports can also behave as render targets, in which case they will not be visible unless the associated texture is used to draw.
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/2d/2d_transforms.html
- http://docs.godotengine.org/en/3.0/tutorials/viewports/index.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/2d/2d_transforms.html</link>
+ <link>http://docs.godotengine.org/en/3.0/tutorials/viewports/index.html</link>
</tutorials>
<demos>
</demos>
@@ -276,7 +276,7 @@
Do not update the render target.
</constant>
<constant name="UPDATE_ONCE" value="1" enum="UpdateMode">
- Update the render target once, then switch to [code]UPDATE_DISABLED[/code]
+ Update the render target once, then switch to [code]UPDATE_DISABLED[/code].
</constant>
<constant name="UPDATE_WHEN_VISIBLE" value="2" enum="UpdateMode">
Update the render target only when it is visible. This is the default value.
@@ -329,6 +329,7 @@
Objects are displayed without light information.
</constant>
<constant name="DEBUG_DRAW_OVERDRAW" value="2" enum="DebugDraw">
+ Objected are displayed semi-transparent with additive blending so you can see where they intersect.
</constant>
<constant name="DEBUG_DRAW_WIREFRAME" value="3" enum="DebugDraw">
Objects are displayed in wireframe style.
@@ -353,10 +354,13 @@
<constant name="USAGE_3D_NO_EFFECTS" value="3" enum="Usage">
</constant>
<constant name="CLEAR_MODE_ALWAYS" value="0" enum="ClearMode">
+ Always clear the render target before drawing.
</constant>
<constant name="CLEAR_MODE_NEVER" value="1" enum="ClearMode">
+ Never clear the render target.
</constant>
<constant name="CLEAR_MODE_ONLY_NEXT_FRAME" value="2" enum="ClearMode">
+ Clear the render target next frame, then switch to [code]CLEAR_MODE_NEVER[/code].
</constant>
</constants>
</class>
diff --git a/doc/classes/World.xml b/doc/classes/World.xml
index 9fc0e139b5..540848e40a 100644
--- a/doc/classes/World.xml
+++ b/doc/classes/World.xml
@@ -7,7 +7,7 @@
Class that has everything pertaining to a world. A physics space, a visual scenario and a sound space. Spatial nodes register their resources into the current world.
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/physics/ray-casting.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/physics/ray-casting.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/World2D.xml b/doc/classes/World2D.xml
index 5f6a5b8ad4..780cdd181a 100644
--- a/doc/classes/World2D.xml
+++ b/doc/classes/World2D.xml
@@ -7,7 +7,7 @@
Class that has everything pertaining to a 2D world. A physics space, a visual scenario and a sound space. 2D nodes register their resources into the current 2D world.
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/physics/ray-casting.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/physics/ray-casting.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/WorldEnvironment.xml b/doc/classes/WorldEnvironment.xml
index 422ca3a558..e68ad2800e 100644
--- a/doc/classes/WorldEnvironment.xml
+++ b/doc/classes/WorldEnvironment.xml
@@ -9,7 +9,7 @@
The [code]WorldEnvironment[/code] allows the user to specify default lighting parameters (e.g. ambient lighting), various post-processing effects (e.g. SSAO, DOF, Tonemapping), and how to draw the background (e.g. solid color, skybox). Usually, these are added in order to improve the realism/color balance of the scene.
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/3d/environment_and_post_processing.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/3d/environment_and_post_processing.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/tools/makerst.py b/doc/tools/makerst.py
index 289e967a93..93ad823d42 100755
--- a/doc/tools/makerst.py
+++ b/doc/tools/makerst.py
@@ -4,11 +4,15 @@
import codecs
import sys
import os
+import re
import xml.etree.ElementTree as ET
input_list = []
cur_file = ""
+# http(s)://docs.godotengine.org/<langcode>/<tag>/path/to/page.html(#fragment-tag)
+godot_docs_pattern = re.compile('^http(?:s)?:\/\/docs\.godotengine\.org\/(?:[a-zA-Z0-9\.\-_]*)\/(?:[a-zA-Z0-9\.\-_]*)\/(.*)\.html(#.*)?$')
+
for arg in sys.argv[1:]:
if arg.endswith(os.sep):
arg = arg[:-1]
@@ -588,6 +592,32 @@ def make_rst_class(node):
f.write(make_heading('Description', '-'))
f.write(rstize_text(descr.text.strip(), name) + "\n\n")
+ global godot_docs_pattern
+ tutorials = node.find('tutorials')
+ if tutorials != None and len(tutorials) > 0:
+ f.write(make_heading('Tutorials', '-'))
+ for t in tutorials:
+ link = t.text.strip()
+ match = godot_docs_pattern.search(link);
+ if match:
+ groups = match.groups()
+ if match.lastindex == 2:
+ # Doc reference with fragment identifier: emit direct link to section with reference to page, for example:
+ # `#calling-javascript-from-script in Exporting For Web`
+ f.write("- `" + groups[1] + " <../" + groups[0] + ".html" + groups[1] + ">`_ in :doc:`../" + groups[0] + "`\n")
+ # Commented out alternative: Instead just emit:
+ # `Subsection in Exporting For Web`
+ # f.write("- `Subsection <../" + groups[0] + ".html" + groups[1] + ">`_ in :doc:`../" + groups[0] + "`\n")
+ elif match.lastindex == 1:
+ # Doc reference, for example:
+ # `Math`
+ f.write("- :doc:`../" + groups[0] + "`\n")
+ else:
+ # External link, for example:
+ # `http://enet.bespin.org/usergroup0.html`
+ f.write("- `" + link + " <" + link + ">`_\n")
+ f.write("\n")
+
methods = node.find('methods')
if methods != None and len(list(methods)) > 0:
f.write(make_heading('Member Function Description', '-'))
diff --git a/drivers/gles2/shader_compiler_gles2.cpp b/drivers/gles2/shader_compiler_gles2.cpp
index ad6c2f850a..aa55e72083 100644
--- a/drivers/gles2/shader_compiler_gles2.cpp
+++ b/drivers/gles2/shader_compiler_gles2.cpp
@@ -712,7 +712,7 @@ ShaderCompilerGLES2::ShaderCompilerGLES2() {
actions[VS::SHADER_CANVAS_ITEM].renames["WORLD_MATRIX"] = "modelview_matrix";
actions[VS::SHADER_CANVAS_ITEM].renames["PROJECTION_MATRIX"] = "projection_matrix";
- actions[VS::SHADER_CANVAS_ITEM].renames["EXTRA_MATRIX"] == "extra_matrix";
+ actions[VS::SHADER_CANVAS_ITEM].renames["EXTRA_MATRIX"] = "extra_matrix";
actions[VS::SHADER_CANVAS_ITEM].renames["TIME"] = "time";
actions[VS::SHADER_CANVAS_ITEM].renames["AT_LIGHT_PASS"] = "at_light_pass";
actions[VS::SHADER_CANVAS_ITEM].renames["INSTANCE_CUSTOM"] = "instance_custom";
diff --git a/editor/doc/doc_data.cpp b/editor/doc/doc_data.cpp
index c992ac5f16..542dca74e0 100644
--- a/editor/doc/doc_data.cpp
+++ b/editor/doc/doc_data.cpp
@@ -233,7 +233,12 @@ void DocData::generate(bool p_basic_types) {
c.category = ClassDB::get_category(name);
List<PropertyInfo> properties;
- ClassDB::get_property_list(name, &properties, true);
+ if (name == "ProjectSettings") {
+ //special case for project settings, so settings can be documented
+ ProjectSettings::get_singleton()->get_property_list(&properties);
+ } else {
+ ClassDB::get_property_list(name, &properties, true);
+ }
for (List<PropertyInfo>::Element *E = properties.front(); E; E = E->next()) {
if (E->get().usage & PROPERTY_USAGE_GROUP || E->get().usage & PROPERTY_USAGE_CATEGORY || E->get().usage & PROPERTY_USAGE_INTERNAL)
@@ -810,9 +815,24 @@ Error DocData::_load(Ref<XMLParser> parser) {
if (parser->get_node_type() == XMLParser::NODE_TEXT)
c.description = parser->get_node_data();
} else if (name == "tutorials") {
- parser->read();
- if (parser->get_node_type() == XMLParser::NODE_TEXT)
- c.tutorials = parser->get_node_data();
+ while (parser->read() == OK) {
+
+ if (parser->get_node_type() == XMLParser::NODE_ELEMENT) {
+
+ String name = parser->get_node_name();
+
+ if (name == "link") {
+
+ parser->read();
+ if (parser->get_node_type() == XMLParser::NODE_TEXT)
+ c.tutorials.push_back(parser->get_node_data().strip_edges());
+ } else {
+ ERR_EXPLAIN("Invalid tag in doc file: " + name);
+ ERR_FAIL_V(ERR_FILE_CORRUPT);
+ }
+ } else if (parser->get_node_type() == XMLParser::NODE_ELEMENT_END && parser->get_node_name() == "tutorials")
+ break; //end of <tutorials>
+ }
} else if (name == "demos") {
parser->read();
if (parser->get_node_type() == XMLParser::NODE_TEXT)
@@ -987,7 +1007,9 @@ Error DocData::save_classes(const String &p_default_path, const Map<String, Stri
_write_string(f, 2, c.description.strip_edges().xml_escape());
_write_string(f, 1, "</description>");
_write_string(f, 1, "<tutorials>");
- _write_string(f, 2, c.tutorials.strip_edges().xml_escape());
+ for (int i = 0; i < c.tutorials.size(); i++) {
+ _write_string(f, 2, "<link>" + c.tutorials.get(i).xml_escape() + "</link>");
+ }
_write_string(f, 1, "</tutorials>");
_write_string(f, 1, "<demos>");
_write_string(f, 2, c.demos.strip_edges().xml_escape());
diff --git a/editor/doc/doc_data.h b/editor/doc/doc_data.h
index 0461133f9f..c7b70b5fb9 100644
--- a/editor/doc/doc_data.h
+++ b/editor/doc/doc_data.h
@@ -85,7 +85,7 @@ public:
String category;
String brief_description;
String description;
- String tutorials;
+ Vector<String> tutorials;
String demos;
Vector<MethodDoc> methods;
Vector<MethodDoc> signals;
diff --git a/editor/editor_help.cpp b/editor/editor_help.cpp
index b49c2d26d0..65e50560bc 100644
--- a/editor/editor_help.cpp
+++ b/editor/editor_help.cpp
@@ -1280,11 +1280,10 @@ Error EditorHelp::_goto_desc(const String &p_class, int p_vscr) {
class_desc->add_newline();
// class_desc->add_newline();
- Vector<String> tutorials = cd.tutorials.split_spaces();
- if (tutorials.size() != 0) {
+ if (cd.tutorials.size() != 0) {
- for (int i = 0; i < tutorials.size(); i++) {
- String link = tutorials[i];
+ for (int i = 0; i < cd.tutorials.size(); i++) {
+ String link = cd.tutorials[i];
String linktxt = link;
int seppos = linktxt.find("//");
if (seppos != -1) {
diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp
index 067c451012..aedf472b83 100644
--- a/editor/editor_node.cpp
+++ b/editor/editor_node.cpp
@@ -2161,7 +2161,7 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) {
export_template_manager->popup_manager();
} break;
- case SETTINGS_TOGGLE_FULLSCREN: {
+ case SETTINGS_TOGGLE_FULLSCREEN: {
OS::get_singleton()->set_window_fullscreen(!OS::get_singleton()->is_window_fullscreen());
@@ -4834,7 +4834,11 @@ EditorNode::EditorNode() {
srt->add_child(tabbar_container);
tabbar_container->add_child(scene_tabs);
distraction_free = memnew(ToolButton);
+#ifdef OSX_ENABLED
+ distraction_free->set_shortcut(ED_SHORTCUT("editor/distraction_free_mode", TTR("Distraction Free Mode"), KEY_MASK_CMD | KEY_MASK_CTRL | KEY_D));
+#else
distraction_free->set_shortcut(ED_SHORTCUT("editor/distraction_free_mode", TTR("Distraction Free Mode"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_F11));
+#endif
distraction_free->set_tooltip(TTR("Toggle distraction-free mode."));
distraction_free->connect("pressed", this, "_toggle_distraction_free_mode");
distraction_free->set_icon(gui_base->get_icon("DistractionFree", "EditorIcons"));
@@ -4941,7 +4945,7 @@ EditorNode::EditorNode() {
p->add_shortcut(ED_SHORTCUT("editor/save_scene_as", TTR("Save Scene As..."), KEY_MASK_SHIFT + KEY_MASK_CMD + KEY_S), FILE_SAVE_AS_SCENE);
p->add_shortcut(ED_SHORTCUT("editor/save_all_scenes", TTR("Save all Scenes"), KEY_MASK_ALT + KEY_MASK_SHIFT + KEY_MASK_CMD + KEY_S), FILE_SAVE_ALL_SCENES);
p->add_separator();
- p->add_shortcut(ED_SHORTCUT("editor/close_scene", TTR("Close Scene"), KEY_MASK_SHIFT + KEY_MASK_CTRL + KEY_W), FILE_CLOSE);
+ p->add_shortcut(ED_SHORTCUT("editor/close_scene", TTR("Close Scene"), KEY_MASK_SHIFT + KEY_MASK_CMD + KEY_W), FILE_CLOSE);
p->add_separator();
p->add_submenu_item(TTR("Open Recent"), "RecentScenes", FILE_OPEN_RECENT);
p->add_separator();
@@ -4994,7 +4998,7 @@ EditorNode::EditorNode() {
#ifdef OSX_ENABLED
p->add_item(TTR("Quit to Project List"), RUN_PROJECT_MANAGER, KEY_MASK_SHIFT + KEY_MASK_ALT + KEY_Q);
#else
- p->add_item(TTR("Quit to Project List"), RUN_PROJECT_MANAGER, KEY_MASK_SHIFT + KEY_MASK_CTRL + KEY_Q);
+ p->add_item(TTR("Quit to Project List"), RUN_PROJECT_MANAGER, KEY_MASK_SHIFT + KEY_MASK_CMD + KEY_Q);
#endif
PanelContainer *editor_region = memnew(PanelContainer);
@@ -5043,7 +5047,11 @@ EditorNode::EditorNode() {
p->add_child(editor_layouts);
editor_layouts->connect("id_pressed", this, "_layout_menu_option");
p->add_submenu_item(TTR("Editor Layout"), "Layouts");
- p->add_shortcut(ED_SHORTCUT("editor/fullscreen_mode", TTR("Toggle Fullscreen"), KEY_MASK_SHIFT | KEY_F11), SETTINGS_TOGGLE_FULLSCREN);
+#ifdef OSX_ENABLED
+ p->add_shortcut(ED_SHORTCUT("editor/fullscreen_mode", TTR("Toggle Fullscreen"), KEY_MASK_CMD | KEY_MASK_CTRL | KEY_F), SETTINGS_TOGGLE_FULLSCREEN);
+#else
+ p->add_shortcut(ED_SHORTCUT("editor/fullscreen_mode", TTR("Toggle Fullscreen"), KEY_MASK_SHIFT | KEY_F11), SETTINGS_TOGGLE_FULLSCREEN);
+#endif
p->add_separator();
p->add_item(TTR("Manage Export Templates"), SETTINGS_MANAGE_EXPORT_TEMPLATES);
@@ -5083,7 +5091,11 @@ EditorNode::EditorNode() {
play_button->set_focus_mode(Control::FOCUS_NONE);
play_button->connect("pressed", this, "_menu_option", make_binds(RUN_PLAY));
play_button->set_tooltip(TTR("Play the project."));
+#ifdef OSX_ENABLED
+ play_button->set_shortcut(ED_SHORTCUT("editor/play", TTR("Play"), KEY_MASK_CMD | KEY_B));
+#else
play_button->set_shortcut(ED_SHORTCUT("editor/play", TTR("Play"), KEY_F5));
+#endif
pause_button = memnew(ToolButton);
pause_button->set_toggle_mode(true);
@@ -5092,7 +5104,11 @@ EditorNode::EditorNode() {
pause_button->set_tooltip(TTR("Pause the scene"));
pause_button->set_disabled(true);
play_hb->add_child(pause_button);
+#ifdef OSX_ENABLED
+ pause_button->set_shortcut(ED_SHORTCUT("editor/pause_scene", TTR("Pause Scene"), KEY_MASK_CMD | KEY_MASK_CTRL | KEY_Y));
+#else
pause_button->set_shortcut(ED_SHORTCUT("editor/pause_scene", TTR("Pause Scene"), KEY_F7));
+#endif
stop_button = memnew(ToolButton);
play_hb->add_child(stop_button);
@@ -5101,7 +5117,11 @@ EditorNode::EditorNode() {
stop_button->connect("pressed", this, "_menu_option", make_binds(RUN_STOP));
stop_button->set_tooltip(TTR("Stop the scene."));
stop_button->set_disabled(true);
+#ifdef OSX_ENABLED
+ stop_button->set_shortcut(ED_SHORTCUT("editor/stop", TTR("Stop"), KEY_MASK_CMD | KEY_PERIOD));
+#else
stop_button->set_shortcut(ED_SHORTCUT("editor/stop", TTR("Stop"), KEY_F8));
+#endif
run_native = memnew(EditorRunNative);
play_hb->add_child(run_native);
@@ -5119,7 +5139,11 @@ EditorNode::EditorNode() {
play_scene_button->set_icon(gui_base->get_icon("PlayScene", "EditorIcons"));
play_scene_button->connect("pressed", this, "_menu_option", make_binds(RUN_PLAY_SCENE));
play_scene_button->set_tooltip(TTR("Play the edited scene."));
+#ifdef OSX_ENABLED
+ play_scene_button->set_shortcut(ED_SHORTCUT("editor/play_scene", TTR("Play Scene"), KEY_MASK_CMD | KEY_R));
+#else
play_scene_button->set_shortcut(ED_SHORTCUT("editor/play_scene", TTR("Play Scene"), KEY_F6));
+#endif
play_custom_scene_button = memnew(ToolButton);
play_hb->add_child(play_custom_scene_button);
@@ -5128,7 +5152,11 @@ EditorNode::EditorNode() {
play_custom_scene_button->set_icon(gui_base->get_icon("PlayCustom", "EditorIcons"));
play_custom_scene_button->connect("pressed", this, "_menu_option", make_binds(RUN_PLAY_CUSTOM_SCENE));
play_custom_scene_button->set_tooltip(TTR("Play custom scene"));
+#ifdef OSX_ENABLED
+ play_custom_scene_button->set_shortcut(ED_SHORTCUT("editor/play_custom_scene", TTR("Play Custom Scene"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_R));
+#else
play_custom_scene_button->set_shortcut(ED_SHORTCUT("editor/play_custom_scene", TTR("Play Custom Scene"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_F5));
+#endif
progress_hb = memnew(BackgroundProgress);
@@ -5511,10 +5539,17 @@ EditorNode::EditorNode() {
print_handler.userdata = this;
add_print_handler(&print_handler);
+#ifdef OSX_ENABLED
+ ED_SHORTCUT("editor/editor_2d", TTR("Open 2D Editor"), KEY_MASK_ALT | KEY_1);
+ ED_SHORTCUT("editor/editor_3d", TTR("Open 3D Editor"), KEY_MASK_ALT | KEY_2);
+ ED_SHORTCUT("editor/editor_script", TTR("Open Script Editor"), KEY_MASK_ALT | KEY_3);
+ ED_SHORTCUT("editor/editor_help", TTR("Search Help"), KEY_MASK_ALT | KEY_SPACE);
+#else
ED_SHORTCUT("editor/editor_2d", TTR("Open 2D Editor"), KEY_F1);
ED_SHORTCUT("editor/editor_3d", TTR("Open 3D Editor"), KEY_F2);
ED_SHORTCUT("editor/editor_script", TTR("Open Script Editor"), KEY_F3); //hack neded for script editor F3 search to work :) Assign like this or don't use F3
ED_SHORTCUT("editor/editor_help", TTR("Search Help"), KEY_F4);
+#endif
ED_SHORTCUT("editor/editor_assetlib", TTR("Open Asset Library"));
ED_SHORTCUT("editor/editor_next", TTR("Open the next Editor"));
ED_SHORTCUT("editor/editor_prev", TTR("Open the previous Editor"));
diff --git a/editor/editor_node.h b/editor/editor_node.h
index 416ec9b31e..a441440dcc 100644
--- a/editor/editor_node.h
+++ b/editor/editor_node.h
@@ -171,7 +171,7 @@ private:
SETTINGS_LAYOUT_DEFAULT,
SETTINGS_MANAGE_EXPORT_TEMPLATES,
SETTINGS_PICK_MAIN_SCENE,
- SETTINGS_TOGGLE_FULLSCREN,
+ SETTINGS_TOGGLE_FULLSCREEN,
SETTINGS_HELP,
SCENE_TAB_CLOSE,
diff --git a/editor/editor_settings.cpp b/editor/editor_settings.cpp
index a47605be15..eb6dd626f9 100644
--- a/editor/editor_settings.cpp
+++ b/editor/editor_settings.cpp
@@ -314,7 +314,7 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
_initial_set("interface/editor/quit_confirmation", true);
_initial_set("interface/theme/preset", 0);
- hints["interface/theme/preset"] = PropertyInfo(Variant::INT, "interface/theme/preset", PROPERTY_HINT_ENUM, "Default,Grey,Godot 2,Arc,Light,Alien,Custom", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED);
+ hints["interface/theme/preset"] = PropertyInfo(Variant::INT, "interface/theme/preset", PROPERTY_HINT_ENUM, "Default,Custom,Grey,Godot 2,Arc,Light,Alien,Solarized (Dark),Solarized (Light)", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED);
_initial_set("interface/theme/icon_and_font_color", 0);
hints["interface/theme/icon_and_font_color"] = PropertyInfo(Variant::INT, "interface/theme/icon_and_font_color", PROPERTY_HINT_ENUM, "Auto,Dark,Light", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED);
_initial_set("interface/theme/base_color", Color::html("#323b4f"));
@@ -1402,33 +1402,9 @@ struct ShortCutMapping {
Ref<ShortCut> ED_SHORTCUT(const String &p_path, const String &p_name, uint32_t p_keycode) {
#ifdef OSX_ENABLED
- static const ShortCutMapping macos_mappings[] = {
- { "editor/play", KEY_MASK_CMD | KEY_B },
- { "editor/play_scene", KEY_MASK_CMD | KEY_R },
- { "editor/pause_scene", KEY_MASK_CMD | KEY_MASK_CTRL | KEY_Y },
- { "editor/stop", KEY_MASK_CMD | KEY_PERIOD },
- { "editor/play_custom_scene", KEY_MASK_SHIFT | KEY_MASK_CMD | KEY_R },
- { "editor/editor_2d", KEY_MASK_ALT | KEY_1 },
- { "editor/editor_3d", KEY_MASK_ALT | KEY_2 },
- { "editor/editor_script", KEY_MASK_ALT | KEY_3 },
- { "editor/editor_help", KEY_MASK_ALT | KEY_SPACE },
- { "editor/fullscreen_mode", KEY_MASK_CMD | KEY_MASK_CTRL | KEY_F },
- { "editor/distraction_free_mode", KEY_MASK_CMD | KEY_MASK_CTRL | KEY_D },
- { "script_text_editor/contextual_help", KEY_MASK_ALT | KEY_MASK_SHIFT | KEY_SPACE },
- { "script_text_editor/find_next", KEY_MASK_CMD | KEY_G },
- { "script_text_editor/find_previous", KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_G },
- { "script_text_editor/toggle_breakpoint", KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_B }
- };
-
+ // Use Cmd+Backspace as a general replacement for Delete shortcuts on macOS
if (p_keycode == KEY_DELETE) {
p_keycode = KEY_MASK_CMD | KEY_BACKSPACE;
- } else {
- for (int i = 0; i < sizeof(macos_mappings) / sizeof(ShortCutMapping); i++) {
- if (p_path == macos_mappings[i].path) {
- p_keycode = macos_mappings[i].keycode;
- break;
- }
- }
}
#endif
diff --git a/editor/editor_themes.cpp b/editor/editor_themes.cpp
index 8d29e0d40b..1fc664cab5 100644
--- a/editor/editor_themes.cpp
+++ b/editor/editor_themes.cpp
@@ -272,39 +272,49 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
preset_base_color = Color::html("#323b4f");
preset_contrast = default_contrast;
} break;
- case 1: { // Grey
+ case 1: { // Custom
+ accent_color = EDITOR_DEF("interface/theme/accent_color", Color::html("#699ce8"));
+ base_color = EDITOR_DEF("interface/theme/base_color", Color::html("#323b4f"));
+ contrast = EDITOR_DEF("interface/theme/contrast", default_contrast);
+ } break;
+ case 2: { // Grey
preset_accent_color = Color::html("#b8e4ff");
preset_base_color = Color::html("#3d3d3d");
preset_contrast = 0.2;
} break;
- case 2: { // Godot 2
+ case 3: { // Godot 2
preset_accent_color = Color::html("#86ace2");
preset_base_color = Color::html("#3C3A44");
preset_contrast = 0.25;
} break;
- case 3: { // Arc
+ case 4: { // Arc
preset_accent_color = Color::html("#5294e2");
preset_base_color = Color::html("#383c4a");
preset_contrast = 0.25;
} break;
- case 4: { // Light
+ case 5: { // Light
preset_accent_color = Color::html("#2070ff");
preset_base_color = Color::html("#ffffff");
preset_contrast = 0.08;
} break;
- case 5: { // Alien
+ case 6: { // Alien
preset_accent_color = Color::html("#1bfe99");
preset_base_color = Color::html("#2f373f");
preset_contrast = 0.25;
- }
- default: { // Custom
- accent_color = EDITOR_DEF("interface/theme/accent_color", Color::html("#699ce8"));
- base_color = EDITOR_DEF("interface/theme/base_color", Color::html("#323b4f"));
- contrast = EDITOR_DEF("interface/theme/contrast", default_contrast);
- }
+ } break;
+ case 7: { // Solarized (Dark)
+ preset_accent_color = Color::html("#268bd2");
+ preset_base_color = Color::html("#002b36");
+ preset_contrast = 0.2;
+ } break;
+ case 8: { // Solarized (Light)
+ preset_accent_color = Color::html("#268bd2");
+ preset_base_color = Color::html("#fdf6e3");
+ preset_contrast = 0.06;
+ } break;
}
- if (preset != 6) {
+ if (preset != 1) {
accent_color = preset_accent_color;
base_color = preset_base_color;
contrast = preset_contrast;
@@ -1050,7 +1060,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
const Color function_definition_color = Color::html(dark_theme ? "#01e1ff" : "#00a5ba");
const Color node_path_color = Color::html(dark_theme ? "64c15a" : "#518b4b");
- const Color te_background_color = dark_theme ? background_color : Color::html("#ffffff");
+ const Color te_background_color = dark_theme ? background_color : base_color;
const Color completion_background_color = base_color;
const Color completion_selected_color = alpha1;
const Color completion_existing_color = alpha2;
diff --git a/editor/plugins/canvas_item_editor_plugin.cpp b/editor/plugins/canvas_item_editor_plugin.cpp
index 13a9a84de1..0f46f7f004 100644
--- a/editor/plugins/canvas_item_editor_plugin.cpp
+++ b/editor/plugins/canvas_item_editor_plugin.cpp
@@ -1983,32 +1983,53 @@ bool CanvasItemEditor::_gui_input_hover(const Ref<InputEvent> &p_event) {
Ref<InputEventMouseMotion> m = p_event;
if (m.is_valid()) {
- if (drag_type == DRAG_NONE && tool == TOOL_SELECT) {
- Point2 click = transform.affine_inverse().xform(m->get_position());
-
- //Checks if the hovered items changed, update the viewport if so
- Vector<_SelectResult> hovering_results_tmp;
- _get_canvas_items_at_pos(click, hovering_results_tmp);
- hovering_results_tmp.sort();
- bool changed = false;
- if (hovering_results.size() == hovering_results_tmp.size()) {
- for (int i = 0; i < hovering_results.size(); i++) {
- if (hovering_results[i].item != hovering_results_tmp[i].item) {
- changed = true;
- break;
- }
- }
- } else {
- changed = true;
- }
+ Point2 click = transform.affine_inverse().xform(m->get_position());
- if (changed) {
- hovering_results = hovering_results_tmp;
- viewport->update();
+ // Checks if the hovered items changed, update the viewport if so
+ Vector<_SelectResult> hovering_results_items;
+ _get_canvas_items_at_pos(click, hovering_results_items);
+ hovering_results_items.sort();
+
+ // Compute the nodes names and icon position
+ Vector<_HoverResult> hovering_results_tmp;
+ for (int i = 0; i < hovering_results_items.size(); i++) {
+ CanvasItem *canvas_item = hovering_results_items[i].item;
+
+ if (canvas_item->_edit_use_rect())
+ continue;
+
+ _HoverResult hover_result;
+ hover_result.position = canvas_item->get_global_transform_with_canvas().get_origin();
+ if (has_icon(canvas_item->get_class(), "EditorIcons"))
+ hover_result.icon = get_icon(canvas_item->get_class(), "EditorIcons");
+ else
+ hover_result.icon = get_icon("Object", "EditorIcons");
+ hover_result.name = canvas_item->get_name();
+
+ hovering_results_tmp.push_back(hover_result);
+ }
+
+ // Check if changed, if so, update.
+ bool changed = false;
+ if (hovering_results_tmp.size() == hovering_results.size()) {
+ for (int i = 0; i < hovering_results_tmp.size(); i++) {
+ _HoverResult a = hovering_results_tmp[i];
+ _HoverResult b = hovering_results[i];
+ if (a.icon != b.icon || a.name != b.name || a.position != b.position) {
+ changed = true;
+ break;
+ }
}
+ } else {
+ changed = true;
+ }
- return true;
+ if (changed) {
+ hovering_results = hovering_results_tmp;
+ viewport->update();
}
+
+ return true;
}
return false;
@@ -2769,26 +2790,15 @@ void CanvasItemEditor::_draw_hover() {
List<Rect2> previous_rects;
for (int i = 0; i < hovering_results.size(); i++) {
- // Draw the node's name and icon
- CanvasItem *canvas_item = hovering_results[i].item;
-
- if (canvas_item->_edit_use_rect())
- continue;
- Transform2D xform = transform * canvas_item->get_global_transform_with_canvas();
+ Ref<Texture> node_icon = hovering_results[i].icon;
+ String node_name = hovering_results[i].name;
- // Get the resources
- Ref<Texture> node_icon;
- if (has_icon(canvas_item->get_class(), "EditorIcons"))
- node_icon = get_icon(canvas_item->get_class(), "EditorIcons");
- else
- node_icon = get_icon("Object", "EditorIcons");
Ref<Font> font = get_font("font", "Label");
- String node_name = canvas_item->get_name();
Size2 node_name_size = font->get_string_size(node_name);
Size2 item_size = Size2(node_icon->get_size().x + 4 + node_name_size.x, MAX(node_icon->get_size().y, node_name_size.y - 3));
- Point2 pos = xform.get_origin() - Point2(0, item_size.y) + (Point2(node_icon->get_size().x, -node_icon->get_size().y) / 4);
+ Point2 pos = transform.xform(hovering_results[i].position) - Point2(0, item_size.y) + (Point2(node_icon->get_size().x, -node_icon->get_size().y) / 4);
// Rectify the position to avoid overlaping items
for (List<Rect2>::Element *E = previous_rects.front(); E; E = E->next()) {
if (E->get().intersects(Rect2(pos, item_size))) {
@@ -2798,8 +2808,10 @@ void CanvasItemEditor::_draw_hover() {
previous_rects.push_back(Rect2(pos, item_size));
- // Draw the node icon and name
+ // Draw icon
viewport->draw_texture(node_icon, pos, Color(1.0, 1.0, 1.0, 0.5));
+
+ // Draw name
viewport->draw_string(font, pos + Point2(node_icon->get_size().x + 4, item_size.y - 3), node_name, Color(1.0, 1.0, 1.0, 0.5));
}
}
diff --git a/editor/plugins/canvas_item_editor_plugin.h b/editor/plugins/canvas_item_editor_plugin.h
index 4d2af11303..adc4010f39 100644
--- a/editor/plugins/canvas_item_editor_plugin.h
+++ b/editor/plugins/canvas_item_editor_plugin.h
@@ -257,9 +257,15 @@ class CanvasItemEditor : public VBoxContainer {
return has_z && p_rr.has_z ? p_rr.z_index < z_index : p_rr.has_z;
}
};
-
Vector<_SelectResult> selection_results;
- Vector<_SelectResult> hovering_results;
+
+ struct _HoverResult {
+
+ Point2 position;
+ Ref<Texture> icon;
+ String name;
+ };
+ Vector<_HoverResult> hovering_results;
struct BoneList {
diff --git a/editor/plugins/script_text_editor.cpp b/editor/plugins/script_text_editor.cpp
index 45f5e667fa..aef2a53dd1 100644
--- a/editor/plugins/script_text_editor.cpp
+++ b/editor/plugins/script_text_editor.cpp
@@ -1727,7 +1727,7 @@ void ScriptTextEditor::register_editor() {
ED_SHORTCUT("script_text_editor/select_all", TTR("Select All"), KEY_MASK_CMD | KEY_A);
ED_SHORTCUT("script_text_editor/move_up", TTR("Move Up"), KEY_MASK_ALT | KEY_UP);
ED_SHORTCUT("script_text_editor/move_down", TTR("Move Down"), KEY_MASK_ALT | KEY_DOWN);
- ED_SHORTCUT("script_text_editor/delete_line", TTR("Delete Line"), KEY_MASK_CTRL | KEY_MASK_SHIFT | KEY_K);
+ ED_SHORTCUT("script_text_editor/delete_line", TTR("Delete Line"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_K);
//leave these at zero, same can be accomplished with tab/shift-tab, including selection
//the next/previous in history shortcut in this case makes a lot more sene.
@@ -1740,28 +1740,36 @@ void ScriptTextEditor::register_editor() {
ED_SHORTCUT("script_text_editor/unfold_all_lines", TTR("Unfold All Lines"), 0);
#ifdef OSX_ENABLED
ED_SHORTCUT("script_text_editor/clone_down", TTR("Clone Down"), KEY_MASK_SHIFT | KEY_MASK_CMD | KEY_C);
- ED_SHORTCUT("script_text_editor/complete_symbol", TTR("Complete Symbol"), KEY_MASK_CTRL | KEY_SPACE);
#else
ED_SHORTCUT("script_text_editor/clone_down", TTR("Clone Down"), KEY_MASK_CMD | KEY_B);
- ED_SHORTCUT("script_text_editor/complete_symbol", TTR("Complete Symbol"), KEY_MASK_CMD | KEY_SPACE);
#endif
- ED_SHORTCUT("script_text_editor/trim_trailing_whitespace", TTR("Trim Trailing Whitespace"), KEY_MASK_CTRL | KEY_MASK_ALT | KEY_T);
- ED_SHORTCUT("script_text_editor/convert_indent_to_spaces", TTR("Convert Indent To Spaces"), KEY_MASK_CTRL | KEY_MASK_SHIFT | KEY_Y);
- ED_SHORTCUT("script_text_editor/convert_indent_to_tabs", TTR("Convert Indent To Tabs"), KEY_MASK_CTRL | KEY_MASK_SHIFT | KEY_X);
+ ED_SHORTCUT("script_text_editor/complete_symbol", TTR("Complete Symbol"), KEY_MASK_CMD | KEY_SPACE);
+ ED_SHORTCUT("script_text_editor/trim_trailing_whitespace", TTR("Trim Trailing Whitespace"), KEY_MASK_CMD | KEY_MASK_ALT | KEY_T);
+ ED_SHORTCUT("script_text_editor/convert_indent_to_spaces", TTR("Convert Indent To Spaces"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_Y);
+ ED_SHORTCUT("script_text_editor/convert_indent_to_tabs", TTR("Convert Indent To Tabs"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_X);
ED_SHORTCUT("script_text_editor/auto_indent", TTR("Auto Indent"), KEY_MASK_CMD | KEY_I);
+#ifdef OSX_ENABLED
+ ED_SHORTCUT("script_text_editor/toggle_breakpoint", TTR("Toggle Breakpoint"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_B);
+#else
ED_SHORTCUT("script_text_editor/toggle_breakpoint", TTR("Toggle Breakpoint"), KEY_F9);
- ED_SHORTCUT("script_text_editor/remove_all_breakpoints", TTR("Remove All Breakpoints"), KEY_MASK_CTRL | KEY_MASK_SHIFT | KEY_F9);
- ED_SHORTCUT("script_text_editor/goto_next_breakpoint", TTR("Goto Next Breakpoint"), KEY_MASK_CTRL | KEY_PERIOD);
- ED_SHORTCUT("script_text_editor/goto_previous_breakpoint", TTR("Goto Previous Breakpoint"), KEY_MASK_CTRL | KEY_COMMA);
+#endif
+ ED_SHORTCUT("script_text_editor/remove_all_breakpoints", TTR("Remove All Breakpoints"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_F9);
+ ED_SHORTCUT("script_text_editor/goto_next_breakpoint", TTR("Goto Next Breakpoint"), KEY_MASK_CMD | KEY_PERIOD);
+ ED_SHORTCUT("script_text_editor/goto_previous_breakpoint", TTR("Goto Previous Breakpoint"), KEY_MASK_CMD | KEY_COMMA);
ED_SHORTCUT("script_text_editor/convert_to_uppercase", TTR("Convert To Uppercase"), KEY_MASK_SHIFT | KEY_F4);
ED_SHORTCUT("script_text_editor/convert_to_lowercase", TTR("Convert To Lowercase"), KEY_MASK_SHIFT | KEY_F3);
ED_SHORTCUT("script_text_editor/capitalize", TTR("Capitalize"), KEY_MASK_SHIFT | KEY_F2);
ED_SHORTCUT("script_text_editor/find", TTR("Find..."), KEY_MASK_CMD | KEY_F);
+#ifdef OSX_ENABLED
+ ED_SHORTCUT("script_text_editor/find_next", TTR("Find Next"), KEY_MASK_CMD | KEY_G);
+ ED_SHORTCUT("script_text_editor/find_previous", TTR("Find Previous"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_G);
+#else
ED_SHORTCUT("script_text_editor/find_next", TTR("Find Next"), KEY_F3);
ED_SHORTCUT("script_text_editor/find_previous", TTR("Find Previous"), KEY_MASK_SHIFT | KEY_F3);
+#endif
ED_SHORTCUT("script_text_editor/replace", TTR("Replace..."), KEY_MASK_CMD | KEY_R);
ED_SHORTCUT("script_text_editor/find_in_files", TTR("Find in files..."), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_F);
@@ -1769,7 +1777,11 @@ void ScriptTextEditor::register_editor() {
ED_SHORTCUT("script_text_editor/goto_function", TTR("Goto Function..."), KEY_MASK_ALT | KEY_MASK_CMD | KEY_F);
ED_SHORTCUT("script_text_editor/goto_line", TTR("Goto Line..."), KEY_MASK_CMD | KEY_L);
+#ifdef OSX_ENABLED
+ ED_SHORTCUT("script_text_editor/contextual_help", TTR("Contextual Help"), KEY_MASK_ALT | KEY_MASK_SHIFT | KEY_SPACE);
+#else
ED_SHORTCUT("script_text_editor/contextual_help", TTR("Contextual Help"), KEY_MASK_SHIFT | KEY_F1);
+#endif
ScriptEditor::register_create_script_editor_function(create_editor);
}
diff --git a/editor/settings_config_dialog.cpp b/editor/settings_config_dialog.cpp
index c3e9e4ab62..eb9ab93228 100644
--- a/editor/settings_config_dialog.cpp
+++ b/editor/settings_config_dialog.cpp
@@ -61,7 +61,7 @@ void EditorSettingsDialog::_settings_property_edited(const String &p_name) {
if (full_name == "text_editor/theme/color_theme") {
property_editor->get_property_editor()->update_tree();
} else if (full_name == "interface/theme/accent_color" || full_name == "interface/theme/base_color" || full_name == "interface/theme/contrast") {
- EditorSettings::get_singleton()->set_manually("interface/theme/preset", 6); // set preset to Custom
+ EditorSettings::get_singleton()->set_manually("interface/theme/preset", 1); // set preset to Custom
} else if (full_name.begins_with("text_editor/highlighting")) {
EditorSettings::get_singleton()->set_manually("text_editor/theme/color_theme", "Custom");
}
diff --git a/main/tests/test_main.cpp b/main/tests/test_main.cpp
index c9431a1a09..cbc1107acb 100644
--- a/main/tests/test_main.cpp
+++ b/main/tests/test_main.cpp
@@ -50,15 +50,20 @@ const char **tests_get_names() {
static const char *test_names[] = {
"string",
- "containers",
"math",
+ "physics",
+ "physics_2d",
"render",
- "multimesh",
+ "oa_hash_map",
"gui",
"io",
"shaderlang",
- "physics",
- "oa_hash_map",
+ "gd_tokenizer",
+ "gd_parser",
+ "gd_compiler",
+ "gd_bytecode",
+ "image",
+ "ordered_hash_map",
NULL
};
diff --git a/modules/csg/csg_shape.cpp b/modules/csg/csg_shape.cpp
index 82db1871da..ba27d6839d 100644
--- a/modules/csg/csg_shape.cpp
+++ b/modules/csg/csg_shape.cpp
@@ -162,6 +162,10 @@ CSGBrush *CSGShape::_get_brush() {
void CSGShape::_update_shape() {
//print_line("updating shape for " + String(get_path()));
+
+ if (parent)
+ return;
+
set_base(RID());
root_mesh.unref(); //byebye root mesh
@@ -349,6 +353,10 @@ void CSGShape::_notification(int p_what) {
Node *parentn = get_parent();
if (parentn) {
parent = Object::cast_to<CSGShape>(parentn);
+ if (parent) {
+ set_base(RID());
+ root_mesh.unref();
+ }
}
if (use_collision && is_root_shape()) {
@@ -371,6 +379,7 @@ void CSGShape::_notification(int p_what) {
}
if (p_what == NOTIFICATION_EXIT_TREE) {
+
if (parent)
parent->_make_dirty();
parent = NULL;
diff --git a/modules/enet/doc_classes/NetworkedMultiplayerENet.xml b/modules/enet/doc_classes/NetworkedMultiplayerENet.xml
index d5fd4bff09..fab4b05da9 100644
--- a/modules/enet/doc_classes/NetworkedMultiplayerENet.xml
+++ b/modules/enet/doc_classes/NetworkedMultiplayerENet.xml
@@ -7,8 +7,8 @@
A PacketPeer implementation that should be passed to [method SceneTree.set_network_peer] after being initialized as either a client or server. Events can then be handled by connecting to [SceneTree] signals.
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/networking/high_level_multiplayer.html
- http://enet.bespin.org/usergroup0.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/networking/high_level_multiplayer.html</link>
+ <link>http://enet.bespin.org/usergroup0.html</link>
</tutorials>
<demos>
</demos>
diff --git a/modules/gdscript/doc_classes/GDScript.xml b/modules/gdscript/doc_classes/GDScript.xml
index 40a435f459..632970f8c0 100644
--- a/modules/gdscript/doc_classes/GDScript.xml
+++ b/modules/gdscript/doc_classes/GDScript.xml
@@ -8,7 +8,7 @@
[method new] creates a new instance of the script. [method Object.set_script] extends an existing object, if that object's class matches one of the script's base classes.
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/getting_started/scripting/gdscript/index.html
+ <link>http://docs.godotengine.org/en/3.0/getting_started/scripting/gdscript/index.html</link>
</tutorials>
<demos>
</demos>
diff --git a/modules/gdscript/gdscript_editor.cpp b/modules/gdscript/gdscript_editor.cpp
index 4286412c14..0e4724fec2 100644
--- a/modules/gdscript/gdscript_editor.cpp
+++ b/modules/gdscript/gdscript_editor.cpp
@@ -118,6 +118,13 @@ bool GDScriptLanguage::validate(const String &p_script, int &r_line_error, int &
funcs[cl->static_functions[i]->line] = cl->static_functions[i]->name;
}
+ for (int i = 0; i < cl->subclasses.size(); i++) {
+ for (int j = 0; j < cl->subclasses[i]->functions.size(); j++) {
+
+ funcs[cl->subclasses[i]->functions[j]->line] = String(cl->subclasses[i]->name) + "." + String(cl->subclasses[i]->functions[j]->name);
+ }
+ }
+
for (Map<int, String>::Element *E = funcs.front(); E; E = E->next()) {
r_functions->push_back(E->get() + ":" + itos(E->key()));
diff --git a/modules/gridmap/doc_classes/GridMap.xml b/modules/gridmap/doc_classes/GridMap.xml
index bb652f3bdf..d5f9563600 100644
--- a/modules/gridmap/doc_classes/GridMap.xml
+++ b/modules/gridmap/doc_classes/GridMap.xml
@@ -10,7 +10,7 @@
A GridMap is split into a sparse collection of octants for efficient rendering and physics processing. Every octant has the same dimensions and can contain several cells.
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/tutorials/3d/using_gridmaps.html
+ <link>http://docs.godotengine.org/en/3.0/tutorials/3d/using_gridmaps.html</link>
</tutorials>
<demos>
</demos>
diff --git a/modules/visual_script/doc_classes/VisualScript.xml b/modules/visual_script/doc_classes/VisualScript.xml
index dab186fb57..28764aca40 100644
--- a/modules/visual_script/doc_classes/VisualScript.xml
+++ b/modules/visual_script/doc_classes/VisualScript.xml
@@ -9,7 +9,7 @@
You are most likely to use this class via the Visual Script editor or when writing plugins for it.
</description>
<tutorials>
- http://docs.godotengine.org/en/3.0/getting_started/scripting/visual_script/index.html
+ <link>http://docs.godotengine.org/en/3.0/getting_started/scripting/visual_script/index.html</link>
</tutorials>
<demos>
</demos>
diff --git a/platform/osx/os_osx.h b/platform/osx/os_osx.h
index 2b2d21553b..7bd5b16f36 100644
--- a/platform/osx/os_osx.h
+++ b/platform/osx/os_osx.h
@@ -117,6 +117,7 @@ public:
String open_with_filename;
Point2 im_position;
+ bool im_active;
ImeCallback im_callback;
void *im_target;
@@ -233,6 +234,7 @@ public:
virtual bool get_window_per_pixel_transparency_enabled() const;
virtual void set_window_per_pixel_transparency_enabled(bool p_enabled);
+ virtual void set_ime_active(const bool p_active);
virtual void set_ime_position(const Point2 &p_pos);
virtual void set_ime_intermediate_text_callback(ImeCallback p_callback, void *p_inp);
diff --git a/platform/osx/os_osx.mm b/platform/osx/os_osx.mm
index a49ae1a2f3..4ece1e0325 100644
--- a/platform/osx/os_osx.mm
+++ b/platform/osx/os_osx.mm
@@ -959,7 +959,7 @@ static int remapKey(unsigned int key) {
push_to_key_event_buffer(ke);
}
- if ((OS_OSX::singleton->im_position.x != 0) && (OS_OSX::singleton->im_position.y != 0))
+ if (OS_OSX::singleton->im_active == true)
[self interpretKeyEvents:[NSArray arrayWithObject:event]];
}
@@ -1129,6 +1129,10 @@ String OS_OSX::get_unique_id() const {
return serial_number;
}
+void OS_OSX::set_ime_active(const bool p_active) {
+ im_active = p_active;
+}
+
void OS_OSX::set_ime_position(const Point2 &p_pos) {
im_position = p_pos;
}
@@ -2542,6 +2546,7 @@ OS_OSX::OS_OSX() {
mouse_mode = OS::MOUSE_MODE_VISIBLE;
main_loop = NULL;
singleton = this;
+ im_active = false;
im_position = Point2();
im_callback = NULL;
im_target = NULL;
diff --git a/platform/windows/os_windows.cpp b/platform/windows/os_windows.cpp
index 3e0c4a7c0c..ca6c793d5d 100644
--- a/platform/windows/os_windows.cpp
+++ b/platform/windows/os_windows.cpp
@@ -1181,6 +1181,15 @@ Error OS_Windows::initialize(const VideoMode &p_desired, int p_video_driver, int
if (p_desired.layered_splash) {
set_window_per_pixel_transparency_enabled(true);
}
+
+ // IME
+ im_himc = ImmGetContext(hWnd);
+ ImmReleaseContext(hWnd, im_himc);
+
+ im_position = Vector2();
+
+ set_ime_active(false);
+
return OK;
}
@@ -2659,13 +2668,29 @@ String OS_Windows::get_unique_id() const {
return String(HwProfInfo.szHwProfileGuid);
}
+void OS_Windows::set_ime_active(const bool p_active) {
+
+ if (p_active) {
+ ImmAssociateContext(hWnd, im_himc);
+
+ set_ime_position(im_position);
+ } else {
+ ImmAssociateContext(hWnd, (HIMC)0);
+ }
+}
+
void OS_Windows::set_ime_position(const Point2 &p_pos) {
+ im_position = p_pos;
+
HIMC himc = ImmGetContext(hWnd);
+ if (himc == (HIMC)0)
+ return;
+
COMPOSITIONFORM cps;
cps.dwStyle = CFS_FORCE_POSITION;
- cps.ptCurrentPos.x = p_pos.x;
- cps.ptCurrentPos.y = p_pos.y;
+ cps.ptCurrentPos.x = im_position.x;
+ cps.ptCurrentPos.y = im_position.y;
ImmSetCompositionWindow(himc, &cps);
ImmReleaseContext(hWnd, himc);
}
diff --git a/platform/windows/os_windows.h b/platform/windows/os_windows.h
index 81849497ee..19af63bae0 100644
--- a/platform/windows/os_windows.h
+++ b/platform/windows/os_windows.h
@@ -111,6 +111,10 @@ class OS_Windows : public OS {
WNDPROC user_proc;
+ // IME
+ HIMC im_himc;
+ Vector2 im_position;
+
MouseMode mouse_mode;
bool alt_mem;
bool gr_mem;
@@ -282,6 +286,7 @@ public:
virtual String get_unique_id() const;
+ virtual void set_ime_active(const bool p_active);
virtual void set_ime_position(const Point2 &p_pos);
virtual void release_rendering_thread();
diff --git a/platform/x11/os_x11.cpp b/platform/x11/os_x11.cpp
index 1fa6993306..d7f042b4fe 100644
--- a/platform/x11/os_x11.cpp
+++ b/platform/x11/os_x11.cpp
@@ -391,6 +391,9 @@ Error OS_X11::initialize(const VideoMode &p_desired, int p_video_driver, int p_a
wm_delete = XInternAtom(x11_display, "WM_DELETE_WINDOW", true);
XSetWMProtocols(x11_display, x11_window, &wm_delete, 1);
+ im_active = false;
+ im_position = Vector2();
+
if (xim && xim_style) {
xic = XCreateIC(xim, XNInputStyle, xim_style, XNClientWindow, x11_window, XNFocusWindow, x11_window, (char *)NULL);
@@ -400,7 +403,7 @@ Error OS_X11::initialize(const VideoMode &p_desired, int p_video_driver, int p_a
xic = NULL;
}
if (xic) {
- XSetICFocus(xic);
+ XUnsetICFocus(xic);
} else {
WARN_PRINT("XCreateIC couldn't create xic");
}
@@ -541,8 +544,25 @@ void OS_X11::xim_destroy_callback(::XIM im, ::XPointer client_data,
os->xic = NULL;
}
+void OS_X11::set_ime_active(const bool p_active) {
+
+ im_active = p_active;
+
+ if (!xic)
+ return;
+
+ if (p_active) {
+ XSetICFocus(xic);
+ set_ime_position(im_position);
+ } else {
+ XUnsetICFocus(xic);
+ }
+}
+
void OS_X11::set_ime_position(const Point2 &p_pos) {
+ im_position = p_pos;
+
if (!xic)
return;
diff --git a/platform/x11/os_x11.h b/platform/x11/os_x11.h
index 09ed9588c4..8cab23fe63 100644
--- a/platform/x11/os_x11.h
+++ b/platform/x11/os_x11.h
@@ -116,6 +116,10 @@ class OS_X11 : public OS_Unix {
static void xim_destroy_callback(::XIM im, ::XPointer client_data,
::XPointer call_data);
+ // IME
+ bool im_active;
+ Vector2 im_position;
+
Point2i last_mouse_pos;
bool last_mouse_pos_valid;
Point2i last_click_pos;
@@ -269,6 +273,7 @@ public:
virtual bool get_window_per_pixel_transparency_enabled() const;
virtual void set_window_per_pixel_transparency_enabled(bool p_enabled);
+ virtual void set_ime_active(const bool p_active);
virtual void set_ime_position(const Point2 &p_pos);
virtual String get_unique_id() const;
diff --git a/scene/3d/particles.cpp b/scene/3d/particles.cpp
index 7b5eb8ebc3..2b3a62fcdc 100644
--- a/scene/3d/particles.cpp
+++ b/scene/3d/particles.cpp
@@ -1444,7 +1444,7 @@ void ParticlesMaterial::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "trail_color_modifier", PROPERTY_HINT_RESOURCE_TYPE, "GradientTexture"), "set_trail_color_modifier", "get_trail_color_modifier");
ADD_GROUP("Emission Shape", "emission_");
ADD_PROPERTY(PropertyInfo(Variant::INT, "emission_shape", PROPERTY_HINT_ENUM, "Point,Sphere,Box,Points,Directed Points"), "set_emission_shape", "get_emission_shape");
- ADD_PROPERTY(PropertyInfo(Variant::REAL, "emission_sphere_radius", PROPERTY_HINT_RANGE, "0.01,128,0.01"), "set_emission_sphere_radius", "get_emission_sphere_radius");
+ ADD_PROPERTY(PropertyInfo(Variant::REAL, "emission_sphere_radius", PROPERTY_HINT_RANGE, "0.01,128,0.01,or_greater"), "set_emission_sphere_radius", "get_emission_sphere_radius");
ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "emission_box_extents"), "set_emission_box_extents", "get_emission_box_extents");
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "emission_point_texture", PROPERTY_HINT_RESOURCE_TYPE, "Texture"), "set_emission_point_texture", "get_emission_point_texture");
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "emission_normal_texture", PROPERTY_HINT_RESOURCE_TYPE, "Texture"), "set_emission_normal_texture", "get_emission_normal_texture");
@@ -1483,7 +1483,7 @@ void ParticlesMaterial::_bind_methods() {
ADD_PROPERTYI(PropertyInfo(Variant::REAL, "tangential_accel_random", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_param_randomness", "get_param_randomness", PARAM_TANGENTIAL_ACCEL);
ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "tangential_accel_curve", PROPERTY_HINT_RESOURCE_TYPE, "CurveTexture"), "set_param_texture", "get_param_texture", PARAM_TANGENTIAL_ACCEL);
ADD_GROUP("Damping", "");
- ADD_PROPERTYI(PropertyInfo(Variant::REAL, "damping", PROPERTY_HINT_RANGE, "0,100,0.01"), "set_param", "get_param", PARAM_DAMPING);
+ ADD_PROPERTYI(PropertyInfo(Variant::REAL, "damping", PROPERTY_HINT_RANGE, "0,100,0.01,or_greater"), "set_param", "get_param", PARAM_DAMPING);
ADD_PROPERTYI(PropertyInfo(Variant::REAL, "damping_random", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_param_randomness", "get_param_randomness", PARAM_DAMPING);
ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "damping_curve", PROPERTY_HINT_RESOURCE_TYPE, "CurveTexture"), "set_param_texture", "get_param_texture", PARAM_DAMPING);
ADD_GROUP("Angle", "");
diff --git a/scene/gui/line_edit.cpp b/scene/gui/line_edit.cpp
index f1f1a66b47..71cb01d2ee 100644
--- a/scene/gui/line_edit.cpp
+++ b/scene/gui/line_edit.cpp
@@ -756,6 +756,7 @@ void LineEdit::_notification(int p_what) {
if (has_focus()) {
+ OS::get_singleton()->set_ime_active(true);
OS::get_singleton()->set_ime_position(get_global_position() + Point2(x_ofs, y_ofs + caret_height));
OS::get_singleton()->set_ime_intermediate_text_callback(_ime_text_callback, this);
}
@@ -766,6 +767,7 @@ void LineEdit::_notification(int p_what) {
draw_caret = true;
}
+ OS::get_singleton()->set_ime_active(true);
Point2 cursor_pos = Point2(get_cursor_position(), 1) * get_minimum_size().height;
OS::get_singleton()->set_ime_position(get_global_position() + cursor_pos);
OS::get_singleton()->set_ime_intermediate_text_callback(_ime_text_callback, this);
@@ -778,6 +780,7 @@ void LineEdit::_notification(int p_what) {
OS::get_singleton()->set_ime_position(Point2());
OS::get_singleton()->set_ime_intermediate_text_callback(NULL, NULL);
+ OS::get_singleton()->set_ime_active(false);
ime_text = "";
ime_selection = Point2();
diff --git a/scene/gui/tab_container.cpp b/scene/gui/tab_container.cpp
index 0363dd44c2..4f72b5c6ed 100644
--- a/scene/gui/tab_container.cpp
+++ b/scene/gui/tab_container.cpp
@@ -143,6 +143,42 @@ void TabContainer::_notification(int p_what) {
switch (p_what) {
+ case NOTIFICATION_RESIZED: {
+
+ Vector<Control *> tabs = _get_tabs();
+ int side_margin = get_constant("side_margin");
+ Ref<Texture> menu = get_icon("menu");
+ Ref<Texture> increment = get_icon("increment");
+ Ref<Texture> decrement = get_icon("decrement");
+ int header_width = get_size().width - side_margin * 2;
+
+ // Find the width of the header area.
+ if (popup)
+ header_width -= menu->get_width();
+ if (buttons_visible_cache)
+ header_width -= increment->get_width() + decrement->get_width();
+ if (popup || buttons_visible_cache)
+ header_width += side_margin;
+
+ // Find the width of all tabs after first_tab_cache.
+ int all_tabs_width = 0;
+ for (int i = first_tab_cache; i < tabs.size(); i++) {
+ int tab_width = _get_tab_width(i);
+ all_tabs_width += tab_width;
+ }
+
+ // Check if tabs before first_tab_cache would fit into the header area.
+ for (int i = first_tab_cache - 1; i >= 0; i--) {
+ int tab_width = _get_tab_width(i);
+
+ if (all_tabs_width + tab_width > header_width)
+ break;
+
+ all_tabs_width += tab_width;
+ first_tab_cache--;
+ }
+ } break;
+
case NOTIFICATION_DRAW: {
RID canvas = get_canvas_item();
@@ -197,6 +233,10 @@ void TabContainer::_notification(int p_what) {
header_width += side_margin;
}
+ if (!buttons_visible_cache) {
+ first_tab_cache = 0;
+ }
+
// Go through the visible tabs to find the width they occupy.
all_tabs_width = 0;
Vector<int> tab_widths;
diff --git a/scene/gui/text_edit.cpp b/scene/gui/text_edit.cpp
index 1c6ac50b1c..215ba0271f 100644
--- a/scene/gui/text_edit.cpp
+++ b/scene/gui/text_edit.cpp
@@ -1388,6 +1388,7 @@ void TextEdit::_notification(int p_what) {
}
if (has_focus()) {
+ OS::get_singleton()->set_ime_active(true);
OS::get_singleton()->set_ime_position(get_global_position() + cursor_pos + Point2(0, get_row_height()));
OS::get_singleton()->set_ime_intermediate_text_callback(_ime_text_callback, this);
}
@@ -1399,6 +1400,7 @@ void TextEdit::_notification(int p_what) {
draw_caret = true;
}
+ OS::get_singleton()->set_ime_active(true);
Point2 cursor_pos = Point2(cursor_get_column(), cursor_get_line()) * get_row_height();
OS::get_singleton()->set_ime_position(get_global_position() + cursor_pos);
OS::get_singleton()->set_ime_intermediate_text_callback(_ime_text_callback, this);
@@ -1413,6 +1415,7 @@ void TextEdit::_notification(int p_what) {
OS::get_singleton()->set_ime_position(Point2());
OS::get_singleton()->set_ime_intermediate_text_callback(NULL, NULL);
+ OS::get_singleton()->set_ime_active(false);
ime_text = "";
ime_selection = Point2();
diff --git a/scene/resources/primitive_meshes.cpp b/scene/resources/primitive_meshes.cpp
index 14ac029430..28aa6f1aa7 100644
--- a/scene/resources/primitive_meshes.cpp
+++ b/scene/resources/primitive_meshes.cpp
@@ -419,10 +419,10 @@ void CapsuleMesh::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_rings", "rings"), &CapsuleMesh::set_rings);
ClassDB::bind_method(D_METHOD("get_rings"), &CapsuleMesh::get_rings);
- ADD_PROPERTY(PropertyInfo(Variant::REAL, "radius", PROPERTY_HINT_RANGE, "0.001,100.0,0.001"), "set_radius", "get_radius");
- ADD_PROPERTY(PropertyInfo(Variant::REAL, "mid_height", PROPERTY_HINT_RANGE, "0.001,100.0,0.001"), "set_mid_height", "get_mid_height");
- ADD_PROPERTY(PropertyInfo(Variant::INT, "radial_segments", PROPERTY_HINT_RANGE, "1,100,1"), "set_radial_segments", "get_radial_segments");
- ADD_PROPERTY(PropertyInfo(Variant::INT, "rings", PROPERTY_HINT_RANGE, "1,100,1"), "set_rings", "get_rings");
+ ADD_PROPERTY(PropertyInfo(Variant::REAL, "radius", PROPERTY_HINT_RANGE, "0.001,100.0,0.001,or_greater"), "set_radius", "get_radius");
+ ADD_PROPERTY(PropertyInfo(Variant::REAL, "mid_height", PROPERTY_HINT_RANGE, "0.001,100.0,0.001,or_greater"), "set_mid_height", "get_mid_height");
+ ADD_PROPERTY(PropertyInfo(Variant::INT, "radial_segments", PROPERTY_HINT_RANGE, "1,100,1,or_greater"), "set_radial_segments", "get_radial_segments");
+ ADD_PROPERTY(PropertyInfo(Variant::INT, "rings", PROPERTY_HINT_RANGE, "1,100,1,or_greater"), "set_rings", "get_rings");
}
void CapsuleMesh::set_radius(const float p_radius) {
@@ -677,9 +677,9 @@ void CubeMesh::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_subdivide_depth"), &CubeMesh::get_subdivide_depth);
ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "size"), "set_size", "get_size");
- ADD_PROPERTY(PropertyInfo(Variant::INT, "subdivide_width", PROPERTY_HINT_RANGE, "0,100,1"), "set_subdivide_width", "get_subdivide_width");
- ADD_PROPERTY(PropertyInfo(Variant::INT, "subdivide_height", PROPERTY_HINT_RANGE, "0,100,1"), "set_subdivide_height", "get_subdivide_height");
- ADD_PROPERTY(PropertyInfo(Variant::INT, "subdivide_depth", PROPERTY_HINT_RANGE, "0,100,1"), "set_subdivide_depth", "get_subdivide_depth");
+ ADD_PROPERTY(PropertyInfo(Variant::INT, "subdivide_width", PROPERTY_HINT_RANGE, "0,100,1,or_greater"), "set_subdivide_width", "get_subdivide_width");
+ ADD_PROPERTY(PropertyInfo(Variant::INT, "subdivide_height", PROPERTY_HINT_RANGE, "0,100,1,or_greater"), "set_subdivide_height", "get_subdivide_height");
+ ADD_PROPERTY(PropertyInfo(Variant::INT, "subdivide_depth", PROPERTY_HINT_RANGE, "0,100,1,or_greater"), "set_subdivide_depth", "get_subdivide_depth");
}
void CubeMesh::set_size(const Vector3 &p_size) {
@@ -881,11 +881,11 @@ void CylinderMesh::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_rings", "rings"), &CylinderMesh::set_rings);
ClassDB::bind_method(D_METHOD("get_rings"), &CylinderMesh::get_rings);
- ADD_PROPERTY(PropertyInfo(Variant::REAL, "top_radius", PROPERTY_HINT_RANGE, "0.001,100.0,0.001"), "set_top_radius", "get_top_radius");
- ADD_PROPERTY(PropertyInfo(Variant::REAL, "bottom_radius", PROPERTY_HINT_RANGE, "0.001,100.0,0.001"), "set_bottom_radius", "get_bottom_radius");
- ADD_PROPERTY(PropertyInfo(Variant::REAL, "height", PROPERTY_HINT_RANGE, "0.001,100.0,0.001"), "set_height", "get_height");
- ADD_PROPERTY(PropertyInfo(Variant::INT, "radial_segments", PROPERTY_HINT_RANGE, "1,100,1"), "set_radial_segments", "get_radial_segments");
- ADD_PROPERTY(PropertyInfo(Variant::INT, "rings", PROPERTY_HINT_RANGE, "1,100,1"), "set_rings", "get_rings");
+ ADD_PROPERTY(PropertyInfo(Variant::REAL, "top_radius", PROPERTY_HINT_RANGE, "0.001,100.0,0.001,or_greater"), "set_top_radius", "get_top_radius");
+ ADD_PROPERTY(PropertyInfo(Variant::REAL, "bottom_radius", PROPERTY_HINT_RANGE, "0.001,100.0,0.001,or_greater"), "set_bottom_radius", "get_bottom_radius");
+ ADD_PROPERTY(PropertyInfo(Variant::REAL, "height", PROPERTY_HINT_RANGE, "0.001,100.0,0.001,or_greater"), "set_height", "get_height");
+ ADD_PROPERTY(PropertyInfo(Variant::INT, "radial_segments", PROPERTY_HINT_RANGE, "1,100,1,or_greater"), "set_radial_segments", "get_radial_segments");
+ ADD_PROPERTY(PropertyInfo(Variant::INT, "rings", PROPERTY_HINT_RANGE, "1,100,1,or_greater"), "set_rings", "get_rings");
}
void CylinderMesh::set_top_radius(const float p_radius) {
@@ -1017,8 +1017,8 @@ void PlaneMesh::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_subdivide_depth"), &PlaneMesh::get_subdivide_depth);
ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "size"), "set_size", "get_size");
- ADD_PROPERTY(PropertyInfo(Variant::INT, "subdivide_width", PROPERTY_HINT_RANGE, "0,100,1"), "set_subdivide_width", "get_subdivide_width");
- ADD_PROPERTY(PropertyInfo(Variant::INT, "subdivide_depth", PROPERTY_HINT_RANGE, "0,100,1"), "set_subdivide_depth", "get_subdivide_depth");
+ ADD_PROPERTY(PropertyInfo(Variant::INT, "subdivide_width", PROPERTY_HINT_RANGE, "0,100,1,or_greater"), "set_subdivide_width", "get_subdivide_width");
+ ADD_PROPERTY(PropertyInfo(Variant::INT, "subdivide_depth", PROPERTY_HINT_RANGE, "0,100,1,or_greater"), "set_subdivide_depth", "get_subdivide_depth");
}
void PlaneMesh::set_size(const Size2 &p_size) {
@@ -1283,9 +1283,9 @@ void PrismMesh::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::REAL, "left_to_right", PROPERTY_HINT_RANGE, "-2.0,2.0,0.1"), "set_left_to_right", "get_left_to_right");
ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "size"), "set_size", "get_size");
- ADD_PROPERTY(PropertyInfo(Variant::INT, "subdivide_width", PROPERTY_HINT_RANGE, "0,100,1"), "set_subdivide_width", "get_subdivide_width");
- ADD_PROPERTY(PropertyInfo(Variant::INT, "subdivide_height", PROPERTY_HINT_RANGE, "0,100,1"), "set_subdivide_height", "get_subdivide_height");
- ADD_PROPERTY(PropertyInfo(Variant::INT, "subdivide_depth", PROPERTY_HINT_RANGE, "0,100,1"), "set_subdivide_depth", "get_subdivide_depth");
+ ADD_PROPERTY(PropertyInfo(Variant::INT, "subdivide_width", PROPERTY_HINT_RANGE, "0,100,1,or_greater"), "set_subdivide_width", "get_subdivide_width");
+ ADD_PROPERTY(PropertyInfo(Variant::INT, "subdivide_height", PROPERTY_HINT_RANGE, "0,100,1,or_greater"), "set_subdivide_height", "get_subdivide_height");
+ ADD_PROPERTY(PropertyInfo(Variant::INT, "subdivide_depth", PROPERTY_HINT_RANGE, "0,100,1,or_greater"), "set_subdivide_depth", "get_subdivide_depth");
}
void PrismMesh::set_left_to_right(const float p_left_to_right) {
@@ -1505,10 +1505,10 @@ void SphereMesh::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_is_hemisphere", "is_hemisphere"), &SphereMesh::set_is_hemisphere);
ClassDB::bind_method(D_METHOD("get_is_hemisphere"), &SphereMesh::get_is_hemisphere);
- ADD_PROPERTY(PropertyInfo(Variant::REAL, "radius", PROPERTY_HINT_RANGE, "0.001,100.0,0.001"), "set_radius", "get_radius");
- ADD_PROPERTY(PropertyInfo(Variant::REAL, "height", PROPERTY_HINT_RANGE, "0.001,100.0,0.001"), "set_height", "get_height");
- ADD_PROPERTY(PropertyInfo(Variant::INT, "radial_segments", PROPERTY_HINT_RANGE, "1,100,1"), "set_radial_segments", "get_radial_segments");
- ADD_PROPERTY(PropertyInfo(Variant::INT, "rings", PROPERTY_HINT_RANGE, "1,100,1"), "set_rings", "get_rings");
+ ADD_PROPERTY(PropertyInfo(Variant::REAL, "radius", PROPERTY_HINT_RANGE, "0.001,100.0,0.001,or_greater"), "set_radius", "get_radius");
+ ADD_PROPERTY(PropertyInfo(Variant::REAL, "height", PROPERTY_HINT_RANGE, "0.001,100.0,0.001,or_greater"), "set_height", "get_height");
+ ADD_PROPERTY(PropertyInfo(Variant::INT, "radial_segments", PROPERTY_HINT_RANGE, "1,100,1,or_greater"), "set_radial_segments", "get_radial_segments");
+ ADD_PROPERTY(PropertyInfo(Variant::INT, "rings", PROPERTY_HINT_RANGE, "1,100,1,or_greater"), "set_rings", "get_rings");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "is_hemisphere"), "set_is_hemisphere", "get_is_hemisphere");
}
diff --git a/servers/visual/visual_server_scene.cpp b/servers/visual/visual_server_scene.cpp
index 04dcde1365..43a225b370 100644
--- a/servers/visual/visual_server_scene.cpp
+++ b/servers/visual/visual_server_scene.cpp
@@ -1674,7 +1674,8 @@ void VisualServerScene::render_camera(RID p_camera, RID p_scenario, Size2 p_view
} break;
}
- _render_scene(camera->transform, camera_matrix, ortho, camera->env, camera->visible_layers, p_scenario, p_shadow_atlas, RID(), -1);
+ _prepare_scene(camera->transform, camera_matrix, ortho, camera->env, camera->visible_layers, p_scenario, p_shadow_atlas, RID());
+ _render_scene(camera->transform, camera_matrix, ortho, camera->env, p_scenario, p_shadow_atlas, RID(), -1);
}
void VisualServerScene::render_camera(Ref<ARVRInterface> &p_interface, ARVRInterface::Eyes p_eye, RID p_camera, RID p_scenario, Size2 p_viewport_size, RID p_shadow_atlas) {
@@ -1684,7 +1685,6 @@ void VisualServerScene::render_camera(Ref<ARVRInterface> &p_interface, ARVRInter
ERR_FAIL_COND(!camera);
/* SETUP CAMERA, we are ignoring type and FOV here */
- bool ortho = false;
float aspect = p_viewport_size.width / (float)p_viewport_size.height;
CameraMatrix camera_matrix = p_interface->get_projection_for_eye(p_eye, aspect, camera->znear, camera->zfar);
@@ -1693,10 +1693,79 @@ void VisualServerScene::render_camera(Ref<ARVRInterface> &p_interface, ARVRInter
Transform world_origin = ARVRServer::get_singleton()->get_world_origin();
Transform cam_transform = p_interface->get_transform_for_eye(p_eye, world_origin);
- _render_scene(cam_transform, camera_matrix, ortho, camera->env, camera->visible_layers, p_scenario, p_shadow_atlas, RID(), -1);
+ // For stereo render we only prepare for our left eye and then reuse the outcome for our right eye
+ if (p_eye == ARVRInterface::EYE_LEFT) {
+ ///@TODO possibly move responsibility for this into our ARVRServer or ARVRInterface?
+
+ // Center our transform, we assume basis is equal.
+ Transform mono_transform = cam_transform;
+ Transform right_transform = p_interface->get_transform_for_eye(ARVRInterface::EYE_RIGHT, world_origin);
+ mono_transform.origin += right_transform.origin;
+ mono_transform.origin *= 0.5;
+
+ // We need to combine our projection frustums for culling.
+ // Ideally we should use our clipping planes for this and combine them,
+ // however our shadow map logic uses our projection matrix.
+ // Note: as our left and right frustums should be mirrored, we don't need our right projection matrix.
+
+ // - get some base values we need
+ float eye_dist = (mono_transform.origin - cam_transform.origin).length();
+ float z_near = camera_matrix.get_z_near(); // get our near plane
+ float z_far = camera_matrix.get_z_far(); // get our far plane
+ float width = (2.0 * z_near) / camera_matrix.matrix[0][0];
+ float x_shift = width * camera_matrix.matrix[2][0];
+ float height = (2.0 * z_near) / camera_matrix.matrix[1][1];
+ float y_shift = width * camera_matrix.matrix[2][1];
+
+ // printf("Eye_dist = %f, Near = %f, Far = %f, Width = %f, Shift = %f\n", eye_dist, z_near, z_far, width, x_shift);
+
+ // - calculate our near plane size (horizontal only, right_near is mirrored)
+ float left_near = -eye_dist - ((width - x_shift) * 0.5);
+
+ // - calculate our far plane size (horizontal only, right_far is mirrored)
+ float left_far = -eye_dist - (z_far * (width - x_shift) * 0.5 / z_near);
+ float left_far_right_eye = eye_dist - (z_far * (width + x_shift) * 0.5 / z_near);
+ if (left_far > left_far_right_eye) {
+ // on displays smaller then double our iod, the right eye far frustrum can overtake the left eyes.
+ left_far = left_far_right_eye;
+ }
+
+ // - figure out required z-shift
+ float slope = (left_far - left_near) / (z_far - z_near);
+ float z_shift = (left_near / slope) - z_near;
+
+ // - figure out new vertical near plane size (this will be slightly oversized thanks to our z-shift)
+ float top_near = (height + y_shift) * 0.5;
+ top_near += y_shift * z_shift;
+ float bottom_near = -(height - y_shift) * 0.5;
+ bottom_near -= y_shift * z_shift;
+
+ // printf("Left_near = %f, Left_far = %f, Top_near = %f, Bottom_near = %f, Z_shift = %f\n", left_near, left_far, top_near, bottom_near, z_shift);
+
+ // - generate our frustum
+ CameraMatrix combined_matrix;
+ combined_matrix.set_frustum(left_near, -left_near, bottom_near, top_near, z_near + z_shift, z_far + z_shift);
+
+ // and finally move our camera back
+ Transform apply_z_shift;
+ apply_z_shift.origin = Vector3(0.0, 0.0, z_shift); // z negative is forward so this moves it backwards
+ mono_transform *= apply_z_shift;
+
+ // now prepare our scene with our adjusted transform projection matrix
+ _prepare_scene(mono_transform, combined_matrix, false, camera->env, camera->visible_layers, p_scenario, p_shadow_atlas, RID());
+ } else if (p_eye == ARVRInterface::EYE_MONO) {
+ // For mono render, prepare as per usual
+ _prepare_scene(cam_transform, camera_matrix, false, camera->env, camera->visible_layers, p_scenario, p_shadow_atlas, RID());
+ }
+
+ // And render our scene...
+ _render_scene(cam_transform, camera_matrix, false, camera->env, p_scenario, p_shadow_atlas, RID(), -1);
};
-void VisualServerScene::_render_scene(const Transform p_cam_transform, const CameraMatrix &p_cam_projection, bool p_cam_orthogonal, RID p_force_environment, uint32_t p_visible_layers, RID p_scenario, RID p_shadow_atlas, RID p_reflection_probe, int p_reflection_probe_pass) {
+void VisualServerScene::_prepare_scene(const Transform p_cam_transform, const CameraMatrix &p_cam_projection, bool p_cam_orthogonal, RID p_force_environment, uint32_t p_visible_layers, RID p_scenario, RID p_shadow_atlas, RID p_reflection_probe) {
+ // Note, in stereo rendering:
+ // - p_cam_transform will be a transform in the middle of our two eyes
+ // - p_cam_projection is a wider frustrum that encompasses both eyes
Scenario *scenario = scenario_owner.getornull(p_scenario);
@@ -1713,7 +1782,7 @@ void VisualServerScene::_render_scene(const Transform p_cam_transform, const Cam
float z_far = p_cam_projection.get_z_far();
/* STEP 2 - CULL */
- int cull_count = scenario->octree.cull_convex(planes, instance_cull_result, MAX_INSTANCE_CULL);
+ instance_cull_count = scenario->octree.cull_convex(planes, instance_cull_result, MAX_INSTANCE_CULL);
light_cull_count = 0;
reflection_probe_cull_count = 0;
@@ -1731,7 +1800,7 @@ void VisualServerScene::_render_scene(const Transform p_cam_transform, const Cam
/* STEP 4 - REMOVE FURTHER CULLED OBJECTS, ADD LIGHTS */
- for (int i = 0; i < cull_count; i++) {
+ for (int i = 0; i < instance_cull_count; i++) {
Instance *ins = instance_cull_result[i];
@@ -1857,8 +1926,8 @@ void VisualServerScene::_render_scene(const Transform p_cam_transform, const Cam
if (!keep) {
// remove, no reason to keep
- cull_count--;
- SWAP(instance_cull_result[i], instance_cull_result[cull_count]);
+ instance_cull_count--;
+ SWAP(instance_cull_result[i], instance_cull_result[instance_cull_count]);
i--;
ins->last_render_pass = 0; // make invalid
} else {
@@ -1870,7 +1939,7 @@ void VisualServerScene::_render_scene(const Transform p_cam_transform, const Cam
/* STEP 5 - PROCESS LIGHTS */
RID *directional_light_ptr = &light_instance_cull_result[light_cull_count];
- int directional_light_count = 0;
+ directional_light_count = 0;
// directional lights
{
@@ -2007,6 +2076,11 @@ void VisualServerScene::_render_scene(const Transform p_cam_transform, const Cam
}
}
}
+}
+
+void VisualServerScene::_render_scene(const Transform p_cam_transform, const CameraMatrix &p_cam_projection, bool p_cam_orthogonal, RID p_force_environment, RID p_scenario, RID p_shadow_atlas, RID p_reflection_probe, int p_reflection_probe_pass) {
+
+ Scenario *scenario = scenario_owner.getornull(p_scenario);
/* ENVIRONMENT */
@@ -2018,9 +2092,9 @@ void VisualServerScene::_render_scene(const Transform p_cam_transform, const Cam
else
environment = scenario->fallback_environment;
- /* STEP 6 - PROCESS GEOMETRY AND DRAW SCENE*/
+ /* PROCESS GEOMETRY AND DRAW SCENE */
- VSG::scene_render->render_scene(p_cam_transform, p_cam_projection, p_cam_orthogonal, (RasterizerScene::InstanceBase **)instance_cull_result, cull_count, light_instance_cull_result, light_cull_count + directional_light_count, reflection_probe_instance_cull_result, reflection_probe_cull_count, environment, p_shadow_atlas, scenario->reflection_atlas, p_reflection_probe, p_reflection_probe_pass);
+ VSG::scene_render->render_scene(p_cam_transform, p_cam_projection, p_cam_orthogonal, (RasterizerScene::InstanceBase **)instance_cull_result, instance_cull_count, light_instance_cull_result, light_cull_count + directional_light_count, reflection_probe_instance_cull_result, reflection_probe_cull_count, environment, p_shadow_atlas, scenario->reflection_atlas, p_reflection_probe, p_reflection_probe_pass);
}
void VisualServerScene::render_empty_scene(RID p_scenario, RID p_shadow_atlas) {
@@ -2093,7 +2167,8 @@ bool VisualServerScene::_render_reflection_probe_step(Instance *p_instance, int
shadow_atlas = scenario->reflection_probe_shadow_atlas;
}
- _render_scene(xform, cm, false, RID(), VSG::storage->reflection_probe_get_cull_mask(p_instance->base), p_instance->scenario->self, shadow_atlas, reflection_probe->instance, p_step);
+ _prepare_scene(xform, cm, false, RID(), VSG::storage->reflection_probe_get_cull_mask(p_instance->base), p_instance->scenario->self, shadow_atlas, reflection_probe->instance);
+ _render_scene(xform, cm, false, RID(), p_instance->scenario->self, shadow_atlas, reflection_probe->instance, p_step);
} else {
//do roughness postprocess step until it believes it's done
diff --git a/servers/visual/visual_server_scene.h b/servers/visual/visual_server_scene.h
index 109cdf711c..12d732724a 100644
--- a/servers/visual/visual_server_scene.h
+++ b/servers/visual/visual_server_scene.h
@@ -434,11 +434,13 @@ public:
}
};
+ int instance_cull_count;
Instance *instance_cull_result[MAX_INSTANCE_CULL];
Instance *instance_shadow_cull_result[MAX_INSTANCE_CULL]; //used for generating shadowmaps
Instance *light_cull_result[MAX_LIGHTS_CULLED];
RID light_instance_cull_result[MAX_LIGHTS_CULLED];
int light_cull_count;
+ int directional_light_count;
RID reflection_probe_instance_cull_result[MAX_REFLECTION_PROBES_CULLED];
int reflection_probe_cull_count;
@@ -483,7 +485,8 @@ public:
_FORCE_INLINE_ void _light_instance_update_shadow(Instance *p_instance, const Transform p_cam_transform, const CameraMatrix &p_cam_projection, bool p_cam_orthogonal, RID p_shadow_atlas, Scenario *p_scenario);
- void _render_scene(const Transform p_cam_transform, const CameraMatrix &p_cam_projection, bool p_cam_orthogonal, RID p_force_environment, uint32_t p_visible_layers, RID p_scenario, RID p_shadow_atlas, RID p_reflection_probe, int p_reflection_probe_pass);
+ void _prepare_scene(const Transform p_cam_transform, const CameraMatrix &p_cam_projection, bool p_cam_orthogonal, RID p_force_environment, uint32_t p_visible_layers, RID p_scenario, RID p_shadow_atlas, RID p_reflection_probe);
+ void _render_scene(const Transform p_cam_transform, const CameraMatrix &p_cam_projection, bool p_cam_orthogonal, RID p_force_environment, RID p_scenario, RID p_shadow_atlas, RID p_reflection_probe, int p_reflection_probe_pass);
void render_empty_scene(RID p_scenario, RID p_shadow_atlas);
void render_camera(RID p_camera, RID p_scenario, Size2 p_viewport_size, RID p_shadow_atlas);