# 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.