diff options
-rw-r--r-- | AUTHORS.md | 3 | ||||
-rw-r--r-- | DONORS.md | 70 | ||||
-rw-r--r-- | doc/classes/AnimationNodeBlendTree.xml | 3 | ||||
-rw-r--r-- | doc/classes/CanvasItem.xml | 9 | ||||
-rw-r--r-- | doc/classes/Object.xml | 3 | ||||
-rw-r--r-- | editor/editor_about.cpp | 4 | ||||
-rw-r--r-- | editor/editor_export.cpp | 39 | ||||
-rw-r--r-- | editor/editor_export.h | 17 | ||||
-rw-r--r-- | editor/editor_node.cpp | 5 | ||||
-rw-r--r-- | editor/editor_settings.cpp | 14 | ||||
-rw-r--r-- | editor/export_template_manager.cpp | 4 | ||||
-rw-r--r-- | editor/plugins/skeleton_3d_editor_plugin.cpp | 8 | ||||
-rw-r--r-- | modules/gdscript/gdscript_analyzer.cpp | 17 | ||||
-rw-r--r-- | modules/gdscript/gdscript_parser.cpp | 11 | ||||
-rw-r--r-- | platform/linuxbsd/export/export.cpp | 108 | ||||
-rw-r--r-- | platform/linuxbsd/export/export_plugin.cpp | 126 | ||||
-rw-r--r-- | platform/linuxbsd/export/export_plugin.h | 4 | ||||
-rw-r--r-- | platform/windows/export/export.cpp | 75 | ||||
-rw-r--r-- | platform/windows/export/export_plugin.cpp | 77 | ||||
-rw-r--r-- | platform/windows/export/export_plugin.h | 2 | ||||
-rw-r--r-- | scene/gui/progress_bar.cpp | 2 | ||||
-rw-r--r-- | scene/main/canvas_item.cpp | 1 |
22 files changed, 308 insertions, 294 deletions
diff --git a/AUTHORS.md b/AUTHORS.md index 07a67de77b..4d52e3d1e0 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -197,6 +197,7 @@ name is available. Ray Koopa (RayKoopa) Rémi Verschelde (akien-mga) Rhody Lugo (rraallvv) + Ricardo Buring (rburing) Ricardo Subtil (Ev1lbl0w) Roberto F. Arroyo (robfram) Robin Hübner (profan) @@ -232,7 +233,7 @@ name is available. Wilson E. Alvarez (Rubonnek) Xavier Cho (mysticfall) yg2f (SuperUserNameMan) - Yuri Roubinsky (Chaosus) + Yuri Rubinsky (Chaosus) Yuri Sizov (pycbouh) Zae Chao (zaevi) Zak Stam (zaksnet) @@ -22,7 +22,6 @@ generous deed immortalized in the next stable release of Godot Engine. ## Silver sponsors ASIFA-Hollywood <https://www.asifa-hollywood.org> - LITSLINK <https://litslink.com> ORE System <https://ore-system.com> ## Bronze sponsors @@ -36,8 +35,9 @@ generous deed immortalized in the next stable release of Godot Engine. Hunter Dickson Kitcat490 Kyle Szklenski + Maxim Karsten Moonwards <https://www.moonwards.com> - TrampolineTales <http://trampolinetales.com> + TrampolineTales <https://trampolinetales.com> ## Mini sponsors @@ -49,7 +49,6 @@ generous deed immortalized in the next stable release of Godot Engine. Christian Baune Christopher Montesano Christopher Shifflett - CodeLikeCammy Daniel Edwards Darrin Massena David Mydlarz @@ -69,8 +68,8 @@ generous deed immortalized in the next stable release of Godot Engine. Kossi Selom Banybah Marcel Kräml Marek Belski + Markus Ort Matthieu Huvé - Maxim Karsten Michael Mike King Nassor Paulino da Silva @@ -124,14 +123,12 @@ generous deed immortalized in the next stable release of Godot Engine. Mathieu Matthew Hillier Officine Pixel S.n.c. - Patrick Brock Pedro Silva Retro Village Rob Messick Roland Fredenhagen Ronan Zeegers Sarksus - Scott B Sean Sergey Sofox @@ -145,6 +142,7 @@ generous deed immortalized in the next stable release of Godot Engine. Victor Xeno Coliseum + Adam Mill Adam Nakonieczny Adam Nelson Adrian Adamiak @@ -160,14 +158,12 @@ generous deed immortalized in the next stable release of Godot Engine. Antoni Batchelli Arch Henderson III Arthur S. Muszynski - Brandon Hawkinson + c64cosmin Cameron Connolly - Carl Kryschi Charlie Whitfield Chase Taranto Chris Petrich Chris Serino - Cow Craig Ostrin Craig Scarborough Craig Smith @@ -180,6 +176,7 @@ generous deed immortalized in the next stable release of Godot Engine. Daniel Hernández Alcojor Daniel Tebbutt Darrian Little + Daylon Dennis Belfrage Dev To be curious Dima Fedotov @@ -187,6 +184,7 @@ generous deed immortalized in the next stable release of Godot Engine. Dmitriy Khudorozhkov Donn Eddy Douglas Hammond + EerieExpanse Eric Brand Eugenio Hugo Salgüero Jáñez EXUREI @@ -198,7 +196,6 @@ generous deed immortalized in the next stable release of Godot Engine. Gabrielius Vaiškūnas Gary Hulst gavlig - General Chicken Geoffroy Warin GGGames.org gisora @@ -207,7 +204,7 @@ generous deed immortalized in the next stable release of Godot Engine. Harry Tumber Harvey Fong Heath Hayes - Horváth Péter + Horváth-Lázár Péter Hu Hund Hunter Barabas HurrieCrane @@ -219,6 +216,7 @@ generous deed immortalized in the next stable release of Godot Engine. Jean-Sébastien Ross Jennifer Wilcox Jeremi Biernacki + Jesús Chicharro Joel Fivat Johnathan Kupferer Josef Stumpfegger @@ -243,6 +241,7 @@ generous deed immortalized in the next stable release of Godot Engine. Leo Fidel R Liban Liam Smyth LoparPanda + LordZaruflex Luca Vazzano Luke MadScientistCarl @@ -256,17 +255,17 @@ generous deed immortalized in the next stable release of Godot Engine. matt Matt Greene Matthew Hall + Max Kryschi medecau Michael Dürwald Michael Policastro - Michael Seawell + Miika Moilanen MikadoSC Mike Barbee nate etan Nick Abousselam Nicola Cocchiaro Nicolás Carrasco - Nicole Barovic Oliver Dick Oscar Campos Paul Hocker @@ -291,6 +290,7 @@ generous deed immortalized in the next stable release of Godot Engine. Romeo Disca Ronnie Ashlock Ronny Mühle + Russ Ryan Breaker Ryan Heath Ryan Scott @@ -314,7 +314,6 @@ generous deed immortalized in the next stable release of Godot Engine. Sven F. Thomas Bjarnelöf Thomas Kurz - Tim Howard Timothy van der Valk Tobias Bocanegra Tobias Raggl @@ -326,7 +325,6 @@ generous deed immortalized in the next stable release of Godot Engine. Turntsnaco Valryia Vincent Cloutier - Vlad Ceru Opran VoidPointer Winston Wojciech Chojnacki @@ -353,6 +351,7 @@ generous deed immortalized in the next stable release of Godot Engine. Aidan O'Flannagain Aki Mimoto Alan Beauchamp + Albert Gyulgazyan Alberto Salazar Muñoz Alberto Vilches Alder Stefano @@ -360,7 +359,6 @@ generous deed immortalized in the next stable release of Godot Engine. AleMax Ales Jelovcan Alessandro Senese - Alexander Ravenheart Alex Chan Alex Clavelle alex raeside @@ -389,10 +387,9 @@ generous deed immortalized in the next stable release of Godot Engine. AzulCrescent b110110 Balázs Batári - Bálint Horváth Beau Seymour + Behzad Ghaffari Benedikt - Benoit Jauvin-Girard Ben Ridley Ben Vercammen Bernd Jänichen @@ -411,9 +408,9 @@ generous deed immortalized in the next stable release of Godot Engine. Brodie Fairhall Bronson Zgeb Burney Waring - c64cosmin Caleb Gartner Caleb Makela + Caliburn Cameron Meyer Carlos Rios Carl van der Geest @@ -421,7 +418,7 @@ generous deed immortalized in the next stable release of Godot Engine. Cassidy James Chad Steadman Checkpoint Charlie - Chris Chapin + ChrBohm Chris Jagusch Chris Langford Christian Mauduit @@ -430,15 +427,14 @@ generous deed immortalized in the next stable release of Godot Engine. Christophe Gagnier Christopher Chin Christoph Woinke + Codecat Cody Parker - CoffeeFingers Conall O Conner Lane Corchari - Craig Maloney + Corey W Craig Post Dakota Watkins - damucz Daniel Cheney Daren Scot Wilson Dave Walker @@ -450,18 +446,17 @@ generous deed immortalized in the next stable release of Godot Engine. Devin Carraway Diego Pereira Dimitri Roche - Dmitry Fisher (Raccoon path) Dmytro Korchynskyi Dominik Wetzel Don B Douglas Plumley Dragontrapper Dr Ewan Murray + Ducky Duobix Duodecimal Eduardo Teixeira Edward Herbert - Edward L Edward Swartz Egon Elbre Elgenzay @@ -496,18 +491,17 @@ generous deed immortalized in the next stable release of Godot Engine. Greg Olson Greyson Richey Grid - Grok Games Grominet Guillaume Pham Ngoc Guldoman + Guo Hongci gurehamu Hal A Haplo Hayden Foley Heribert Hirth Hinken - Houdini Blueprints - Ian ORourke + Ian Richard Kunert Ian Williams Idilio Alfaro IndustrialRobot @@ -543,6 +537,7 @@ generous deed immortalized in the next stable release of Godot Engine. Joe Hurdle Joe Klemmer Joel Höglund + John Anders Stav John Bruce John Gabriel Jonas @@ -566,6 +561,7 @@ generous deed immortalized in the next stable release of Godot Engine. Josh P Josh Taylor Joshua Heidrich + Joshua Segall jromkjrom Juanfran Juan Maggi @@ -575,10 +571,10 @@ generous deed immortalized in the next stable release of Godot Engine. Julian Murgia June Little Justin Hamilton - Justin Hurst Justin Oaksford Justin Spedding KaDokta + Karol Wojtasiuk (Drakonter) Katsuomi Kobayashi Keedong Park keeganstoybox @@ -607,11 +603,11 @@ generous deed immortalized in the next stable release of Godot Engine. Laurent CHEA Laurent Dethoor Laxman Pradhan + Leland Vakarian LEMMiNO Leonardo Dimano Linus Lind Lundgren Logan Apple - Luca Poli Ludovic DELVAL Luigi Renna Luis Gaemperle @@ -624,14 +620,13 @@ generous deed immortalized in the next stable release of Godot Engine. Mark Malone Markus Martin Markus Michael Egger - Markus Ort Markus Strompen Martin FIbik Martin Holas + Martin Linklater Martin Liška Martin Trbola Martin Zabinski - Mathieu Meissonnier Matt Edwards Matthew Booe Matt Sylvia @@ -652,7 +647,6 @@ generous deed immortalized in the next stable release of Godot Engine. Michał Skwarek Mikael Nordenberg Mikayla - Mike Mike Birkhead Mike Copley Mitchell @@ -662,7 +656,6 @@ generous deed immortalized in the next stable release of Godot Engine. Molinghu Molly Jameson MoltenGears - Moowool moulefrite MrAZIE Mrjemandem @@ -683,16 +676,16 @@ generous deed immortalized in the next stable release of Godot Engine. Nils Nordmark Nima Farid Noel Billig + Noesis oceoh Okatima Oleg Reva Oliver Ambrose - Oriol Muñoz Princep oscar1000108 Oscar Domingo - p Pascal Patrick Indermühle + Patrickm Patrick Nafarrete Patrick Wuttke Paul E Hansen @@ -719,7 +712,6 @@ generous deed immortalized in the next stable release of Godot Engine. Rammeow RAMupgrade red1939 - Relintai Remi Rampin Reneator René Habermann @@ -728,6 +720,7 @@ generous deed immortalized in the next stable release of Godot Engine. Richard Ivánek Richard Néveri Riley + Robin Ward RobotCritter Rob Ruana Rodrigo Loli @@ -739,6 +732,7 @@ generous deed immortalized in the next stable release of Godot Engine. Ronan Roy Scayged Ryan Groom + Rykk Sam Caulfield Sam Edson Sammy Fischer @@ -766,10 +760,10 @@ generous deed immortalized in the next stable release of Godot Engine. slavfox smbe19 smo1704 + Snippytorque Soheib El-Harrache Solene Waked Sophie Winter - Spencer Everhart Squirrel Stéphane Roussel Stephen Rice diff --git a/doc/classes/AnimationNodeBlendTree.xml b/doc/classes/AnimationNodeBlendTree.xml index 20eb349363..fcdd09f144 100644 --- a/doc/classes/AnimationNodeBlendTree.xml +++ b/doc/classes/AnimationNodeBlendTree.xml @@ -4,7 +4,8 @@ [AnimationTree] node resource that contains many blend type nodes. </brief_description> <description> - This node may contain a sub-tree of any other blend type nodes, such as mix, blend2, blend3, one shot, etc. This is one of the most commonly used roots. + This node may contain a sub-tree of any other blend type nodes, such as [AnimationNodeTransition], [AnimationNodeBlend2], [AnimationNodeBlend3], [AnimationNodeOneShot], etc. This is one of the most commonly used roots. + An [AnimationNodeOutput] node named [code]output[/code] is created by default. </description> <tutorials> <link title="AnimationTree">$DOCS_URL/tutorials/animation/animation_tree.html</link> diff --git a/doc/classes/CanvasItem.xml b/doc/classes/CanvasItem.xml index 060d685ece..1fe2f5a756 100644 --- a/doc/classes/CanvasItem.xml +++ b/doc/classes/CanvasItem.xml @@ -439,14 +439,14 @@ <return type="void" /> <argument index="0" name="enable" type="bool" /> <description> - If [code]enable[/code] is [code]true[/code], children will be updated with local transform data. + If [code]enable[/code] is [code]true[/code], this node will receive [constant NOTIFICATION_LOCAL_TRANSFORM_CHANGED] when its local transform changes. </description> </method> <method name="set_notify_transform"> <return type="void" /> <argument index="0" name="enable" type="bool" /> <description> - If [code]enable[/code] is [code]true[/code], children will be updated with global transform data. + If [code]enable[/code] is [code]true[/code], this node will receive [constant NOTIFICATION_TRANSFORM_CHANGED] when its global transform changes. </description> </method> <method name="show"> @@ -524,7 +524,10 @@ </signals> <constants> <constant name="NOTIFICATION_TRANSFORM_CHANGED" value="2000"> - The [CanvasItem]'s transform has changed. This notification is only received if enabled by [method set_notify_transform] or [method set_notify_local_transform]. + The [CanvasItem]'s global transform has changed. This notification is only received if enabled by [method set_notify_transform]. + </constant> + <constant name="NOTIFICATION_LOCAL_TRANSFORM_CHANGED" value="35"> + The [CanvasItem]'s local transform has changed. This notification is only received if enabled by [method set_notify_local_transform]. </constant> <constant name="NOTIFICATION_DRAW" value="30"> The [CanvasItem] is requested to draw. diff --git a/doc/classes/Object.xml b/doc/classes/Object.xml index a57101b62d..d09f3a2b0d 100644 --- a/doc/classes/Object.xml +++ b/doc/classes/Object.xml @@ -53,7 +53,8 @@ <method name="_init" qualifiers="virtual"> <return type="void" /> <description> - Called when the object is initialized. + Called when the object is initialized in memory. Can be defined to take in parameters, that are passed in when constructing. + [b]Note:[/b] If [method _init] is defined with required parameters, then explicit construction is the only valid means of creating an Object of the class. If any other means (such as [method PackedScene.instantiate]) is used, then initialization will fail. </description> </method> <method name="_notification" qualifiers="virtual"> diff --git a/editor/editor_about.cpp b/editor/editor_about.cpp index 9b6e2698b6..5beda7d907 100644 --- a/editor/editor_about.cpp +++ b/editor/editor_about.cpp @@ -43,10 +43,10 @@ void EditorAbout::_theme_changed() { const int font_size = get_theme_font_size(SNAME("source_size"), SNAME("EditorFonts")); _tpl_text->add_theme_font_override("normal_font", font); _tpl_text->add_theme_font_size_override("normal_font_size", font_size); - _tpl_text->add_theme_constant_override("line_separation", 6 * EDSCALE); + _tpl_text->add_theme_constant_override("line_separation", 4 * EDSCALE); _license_text->add_theme_font_override("normal_font", font); _license_text->add_theme_font_size_override("normal_font_size", font_size); - _license_text->add_theme_constant_override("line_separation", 6 * EDSCALE); + _license_text->add_theme_constant_override("line_separation", 4 * EDSCALE); _logo->set_texture(get_theme_icon(SNAME("Logo"), SNAME("EditorIcons"))); } diff --git a/editor/editor_export.cpp b/editor/editor_export.cpp index 3c2c7232f8..afb5bd9d4d 100644 --- a/editor/editor_export.cpp +++ b/editor/editor_export.cpp @@ -1819,23 +1819,6 @@ bool EditorExportPlatformPC::can_export(const Ref<EditorExportPreset> &p_preset, return valid; } -List<String> EditorExportPlatformPC::get_binary_extensions(const Ref<EditorExportPreset> &p_preset) const { - List<String> list; - for (const KeyValue<String, String> &E : extensions) { - if (p_preset->get(E.key)) { - list.push_back(extensions[E.key]); - return list; - } - } - - if (extensions.has("default")) { - list.push_back(extensions["default"]); - return list; - } - - return list; -} - Error EditorExportPlatformPC::export_project(const Ref<EditorExportPreset> &p_preset, bool p_debug, const String &p_path, int p_flags) { ExportNotifier notifier(*this, p_preset, p_debug, p_path, p_flags); @@ -1890,10 +1873,7 @@ Error EditorExportPlatformPC::export_project(const Ref<EditorExportPreset> &p_pr return ERR_INVALID_PARAMETER; } - FixUpEmbeddedPckFunc fixup_func = get_fixup_embedded_pck_func(); - if (fixup_func) { - err = fixup_func(p_path, embedded_pos, embedded_size); - } + err = fixup_embedded_pck(p_path, embedded_pos, embedded_size); } if (err == OK && !so_files.is_empty()) { @@ -1930,10 +1910,6 @@ Error EditorExportPlatformPC::sign_shared_object(const Ref<EditorExportPreset> & return OK; } -void EditorExportPlatformPC::set_extension(const String &p_extension, const String &p_feature_key) { - extensions[p_feature_key] = p_extension; -} - void EditorExportPlatformPC::set_name(const String &p_name) { name = p_name; } @@ -1984,19 +1960,6 @@ void EditorExportPlatformPC::set_chmod_flags(int p_flags) { chmod_flags = p_flags; } -EditorExportPlatformPC::FixUpEmbeddedPckFunc EditorExportPlatformPC::get_fixup_embedded_pck_func() const { - return fixup_embedded_pck_func; -} - -void EditorExportPlatformPC::set_fixup_embedded_pck_func(FixUpEmbeddedPckFunc p_fixup_embedded_pck_func) { - fixup_embedded_pck_func = p_fixup_embedded_pck_func; -} - -EditorExportPlatformPC::EditorExportPlatformPC() { - chmod_flags = -1; - fixup_embedded_pck_func = nullptr; -} - /////////////////////// void EditorExportTextSceneToBinaryPlugin::_export_file(const String &p_path, const String &p_type, const Set<String> &p_features) { diff --git a/editor/editor_export.h b/editor/editor_export.h index d9039f601e..108abab29b 100644 --- a/editor/editor_export.h +++ b/editor/editor_export.h @@ -421,23 +421,17 @@ public: class EditorExportPlatformPC : public EditorExportPlatform { GDCLASS(EditorExportPlatformPC, EditorExportPlatform); -public: - typedef Error (*FixUpEmbeddedPckFunc)(const String &p_path, int64_t p_embedded_start, int64_t p_embedded_size); - private: Ref<ImageTexture> logo; String name; String os_name; - Map<String, String> extensions; String release_file_32; String release_file_64; String debug_file_32; String debug_file_64; - int chmod_flags; - - FixUpEmbeddedPckFunc fixup_embedded_pck_func; + int chmod_flags = -1; public: virtual void get_preset_features(const Ref<EditorExportPreset> &p_preset, List<String> *r_features) override; @@ -449,11 +443,9 @@ public: virtual Ref<Texture2D> get_logo() const override; virtual bool can_export(const Ref<EditorExportPreset> &p_preset, String &r_error, bool &r_missing_templates) const override; - virtual List<String> get_binary_extensions(const Ref<EditorExportPreset> &p_preset) const override; virtual Error export_project(const Ref<EditorExportPreset> &p_preset, bool p_debug, const String &p_path, int p_flags = 0) override; virtual Error sign_shared_object(const Ref<EditorExportPreset> &p_preset, bool p_debug, const String &p_path); - void set_extension(const String &p_extension, const String &p_feature_key = "default"); void set_name(const String &p_name); void set_os_name(const String &p_name); @@ -471,10 +463,9 @@ public: int get_chmod_flags() const; void set_chmod_flags(int p_flags); - FixUpEmbeddedPckFunc get_fixup_embedded_pck_func() const; - void set_fixup_embedded_pck_func(FixUpEmbeddedPckFunc p_fixup_embedded_pck_func); - - EditorExportPlatformPC(); + virtual Error fixup_embedded_pck(const String &p_path, int64_t p_embedded_start, int64_t p_embedded_size) const { + return Error::OK; + } }; class EditorExportTextSceneToBinaryPlugin : public EditorExportPlugin { diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index d01dfb5361..bf118b8e16 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -707,7 +707,10 @@ void EditorNode::_notification(int p_what) { bool theme_changed = EditorSettings::get_singleton()->check_changed_settings_in_group("interface/theme") || - EditorSettings::get_singleton()->check_changed_settings_in_group("text_editor/theme"); + EditorSettings::get_singleton()->check_changed_settings_in_group("text_editor/theme") || + EditorSettings::get_singleton()->check_changed_settings_in_group("interface/editor/font") || + EditorSettings::get_singleton()->check_changed_settings_in_group("interface/editor/main_font") || + EditorSettings::get_singleton()->check_changed_settings_in_group("interface/editor/code_font"); if (theme_changed) { theme = create_custom_theme(theme_base->get_theme()); diff --git a/editor/editor_settings.cpp b/editor/editor_settings.cpp index 2d80fe85f8..08cc957ec7 100644 --- a/editor/editor_settings.cpp +++ b/editor/editor_settings.cpp @@ -404,12 +404,12 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) { const String display_scale_hint_string = vformat("Auto (%d%%),75%%,100%%,125%%,150%%,175%%,200%%,Custom", Math::round(get_auto_display_scale() * 100)); EDITOR_SETTING_USAGE(Variant::INT, PROPERTY_HINT_ENUM, "interface/editor/display_scale", 0, display_scale_hint_string, PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED) - _initial_set("interface/editor/enable_debugging_pseudolocalization", false); - set_restart_if_changed("interface/editor/enable_debugging_pseudolocalization", true); + _initial_set("interface/editor/debug/enable_pseudolocalization", false); + set_restart_if_changed("interface/editor/debug/enable_pseudolocalization", true); // Use pseudolocalization in editor. EDITOR_SETTING_USAGE(Variant::FLOAT, PROPERTY_HINT_RANGE, "interface/editor/custom_display_scale", 1.0, "0.5,3,0.01", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED) - EDITOR_SETTING_USAGE(Variant::INT, PROPERTY_HINT_RANGE, "interface/editor/main_font_size", 14, "8,48,1", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED) + EDITOR_SETTING(Variant::INT, PROPERTY_HINT_RANGE, "interface/editor/main_font_size", 14, "8,48,1") EDITOR_SETTING(Variant::INT, PROPERTY_HINT_RANGE, "interface/editor/code_font_size", 14, "8,48,1") EDITOR_SETTING(Variant::INT, PROPERTY_HINT_ENUM, "interface/editor/code_font_contextual_ligatures", 0, "Default,Disable Contextual Alternates (Coding Ligatures),Use Custom OpenType Feature Set") _initial_set("interface/editor/code_font_custom_opentype_features", ""); @@ -535,7 +535,7 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) { // Appearance: Whitespace _initial_set("text_editor/appearance/whitespace/draw_tabs", true); _initial_set("text_editor/appearance/whitespace/draw_spaces", false); - EDITOR_SETTING(Variant::INT, PROPERTY_HINT_RANGE, "text_editor/appearance/whitespace/line_spacing", 6, "0,50,1") + EDITOR_SETTING(Variant::INT, PROPERTY_HINT_RANGE, "text_editor/appearance/whitespace/line_spacing", 4, "0,50,1") // Behavior // Behavior: Navigation @@ -716,6 +716,10 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) { // Profiler _initial_set("debugger/profiler_frame_history_size", 600); + // HTTP Proxy + _initial_set("network/http_proxy/host", ""); + EDITOR_SETTING(Variant::INT, PROPERTY_HINT_RANGE, "network/http_proxy/port", 8080, "1,65535,1") + /* Extra config */ EDITOR_SETTING(Variant::INT, PROPERTY_HINT_ENUM, "project_manager/sorting_order", 0, "Name,Path,Last Edited") @@ -887,7 +891,7 @@ fail: } void EditorSettings::setup_language() { - TranslationServer::get_singleton()->set_editor_pseudolocalization(get("interface/editor/enable_debugging_pseudolocalization")); + TranslationServer::get_singleton()->set_editor_pseudolocalization(get("interface/editor/debug/enable_pseudolocalization")); String lang = get("interface/editor/editor_language"); if (lang == "en") { return; // Default, nothing to do. diff --git a/editor/export_template_manager.cpp b/editor/export_template_manager.cpp index df3e73267e..7320f957c9 100644 --- a/editor/export_template_manager.cpp +++ b/editor/export_template_manager.cpp @@ -147,8 +147,8 @@ void ExportTemplateManager::_download_template(const String &p_url, bool p_skip_ download_templates->set_download_file(EditorPaths::get_singleton()->get_cache_dir().plus_file("tmp_templates.tpz")); download_templates->set_use_threads(true); - const String proxy_host = EDITOR_DEF("network/http_proxy/host", ""); - const int proxy_port = EDITOR_DEF("network/http_proxy/port", -1); + const String proxy_host = EDITOR_GET("network/http_proxy/host"); + const int proxy_port = EDITOR_GET("network/http_proxy/port"); download_templates->set_http_proxy(proxy_host, proxy_port); download_templates->set_https_proxy(proxy_host, proxy_port); diff --git a/editor/plugins/skeleton_3d_editor_plugin.cpp b/editor/plugins/skeleton_3d_editor_plugin.cpp index ef171e9115..065683d632 100644 --- a/editor/plugins/skeleton_3d_editor_plugin.cpp +++ b/editor/plugins/skeleton_3d_editor_plugin.cpp @@ -419,8 +419,14 @@ PhysicalBone3D *Skeleton3DEditor::create_physical_bone(int bone_id, int bone_chi capsule_transform.basis = Basis(Vector3(1, 0, 0), Vector3(0, 0, 1), Vector3(0, -1, 0)); bone_shape->set_transform(capsule_transform); + /// Get an up vector not collinear with child rest origin + Vector3 up = Vector3(0, 1, 0); + if (up.cross(child_rest.origin).is_equal_approx(Vector3())) { + up = Vector3(0, 0, 1); + } + Transform3D body_transform; - body_transform.basis = Basis::looking_at(child_rest.origin); + body_transform.basis = Basis::looking_at(child_rest.origin, up); body_transform.origin = body_transform.basis.xform(Vector3(0, 0, -half_height)); Transform3D joint_transform; diff --git a/modules/gdscript/gdscript_analyzer.cpp b/modules/gdscript/gdscript_analyzer.cpp index 326720ce86..af3d65d4d6 100644 --- a/modules/gdscript/gdscript_analyzer.cpp +++ b/modules/gdscript/gdscript_analyzer.cpp @@ -277,6 +277,7 @@ Error GDScriptAnalyzer::resolve_inheritance(GDScriptParser::ClassNode *p_class, base = parser->get_parser()->head->get_datatype(); } else { if (p_class->extends.is_empty()) { + push_error("Could not resolve an empty super class path.", p_class); return ERR_PARSE_ERROR; } const StringName &name = p_class->extends[extends_index++]; @@ -1124,6 +1125,10 @@ void GDScriptAnalyzer::resolve_function_signature(GDScriptParser::FunctionNode * GDScriptParser::FunctionNode *previous_function = parser->current_function; parser->current_function = p_function; +#ifdef TOOLS_ENABLED + int default_value_count = 0; +#endif // TOOLS_ENABLED + for (int i = 0; i < p_function->parameters.size(); i++) { resolve_parameter(p_function->parameters[i]); #ifdef DEBUG_ENABLED @@ -1133,8 +1138,12 @@ void GDScriptAnalyzer::resolve_function_signature(GDScriptParser::FunctionNode * is_shadowing(p_function->parameters[i]->identifier, "function parameter"); #endif // DEBUG_ENABLED #ifdef TOOLS_ENABLED - if (p_function->parameters[i]->default_value && p_function->parameters[i]->default_value->is_constant) { - p_function->default_arg_values.push_back(p_function->parameters[i]->default_value->reduced_value); + if (p_function->parameters[i]->default_value) { + default_value_count++; + + if (p_function->parameters[i]->default_value->is_constant) { + p_function->default_arg_values.push_back(p_function->parameters[i]->default_value->reduced_value); + } } #endif // TOOLS_ENABLED } @@ -1169,7 +1178,7 @@ void GDScriptAnalyzer::resolve_function_signature(GDScriptParser::FunctionNode * int par_count_diff = p_function->parameters.size() - parameters_types.size(); valid = valid && par_count_diff >= 0; - valid = valid && p_function->default_arg_values.size() >= default_par_count + par_count_diff; + valid = valid && default_value_count >= default_par_count + par_count_diff; int i = 0; for (const GDScriptParser::DataType &par_type : parameters_types) { @@ -1203,7 +1212,7 @@ void GDScriptAnalyzer::resolve_function_signature(GDScriptParser::FunctionNode * push_error(vformat(R"(The function signature doesn't match the parent. Parent signature is "%s".)", parent_signature), p_function); } } -#endif +#endif // TOOLS_ENABLED } parser->current_function = previous_function; diff --git a/modules/gdscript/gdscript_parser.cpp b/modules/gdscript/gdscript_parser.cpp index 725b62f6d6..10709d3667 100644 --- a/modules/gdscript/gdscript_parser.cpp +++ b/modules/gdscript/gdscript_parser.cpp @@ -1380,6 +1380,7 @@ GDScriptParser::AnnotationNode *GDScriptParser::parse_annotation(uint32_t p_vali push_completion_call(annotation); make_completion_context(COMPLETION_ANNOTATION_ARGUMENTS, annotation, 0, true); if (!check(GDScriptTokenizer::Token::PARENTHESIS_CLOSE) && !is_at_end()) { + push_multiline(true); int argument_index = 0; do { make_completion_context(COMPLETION_ANNOTATION_ARGUMENTS, annotation, argument_index, true); @@ -1391,6 +1392,7 @@ GDScriptParser::AnnotationNode *GDScriptParser::parse_annotation(uint32_t p_vali } annotation->arguments.push_back(argument); } while (match(GDScriptTokenizer::Token::COMMA)); + pop_multiline(); consume(GDScriptTokenizer::Token::PARENTHESIS_CLOSE, R"*(Expected ")" after annotation arguments.)*"); } @@ -3480,6 +3482,15 @@ template <PropertyHint t_hint, Variant::Type t_type> bool GDScriptParser::export_annotations(const AnnotationNode *p_annotation, Node *p_node) { ERR_FAIL_COND_V_MSG(p_node->type != Node::VARIABLE, false, vformat(R"("%s" annotation can only be applied to variables.)", p_annotation->name)); + { + const int max_flags = 32; + + if (t_hint == PropertyHint::PROPERTY_HINT_FLAGS && p_annotation->resolved_arguments.size() > max_flags) { + push_error(vformat(R"(The argument count limit for "@export_flags" is exceeded (%d/%d).)", p_annotation->resolved_arguments.size(), max_flags), p_annotation); + return false; + } + } + VariableNode *variable = static_cast<VariableNode *>(p_node); if (variable->exported) { push_error(vformat(R"(Annotation "%s" cannot be used with another "@export" annotation.)", p_annotation->name), p_annotation); diff --git a/platform/linuxbsd/export/export.cpp b/platform/linuxbsd/export/export.cpp index 796e82594a..e5caff2860 100644 --- a/platform/linuxbsd/export/export.cpp +++ b/platform/linuxbsd/export/export.cpp @@ -32,8 +32,6 @@ #include "export_plugin.h" -static Error fixup_embedded_pck(const String &p_path, int64_t p_embedded_start, int64_t p_embedded_size); - void register_linuxbsd_exporter() { Ref<EditorExportPlatformLinuxBSD> platform; platform.instantiate(); @@ -52,112 +50,6 @@ void register_linuxbsd_exporter() { platform->set_debug_64("linux_x11_64_debug"); platform->set_os_name("LinuxBSD"); platform->set_chmod_flags(0755); - platform->set_fixup_embedded_pck_func(&fixup_embedded_pck); EditorExport::get_singleton()->add_export_platform(platform); } - -static Error fixup_embedded_pck(const String &p_path, int64_t p_embedded_start, int64_t p_embedded_size) { - // Patch the header of the "pck" section in the ELF file so that it corresponds to the embedded data - - FileAccess *f = FileAccess::open(p_path, FileAccess::READ_WRITE); - if (!f) { - return ERR_CANT_OPEN; - } - - // Read and check ELF magic number - { - uint32_t magic = f->get_32(); - if (magic != 0x464c457f) { // 0x7F + "ELF" - f->close(); - return ERR_FILE_CORRUPT; - } - } - - // Read program architecture bits from class field - - int bits = f->get_8() * 32; - - if (bits == 32 && p_embedded_size >= 0x100000000) { - f->close(); - ERR_FAIL_V_MSG(ERR_INVALID_DATA, "32-bit executables cannot have embedded data >= 4 GiB."); - } - - // Get info about the section header table - - int64_t section_table_pos; - int64_t section_header_size; - if (bits == 32) { - section_header_size = 40; - f->seek(0x20); - section_table_pos = f->get_32(); - f->seek(0x30); - } else { // 64 - section_header_size = 64; - f->seek(0x28); - section_table_pos = f->get_64(); - f->seek(0x3c); - } - int num_sections = f->get_16(); - int string_section_idx = f->get_16(); - - // Load the strings table - uint8_t *strings; - { - // Jump to the strings section header - f->seek(section_table_pos + string_section_idx * section_header_size); - - // Read strings data size and offset - int64_t string_data_pos; - int64_t string_data_size; - if (bits == 32) { - f->seek(f->get_position() + 0x10); - string_data_pos = f->get_32(); - string_data_size = f->get_32(); - } else { // 64 - f->seek(f->get_position() + 0x18); - string_data_pos = f->get_64(); - string_data_size = f->get_64(); - } - - // Read strings data - f->seek(string_data_pos); - strings = (uint8_t *)memalloc(string_data_size); - if (!strings) { - f->close(); - return ERR_OUT_OF_MEMORY; - } - f->get_buffer(strings, string_data_size); - } - - // Search for the "pck" section - - bool found = false; - for (int i = 0; i < num_sections; ++i) { - int64_t section_header_pos = section_table_pos + i * section_header_size; - f->seek(section_header_pos); - - uint32_t name_offset = f->get_32(); - if (strcmp((char *)strings + name_offset, "pck") == 0) { - // "pck" section found, let's patch! - - if (bits == 32) { - f->seek(section_header_pos + 0x10); - f->store_32(p_embedded_start); - f->store_32(p_embedded_size); - } else { // 64 - f->seek(section_header_pos + 0x18); - f->store_64(p_embedded_start); - f->store_64(p_embedded_size); - } - - found = true; - break; - } - } - - memfree(strings); - f->close(); - - return found ? OK : ERR_FILE_CORRUPT; -} diff --git a/platform/linuxbsd/export/export_plugin.cpp b/platform/linuxbsd/export/export_plugin.cpp index 99f5b82b34..08fc9c0452 100644 --- a/platform/linuxbsd/export/export_plugin.cpp +++ b/platform/linuxbsd/export/export_plugin.cpp @@ -72,3 +72,129 @@ Error EditorExportPlatformLinuxBSD::export_project(const Ref<EditorExportPreset> return err; } + +void EditorExportPlatformLinuxBSD::set_extension(const String &p_extension, const String &p_feature_key) { + extensions[p_feature_key] = p_extension; +} + +List<String> EditorExportPlatformLinuxBSD::get_binary_extensions(const Ref<EditorExportPreset> &p_preset) const { + List<String> list; + for (const KeyValue<String, String> &E : extensions) { + if (p_preset->get(E.key)) { + list.push_back(extensions[E.key]); + return list; + } + } + + if (extensions.has("default")) { + list.push_back(extensions["default"]); + return list; + } + + return list; +} + +Error EditorExportPlatformLinuxBSD::fixup_embedded_pck(const String &p_path, int64_t p_embedded_start, int64_t p_embedded_size) const { + // Patch the header of the "pck" section in the ELF file so that it corresponds to the embedded data + + FileAccess *f = FileAccess::open(p_path, FileAccess::READ_WRITE); + if (!f) { + return ERR_CANT_OPEN; + } + + // Read and check ELF magic number + { + uint32_t magic = f->get_32(); + if (magic != 0x464c457f) { // 0x7F + "ELF" + f->close(); + return ERR_FILE_CORRUPT; + } + } + + // Read program architecture bits from class field + + int bits = f->get_8() * 32; + + if (bits == 32 && p_embedded_size >= 0x100000000) { + f->close(); + ERR_FAIL_V_MSG(ERR_INVALID_DATA, "32-bit executables cannot have embedded data >= 4 GiB."); + } + + // Get info about the section header table + + int64_t section_table_pos; + int64_t section_header_size; + if (bits == 32) { + section_header_size = 40; + f->seek(0x20); + section_table_pos = f->get_32(); + f->seek(0x30); + } else { // 64 + section_header_size = 64; + f->seek(0x28); + section_table_pos = f->get_64(); + f->seek(0x3c); + } + int num_sections = f->get_16(); + int string_section_idx = f->get_16(); + + // Load the strings table + uint8_t *strings; + { + // Jump to the strings section header + f->seek(section_table_pos + string_section_idx * section_header_size); + + // Read strings data size and offset + int64_t string_data_pos; + int64_t string_data_size; + if (bits == 32) { + f->seek(f->get_position() + 0x10); + string_data_pos = f->get_32(); + string_data_size = f->get_32(); + } else { // 64 + f->seek(f->get_position() + 0x18); + string_data_pos = f->get_64(); + string_data_size = f->get_64(); + } + + // Read strings data + f->seek(string_data_pos); + strings = (uint8_t *)memalloc(string_data_size); + if (!strings) { + f->close(); + return ERR_OUT_OF_MEMORY; + } + f->get_buffer(strings, string_data_size); + } + + // Search for the "pck" section + + bool found = false; + for (int i = 0; i < num_sections; ++i) { + int64_t section_header_pos = section_table_pos + i * section_header_size; + f->seek(section_header_pos); + + uint32_t name_offset = f->get_32(); + if (strcmp((char *)strings + name_offset, "pck") == 0) { + // "pck" section found, let's patch! + + if (bits == 32) { + f->seek(section_header_pos + 0x10); + f->store_32(p_embedded_start); + f->store_32(p_embedded_size); + } else { // 64 + f->seek(section_header_pos + 0x18); + f->store_64(p_embedded_start); + f->store_64(p_embedded_size); + } + + found = true; + break; + } + } + + memfree(strings); + f->close(); + + return found ? OK : ERR_FILE_CORRUPT; +} diff --git a/platform/linuxbsd/export/export_plugin.h b/platform/linuxbsd/export/export_plugin.h index f482ddce3d..593916e586 100644 --- a/platform/linuxbsd/export/export_plugin.h +++ b/platform/linuxbsd/export/export_plugin.h @@ -38,10 +38,14 @@ #include "scene/resources/texture.h" class EditorExportPlatformLinuxBSD : public EditorExportPlatformPC { + Map<String, String> extensions; Error _export_debug_script(const Ref<EditorExportPreset> &p_preset, const String &p_app_name, const String &p_pkg_name, const String &p_path); public: + void set_extension(const String &p_extension, const String &p_feature_key = "default"); + virtual List<String> get_binary_extensions(const Ref<EditorExportPreset> &p_preset) const override; virtual Error export_project(const Ref<EditorExportPreset> &p_preset, bool p_debug, const String &p_path, int p_flags = 0) override; + virtual Error fixup_embedded_pck(const String &p_path, int64_t p_embedded_start, int64_t p_embedded_size) const override; }; #endif diff --git a/platform/windows/export/export.cpp b/platform/windows/export/export.cpp index 17a24c08bf..37fdf93ecf 100644 --- a/platform/windows/export/export.cpp +++ b/platform/windows/export/export.cpp @@ -32,8 +32,6 @@ #include "export_plugin.h" -static Error fixup_embedded_pck(const String &p_path, int64_t p_embedded_start, int64_t p_embedded_size); - void register_windows_exporter() { EDITOR_DEF("export/windows/rcedit", ""); EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING, "export/windows/rcedit", PROPERTY_HINT_GLOBAL_FILE, "*.exe")); @@ -57,84 +55,11 @@ void register_windows_exporter() { logo->create_from_image(img); platform->set_logo(logo); platform->set_name("Windows Desktop"); - platform->set_extension("exe"); platform->set_release_32("windows_32_release.exe"); platform->set_debug_32("windows_32_debug.exe"); platform->set_release_64("windows_64_release.exe"); platform->set_debug_64("windows_64_debug.exe"); platform->set_os_name("Windows"); - platform->set_fixup_embedded_pck_func(&fixup_embedded_pck); EditorExport::get_singleton()->add_export_platform(platform); } - -static Error fixup_embedded_pck(const String &p_path, int64_t p_embedded_start, int64_t p_embedded_size) { - // Patch the header of the "pck" section in the PE file so that it corresponds to the embedded data - - FileAccess *f = FileAccess::open(p_path, FileAccess::READ_WRITE); - if (!f) { - return ERR_CANT_OPEN; - } - - // Jump to the PE header and check the magic number - { - f->seek(0x3c); - uint32_t pe_pos = f->get_32(); - - f->seek(pe_pos); - uint32_t magic = f->get_32(); - if (magic != 0x00004550) { - f->close(); - return ERR_FILE_CORRUPT; - } - } - - // Process header - - int num_sections; - { - int64_t header_pos = f->get_position(); - - f->seek(header_pos + 2); - num_sections = f->get_16(); - f->seek(header_pos + 16); - uint16_t opt_header_size = f->get_16(); - - // Skip rest of header + optional header to go to the section headers - f->seek(f->get_position() + 2 + opt_header_size); - } - - // Search for the "pck" section - - int64_t section_table_pos = f->get_position(); - - bool found = false; - for (int i = 0; i < num_sections; ++i) { - int64_t section_header_pos = section_table_pos + i * 40; - f->seek(section_header_pos); - - uint8_t section_name[9]; - f->get_buffer(section_name, 8); - section_name[8] = '\0'; - - if (strcmp((char *)section_name, "pck") == 0) { - // "pck" section found, let's patch! - - // Set virtual size to a little to avoid it taking memory (zero would give issues) - f->seek(section_header_pos + 8); - f->store_32(8); - - f->seek(section_header_pos + 16); - f->store_32(p_embedded_size); - f->seek(section_header_pos + 20); - f->store_32(p_embedded_start); - - found = true; - break; - } - } - - f->close(); - - return found ? OK : ERR_FILE_CORRUPT; -} diff --git a/platform/windows/export/export_plugin.cpp b/platform/windows/export/export_plugin.cpp index 7b9cb59896..f20cff90c1 100644 --- a/platform/windows/export/export_plugin.cpp +++ b/platform/windows/export/export_plugin.cpp @@ -86,6 +86,12 @@ Error EditorExportPlatformWindows::export_project(const Ref<EditorExportPreset> return err; } +List<String> EditorExportPlatformWindows::get_binary_extensions(const Ref<EditorExportPreset> &p_preset) const { + List<String> list; + list.push_back("exe"); + return list; +} + bool EditorExportPlatformWindows::get_export_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const { // This option is not supported by "osslsigncode", used on non-Windows host. if (!OS::get_singleton()->has_feature("windows") && p_option == "codesign/identity_type") { @@ -403,3 +409,74 @@ bool EditorExportPlatformWindows::can_export(const Ref<EditorExportPreset> &p_pr return valid; } + +Error EditorExportPlatformWindows::fixup_embedded_pck(const String &p_path, int64_t p_embedded_start, int64_t p_embedded_size) const { + // Patch the header of the "pck" section in the PE file so that it corresponds to the embedded data + + FileAccess *f = FileAccess::open(p_path, FileAccess::READ_WRITE); + if (!f) { + return ERR_CANT_OPEN; + } + + // Jump to the PE header and check the magic number + { + f->seek(0x3c); + uint32_t pe_pos = f->get_32(); + + f->seek(pe_pos); + uint32_t magic = f->get_32(); + if (magic != 0x00004550) { + f->close(); + return ERR_FILE_CORRUPT; + } + } + + // Process header + + int num_sections; + { + int64_t header_pos = f->get_position(); + + f->seek(header_pos + 2); + num_sections = f->get_16(); + f->seek(header_pos + 16); + uint16_t opt_header_size = f->get_16(); + + // Skip rest of header + optional header to go to the section headers + f->seek(f->get_position() + 2 + opt_header_size); + } + + // Search for the "pck" section + + int64_t section_table_pos = f->get_position(); + + bool found = false; + for (int i = 0; i < num_sections; ++i) { + int64_t section_header_pos = section_table_pos + i * 40; + f->seek(section_header_pos); + + uint8_t section_name[9]; + f->get_buffer(section_name, 8); + section_name[8] = '\0'; + + if (strcmp((char *)section_name, "pck") == 0) { + // "pck" section found, let's patch! + + // Set virtual size to a little to avoid it taking memory (zero would give issues) + f->seek(section_header_pos + 8); + f->store_32(8); + + f->seek(section_header_pos + 16); + f->store_32(p_embedded_size); + f->seek(section_header_pos + 20); + f->store_32(p_embedded_start); + + found = true; + break; + } + } + + f->close(); + + return found ? OK : ERR_FILE_CORRUPT; +} diff --git a/platform/windows/export/export_plugin.h b/platform/windows/export/export_plugin.h index b40e872461..04707a5667 100644 --- a/platform/windows/export/export_plugin.h +++ b/platform/windows/export/export_plugin.h @@ -45,9 +45,11 @@ class EditorExportPlatformWindows : public EditorExportPlatformPC { public: virtual Error export_project(const Ref<EditorExportPreset> &p_preset, bool p_debug, const String &p_path, int p_flags = 0) override; virtual Error sign_shared_object(const Ref<EditorExportPreset> &p_preset, bool p_debug, const String &p_path) override; + virtual List<String> get_binary_extensions(const Ref<EditorExportPreset> &p_preset) const override; virtual void get_export_options(List<ExportOption> *r_options) override; virtual bool get_export_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const override; virtual bool can_export(const Ref<EditorExportPreset> &p_preset, String &r_error, bool &r_missing_templates) const override; + virtual Error fixup_embedded_pck(const String &p_path, int64_t p_embedded_start, int64_t p_embedded_size) const override; }; #endif diff --git a/scene/gui/progress_bar.cpp b/scene/gui/progress_bar.cpp index 20b3513375..50ffb3ca67 100644 --- a/scene/gui/progress_bar.cpp +++ b/scene/gui/progress_bar.cpp @@ -100,7 +100,7 @@ bool ProgressBar::is_percent_visible() const { void ProgressBar::_bind_methods() { ClassDB::bind_method(D_METHOD("set_percent_visible", "visible"), &ProgressBar::set_percent_visible); ClassDB::bind_method(D_METHOD("is_percent_visible"), &ProgressBar::is_percent_visible); - ADD_GROUP("Percent", "percent_"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "percent_visible"), "set_percent_visible", "is_percent_visible"); } diff --git a/scene/main/canvas_item.cpp b/scene/main/canvas_item.cpp index b50f7866af..15d36d8230 100644 --- a/scene/main/canvas_item.cpp +++ b/scene/main/canvas_item.cpp @@ -978,6 +978,7 @@ void CanvasItem::_bind_methods() { ADD_SIGNAL(MethodInfo("item_rect_changed")); BIND_CONSTANT(NOTIFICATION_TRANSFORM_CHANGED); + BIND_CONSTANT(NOTIFICATION_LOCAL_TRANSFORM_CHANGED); BIND_CONSTANT(NOTIFICATION_DRAW); BIND_CONSTANT(NOTIFICATION_VISIBILITY_CHANGED); BIND_CONSTANT(NOTIFICATION_ENTER_CANVAS); |