# Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/). ## [Unreleased] (4.0-dev at commit `ad8081216c73b8a0ace555eeb96c1d4fbcb3e50e`) ### Added #### Core - New Vector2i, Vector3i and Rect2i types. - These are integer variants of Vector2, Vector3 and Rect2. - Rect2 can now be interpolated using the Tween node. - New PackedArrays to replace PoolArrays. - 64-bit integer and float arrays are now available in addition to the existing 32-bit ones. - `ConfigFile.parse(data: String)` method to load a string as if it was a ConfigFile on disk. #### Editor - Support for multiple windows. - Docks can be moved out of the main window into separate windows. - Single-window mode can be enabled in the Editor Settings to revert to the old behavior. - New dynamic infinite 3D grid, replacing the fixed 3D grid. - Movement and scaling handles in the 2D editor (similar to the 3D editor). - New Replace in Files dialog in the script editor to complement Find in Files. - New settings to change the freelook navigation scheme: - Default. - Partially axis-locked (similar to id Tech and Source's noclip modes). The Up and Down keys won't take the current view pitch into account. - Fully axis-locked (similar to Minecraft). The Forward, Backward, Up and Down keys won't take the current view pitch into account. - **macOS:** More built-in mouse cursors are now exposed (such as diagonal resize cursors). - **macOS:** Support for building Godot with Clang sanitizers. - **HTML5:** [Support for profiling projects exported to HTML5.](https://godotengine.org/article/html5-export-profiling) #### GDScript - GDScript was rewritten from scratch with a cleaner approach. - See individual progress reports for more information: [#1](https://godotengine.org/article/gdscript-progress-report-writing-tokenizer), [#2](https://godotengine.org/article/gdscript-progress-report-writing-new-parser), [#3](https://godotengine.org/article/gdscript-progress-report-type-checking-back). #### GUI - Support for multiple windows on desktop platforms. Projects can spawn additional windows, each with their own viewport. - RichTextLabel property `fit_content_height` to make the label's height fit its content automatically (not always reliable). #### Import - Support for importing lights from glTF scenes. #### Input - Support for physical (keyboard layout-independent) key codes. - This can be used to provide <kbd>W</kbd>/<kbd>A</kbd>/<kbd>S</kbd>/<kbd>D</kbd> controls that work on any keyboard layout. - `DisplayServer.keyboard_get_current_layout()` and `DisplayServer.keyboard_get_layout_*()` methods to get information about keyboard layouts. #### Mono/C# - Support for exporting C# projects to iOS and HTML5. - [C# events can now be used to implement Godot signals](https://godotengine.org/article/csharp-ios-signals-events). - [New Visual Studio and Visual Studio Code add-ons.](https://godotengine.org/article/csharp-vs-and-vscode) #### Navigation - [New NavigationServer.](https://godotengine.org/article/navigation-server-godot-4-0) - Support for dynamic obstacle avoidance. #### Networking - [Support for DTLS encryption in UDP and ENet.](https://godotengine.org/article/enet-dtls-encryption) #### Rendering - New Vulkan renderer. - Specular mapping in 2D. - Support for light projectors/"cookies" in OmniLight3D and SpotLight3D. - Only supported for lights with shadows enabled. - 3D lights now have a Size property which can be set to simulate area lights. - This property also affects how fast shadow penumbras will grow over distance. - A shadow blur property is also available to set a constant blurring factor on a per-light basis. - Shadow mapping with improved filtering and PCSS-like penumbra simulation. - New, fully real-time GIProbe. - Support for anisotropy to reduce leaks (at the cost of performance, disabled by default). - Dynamic objects can receive GI and contribute to it. - [Volumetric fog](https://github.com/godotengine/godot/pull/41213) with optional GI contribution. - Exponential fog to replace the old distance-based fog. - [New signed distance field-based global illumination](https://godotengine.org/article/godot-40-gets-sdf-based-real-time-global-illumination) for open world lighting. - Dynamic objects can receive GI, but not contribute to it. - [New GPU-based lightmapper](https://godotengine.org/article/godot-40-will-get-new-modernized-lightmapper) with built-in denoising. - Improved support for dynamic objects with better performance and quality. - Generated UV2s are now cached across reimports. - [Physical sky material and custom sky shaders](https://godotengine.org/article/custom-sky-shaders-godot-4-0), both supporting real-time updates. - [Global and per-instance shader uniforms.](https://godotengine.org/article/godot-40-gets-global-and-instance-shader-uniforms) - This can be used to better reuse shaders, leading to improved performance. - See individual progress reports for more information: [#1](https://godotengine.org/article/vulkan-progress-report-1), [#2](https://godotengine.org/article/vulkan-progress-report-2), [#3](https://godotengine.org/article/vulkan-progress-report-3), [#4](https://godotengine.org/article/vulkan-progress-report-4), [#5](https://godotengine.org/article/vulkan-progress-report-5), [#6](https://godotengine.org/article/vulkan-progress-report-6), [#7](https://godotengine.org/article/vulkan-progress-report-7). #### Miscellaneous - The engine is now unit-tested using [doctest](https://github.com/onqtam/doctest). - Switched from Travis CI and AppVeyor to GitHub Actions. - A Fish shell completion file is now available for the Godot editor's command line interface. ### Changed #### Core - Increased the maximum number of OpenSimplexNoise octaves (6 → 9). - Running a project from a debug build will now append ` (DEBUG)` to the window title. - This is to ensure the implications of running from a debug build (such as lower performance) are well-understood. - The window title can be set manually to remove this suffix. #### Editor - Improved the Video RAM debugger usability. - The Video RAM tab is now refreshed automatically when switching to it. - Hovering layer checkboxes in the inspector now results in visual feedback. - Clicking between two checkboxes will now enable the checkbox that was last highlighted instead of doing nothing. - Leaving freelook mode will now restore the mouse to the position it was before entering freelook mode. - The crosshair was removed as a result of this change. - CSV profiler measures can now be saved anywhere on the filesystem, not just in the project folder. - Improved the 2D zooming algorithm to always visit powers of two (50%, 100%, 200%, …) and avoid floating-point precision issues. - Times are now displayed as milliseconds in the profiler and performance monitors (instead of seconds). - Improved the batch rename dialog usability and design consistency. - Clarified error messages when there are regular expression errors. - Optimized editor icon generation to speed up editor startup. - The number of replaced results now appears in place of the matches counter when replacing text in the script editor. - Pressing <kbd>Enter</kbd> (or <kbd>Shift + Enter</kbd>) in the script editor replacement dialog now performs a forwards (or backwards) replacement operation. - Pressing <kbd>Ctrl + F</kbd> now focuses the search field in the AssetLib tab. - The Sync Scene Changes and Sync Script Changes settings' values now persist on a per-project basis instead of being always enabled by default. - Various tooltips have been added or modified to clarify the editor operation. - Various visual and formatting changes to the editor help to improve readability and be closer to the online class reference. - Renamed "Identifier" to "Bundle Identifier" in the macOS and iOS export presets for clarity. #### GUI - Improve drive letter handling in EditorFileDialog and FileDialog. - Container nodes (except PanelContainer) now use the Pass mouse mode by default. - Pressing the left/right arrows while having selected text will now move the cursor to the beginning/end of the selection in LineEdit (while unselecting the text as usual). - **macOS:** The <kbd>Ctrl + A</kbd> and <kbd>Ctrl + E</kbd> navigation shortcuts now work in LineEdit. #### Input - Renamed InputEventKey's `scancode` to `keycode`. #### Networking - Optimized bandwidth usage in the high-level multiplayer API. #### Physics - Renamed PlaneShape to WorldMarginShape. #### Rendering - Some Environment settings such as depth of field have been moved to a CameraEffects resource which is assigned to individual Camera nodes. - Quality settings have been moved from individual nodes and resources to the Project Settings for better centralization. - Quality settings now have performance hints in their values' names, such as "Fast" or "Slow". #### Miscellaneous - Renamed the `x11` platform to `linuxbsd` to prepare for Wayland support. - The engine is now written in C++17. - Python 3 and SCons 3.1 are now required to build Godot from source. ### Removed #### Core - Removed the deprecated `Color.gray()` method. - Use `Color.v()` for a better grayscale approximation instead. - Removed built-in HQ2X implementation (used for crude hiDPI support in the default project theme). - This helps with binary size as HQ2X is made of particularly large functions. #### Editor - Camera3D nodes no longer have a gizmo billboard icon as it could confuse people due to their constant orientation. #### Input - `DisplayServer.get_latin_keyboard_variant()` method (replaced by the more flexible `DisplayServer.keyboard_get_current_layout()`). #### Networking - Removed the deprecated `allow_object_decoding` property from PacketPeer. - Removed the deprecated `sync` and `slave` high-level multiplayer keywords. #### Physics - Removed the deprecated PhysicsBody `friction` and `bounce` properties (replaced by PhysicsMaterial). ### Fixed #### Core - **Windows:** Godot can now kill its own PID using `OS.kill()`. #### Editor - The Android exporter no longer reports progress on each file, greatly speeding up the exporting process. - Searching with the Whole Words option enabled in the script editor is no longer exceedingly slow. #### GUI - Fixed OptionButton minimum size. - TabContainer is no longer too large when tabs are hidden.