All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog.
- Revamped 3D animation storage.
- New blend shape track to adjust blend shapes in animations more efficiently.
- New expression-based transitions in AnimationTree state machines.
- Support for animation compression to improve performance with long animations such as cutscenes.
- Replaced transform tracks by position, rotation and scale tracks.
- Removed the animation dependency on bone rests.
- Better compatibility with models that use non-uniform scaling in animations.
- Better compatibility with models exported from Maya and 3DS Max.
- Easier animation reuse across different models.
- Easier procedural generation of animations.
- New TileMap and TileSet resources.
- New Vector2i, Vector3i and Rect2i types.
- These are integer variants of Vector2, Vector3 and Rect2.
- Callable type for first-class functions (can be created with lambdas in GDScript).
- The Euler rotation order can now be adjusted in Node3D.
- New
Array.map()
,Array.filter()
andArray.reduce()
methods that can be used with Callables. - Rewritten Tween with more functionality.
- Tween is no longer a node.
- Easier chaining of tweens.
- Low-level tweening option to get an interpolated value directly.
- Existing projects will have to be modified to account for this, as automatic conversion isn't feasible.
- New and improved IK in Skeleton2D.
- New classes: SkeletonModifier2D, SkeletonModifierStack2D, SkeletonModification2DLookAt, SkeletonModification2DCCDIK, SkeletonModification2DFABRIK, SkeletonModification2DJiggle, SkeletonModification2DTwoBoneIK, PhysicalBone2D, SkeletonModification2DPhysicalBones, SkeletonModification2DStackHolder.
- New
Transform2D.looking_at()
function.
- New and improved IK in Skeleton3D.
- New classes: SkeletonModifier3D, SkeletonModifierStack3D, SkeletonModifier3DLookAt, SkeletonModification3DCCDIK, SkeletonModification3DFABRIK, SkeletonModification3DJiggle, SkeletonModification3DTwoBoneIK, SkeletonModification3DStackHolder.
- The Bone struct now includes a local_pose_override.
- The Bone struct now keeps track of its children bones, if it has any.
- Added functions to Skeleton3D for getting the forward vector using the information stored in the rest pose for the bones.
- New
Basis.rotate_to_align()
function. - Refactored the BoneAttachment3D node.
- Removed the
process_list
functions.
- New GradientTexture2D resource (useful for 2D lights, particles, …).
- Support for gettext PO template generation from scene and script files.
- Translation parser plugins can be written to allow extracting strings from custom file types.
- New Time singleton to replace date/time handling methods in the OS singleton.
- Includes new methods to handle ISO 8601 timestamp conversion.
- Support for custom performance monitors.
- New
randi_range()
global scope function to return a random integer number within a range. - New
randfn()
global scope function to return a floating-point number along a normal gaussian distribution. - New
pingpong()
global scope function to return a floating-point number that increments then decrements in a "sawtooth" fashion. - Vectors and Colors can now be clamped between two values their respective
clamp()
methods. - New
Vector3.limit_length()
method as a Vector3 counterpart toVector2.limit_length()
(formerlyVector2.clamped()
). - New PackedArrays to replace PoolArrays.
- 64-bit integer and float arrays are now available in addition to the existing 32-bit ones.
- New
ConfigFile.parse(data: String)
method to load a string as if it was a ConfigFile on disk. - New
Image.save_png_to_buffer()
method to save a PNG image to memory as a PackedByteArray (instead of saving to disk). - New File API to check, read and write symbolic links on macOS and Linux.
- Replaced GDNative with GDExtension.
- Easier setup and compilation for various platforms.
- Code structure is more similar to statically compiled C++ modules.
- Lower performance overhead compared to GDNative.
- New TileMap and TileSet editors with better usability.
- 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.
- Holding down Ctrl while drag-and-dropping a resource from the FileSystem dock to the script editor will now add
preload()
to the pasted resource path. - 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.
- macOS: Projects can now optionally be exported to a application bundle contained within a ZIP archive.
- Previously, a DMG image was always used when exporting from macOS.
- macOS: DMG images can now be codesigned after exporting.
- GDScript was rewritten from scratch with a cleaner approach.
- New documentation generation system.
- Comments starting with
##
are considered documentation comments. - Documentation comments be placed before any member variable, constant, enum or function declaration, or at the top of a file.
- Documentation comments appear in the editor help and when hovering exported properties in the inspector.
- Comments starting with
- Support for multiple windows on desktop platforms. Projects can spawn additional windows, each with their own viewport.
- Added
NOTIFICATION_APPLICATION_FOCUS_IN
andNOTIFICATION_APPLICATION_FOCUS_OUT
notifications for "global" project focus changes (separate fromNOTIFICATION_WM_FOCUS_IN
andNOTIFICATION_WM_FOCUS_OUT
).
- Added
- RichTextLabel property
fit_content_height
to make the label's height fit its content automatically (not always reliable). - RichTextLabel's
img
tag now supports an optionalcolor
attribute to modulate the image. get_char_size()
is now exposed in Font, making it usable in DynamicFont rather than being limited to BitmapFont.- Tree can now highlight relationship lines for the currently selected item, its parents and direct children.
- This is used in the scene tree dock in the editor.
- Support for importing lights from glTF scenes.
- Support for physical (keyboard layout-independent) key codes.
- This can be used to provide W/A/S/D controls that work on any keyboard layout.
DisplayServer.keyboard_get_current_layout()
andDisplayServer.keyboard_get_layout_*()
methods to get information about keyboard layouts.- New
Input.MOUSE_MODE_CONFINED_HIDDEN
mouse mode to combine the confined and hidden mouse modes.
- Support for exporting C# projects to iOS and HTML5.
- C# events can now be used to implement Godot signals.
- New Visual Studio and Visual Studio Code add-ons.
- New NavigationServer.
- Support for dynamic obstacle avoidance.
- New DisplayServer abstraction, allowing for the creation of multiple windows.
- This is used in the editor for detachable docks, but can also be used in projects.
- Android: Allow basic user data backup. This can be disabled in the export preset if needed.
- Android: Support for changing the mouse cursor shape (no custom images).
- iOS: The targeted device family (iPhone, iPad, iPhone and iPad) can now be specified in the export preset.
- New CharacterBody node to supersede KinematicBody.
- Some KinematicBody features were moved to PhysicsBody.
- Android: Clients of the Godot library can now add their own command line arguments.
- New Vulkan renderer.
- New OpenGL renderer, using OpenGL 3.3/OpenGL ES 3.0/WebGL 2.0 as a baseline.
- Designed to target mobile/web platforms first, but also usable on desktop platforms.
- Uses a low-end-friendly approach to maximize performance in simple scenes.
- Currently supports 2D rendering only.
- OpenGL 3D rendering is planned for a future 4.x release.
- Support for specular mapping when using 2D lighting.
- New DirectionalLight2D node for 2D lighting.
- CanvasGroup node to modulate several 2D nodes as a group (or apply shaders to them).
- Support for clipping in CanvasItem, replacing the use of Light2D as masks in a more convenient manner.
- 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.
- Shadow normal offset bias is now implemented to avoid issues with shadow acne or peter-panning.
- New Decal node to project textures onto 3D surfaces.
- New fully real-time VoxelGI (formerly GIProbe).
- Dynamic lights and emissive can emit GI that's updated every frame (instead of only updating sporadically).
- Dynamic objects can receive GI and contribute to it.
- New signed distance field-based global illumination (SDFGI) for open world lighting.
- Enabled in the WorldEnvironment. No node required, no baking.
- Semi-realtime: dynamic objects can receive GI, but not contribute to it.
- Volumetric fog with optional GI contribution.
- Fog volumes to locally apply volumetric fog (or subtract to global fog using negative density).
- More physically accurate exponential fog to replace the old distance-based fog.
- New Aerial Scattering property in distance-based fog to fade out to the background sky instead of a fixed color.
- Also available in volumetric fog with the Ambient Inject property.
- New GPU-based lightmapper.
- When using a dedicated GPU, this results in much faster bake speeds compared to the CPU lightmapper.
- Optional support for storing directional lighting information and rough reflections using spherical harmonics.
- Improved support for lighting dynamic objects with better performance and quality.
- In addition to automatic generation, LightmapProbe nodes can now be placed manually to provide better lighting information for dynamic objects where needed.
- Physical sky material and custom sky shaders, both supporting real-time updates.
- Global and per-instance shader uniforms.
- This can be used to better reuse shaders, leading to improved performance.
- Support for automatically generating and using mesh LODs to improve performance.
- Several LOD levels are generated for imported 3D scenes by default.
- LODs are automatically used for mesh rendering using a pixel coverage-based selection algorithm.
- Uses the meshoptimizer library.
- Support for LOD visibility ranges in GeometryInstance3D.
- Manually authored LODs can be configured using distance and hysteresis cutoffs.
- Can be used for HLOD setups to reduce draw calls while preserving culling opportunities when up close.
- Support for GeometryInstance3D distance fade to make distant meshes disappear smoothly without having to modify their material.
- Support for automatically generating and using shadow meshes to improve performance.
- The generated shadow meshes are welded aggressively to improve performance with no difference in visual quality.
- To further improve performance, hand-made shadow meshes can be specified in the inspector in MeshInstance nodes.
- Support for rendering a viewport's 3D contents at a lower resolution to improve performance.
- 2D elements remain at full resolution to improve perceived sharpness.
- A scaling factor above 1.0 can be used for supersampling, which is useful to maximize quality for offline rendering.
- See individual progress reports for more information: #1, #2, #3, #4, #5, #6, #7.
- New shader compiler rewritten from scratch.
- Support for uniform arrays (including sampler arrays).
- Arrays can now be passed as function parameters (including arrays of structs).
- The return type of a function can now be an array (including arrays of structs).
- Array size can now be optionally written before the identifier (
int[2] array;
instead ofint array[2]
).- This eases porting shaders from GLSL.
- Array constructors can now be called at any time after initialization.
- For example,
int array[3]; array = {1, 2, 3}
is now valid.
- For example,
- New
fma()
(fused multiply-add) built-in function to optimize shaders in a low-level way. - New built-in data (un)packing functions to optimize shaders in a low-level way.
- Warning system for common issues such as floating-point comparison and unused variables.
- Argument names now appear in code completion tooltips.
- More information in the progress report.
- Add Billboard mode to visual shaders.
- The constants
PI
,TAU
andE
are now available in the shader language.
- The engine is now unit-tested using 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.
- Increased the default AudioStreamPlayer3D unit size to (1 → 10) to make sounds more audible while setting up the node.
- Renamed the audio-related
FFT_Size
enum toFFTSize
for consistency.
- Tweaked the output strings to be more human-readable when printing various built-in Variant and Object types.
- Renamed File's
endian_swap
property tobig_endian
for consistency with ResourceSaver and StreamPeer. - Renamed File's
get_len()
method toget_length()
. - Renamed Object's
PROPERTY_USAGE_NOEDITOR
toPROPERTY_USAGE_NO_EDITOR
. - Renamed
Vector2.clamped()
toVector2.limit_length()
to differentiate it from the newVector2.clamp()
. - Renamed
rand_range()
torandf_range()
to avoid ambiguity with the newrandi_range()
and make its return type more obvious. - Replaced
Node.add_child_below_node()
withNode.add_sibling()
. - Replaced
Directory.list_dir_begin()
'sskip_navigational
andskip_hidden
arguments withshow_navigational
andshow_hidden
.- Both arguments are
false
by default, which means the default behavior is now to exclude both navigational and hidden files from the returned list.
- Both arguments are
- Renamed the built-in Quat type to Quaternion.
- Renamed the built-in Transform type to Transform3D.
- Renamed Node3D's
translation
property toposition
for consistency with Node2D. - Moved YSort functionality to a Node2D property.
- Viewports now use a size of 512×512 by default to make them visible out of the box.
- Screen orientation is now represented as an enum in the Project Settings.
- Renamed 3D nodes to contain an explicit "3D" prefix for clarity and consistency.
- Renamed various nodes:
- Spatial → Node3D
- GIProbe → VoxelGI
- BakedLightmap → LightmapGI
- Light2D -> PointLight2D
- VisibilityNotifier2D -> VisibleOnScreenNotifier2D
- VisibilityNotifier3D -> VisibleOnScreenNotifier3D
- VisibilityEnabler2D -> VisibleOnScreenEnabler2D
- VisibilityEnabler3D -> VisibleOnScreenEnabler3D
- Renamed various resources:
- GradientTexture -> GradientTexture1D
- Old node and resource names are automatically converted when loading scenes from Godot 3.x.
- Renewed the editor theme for a more modern design.
- Increased icon saturation by 30% when using a dark theme.
- Icon saturation can now be adjusted in the Editor Settings.
- Increased icon saturation by 30% when using a dark theme.
- Improved the audio bus editor appearance.
- Improved layout and texts of the Manage Editor Features dialog.
- 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.
- 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.
- Script editor autocompletion now displays previews next to color constant suggestions.
- The number of replaced results now appears in place of the matches counter when replacing text in the script editor.
- Pressing Enter (or Shift + Enter) in the script editor replacement dialog now performs a forwards (or backwards) replacement operation.
- Pressing Ctrl + F now focuses the search field in the AssetLib tab.
- Pressing G now switches to the Pan mode in the 2D editor.
- The TileMap editor's Bucket Fill shortcut was moved to B to cater for this change.
- Mouse wheel behavior for zooming in the animation behavior is now inverted.
- 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.
- Tweaked Camera2D editor line colors for better visibility.
- Light theme presets now use a negative contrast rate by default for a more logical preview of UI elevation.
- Increased the use of bold fonts throughout the editor.
- Revised icons for the Gradient and GradientTexture resources.
- Renamed "Identifier" to "Bundle Identifier" in the macOS and iOS export presets for clarity.
- Renamed the script editor's "Adaptive" syntax theme to "Default" and "Default" to "Godot 2", for consistency with the editor theme presets.
- Flipped the 2D editor icon to match Godot's coordinate handedness.
- Improved 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).
- TextEdit's
search()
method now returns a Dictionary instead of a PackedIntArray. - macOS: The Ctrl + A and Ctrl + E navigation shortcuts now work in LineEdit.
- Renamed InputEventKey's
scancode
tokeycode
. - Renamed InputMap's
get_action_list()
toget_action_events()
.
- Optimized bandwidth usage in the high-level multiplayer API.
- Split KinematicBody into the new CharacterBody node and PhysicsBody.
- RayCast nodes are now enabled by default.
- The
disabled
property was renamed toenabled
with its behavior inverted.
- The
- Renamed PlaneShape to WorldBoundaryShape.
- Some Environment settings such as depth of field have been moved to a CameraEffects resource which is assigned to individual Camera nodes.
- The ACES Fitted tonemapping algoirthm is now used in place of the old ACES algorithm.
- The old non-fitted ACES tonemapping algorithm was removed.
- 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".
- Renamed the
.shader
file extension to.gdshader
.- Existing text-based shader files will have to be renamed before loading the project in a new engine version.
- Renamed the
x11
platform tolinuxbsd
to prepare for Wayland support. - The engine is now written in C++17.
- Python 3.6 and SCons 3.1 are now required to build Godot from source.
- Removed the
server
platform in favor of disabling specific DisplayServers at build-time (e.g.vulkan=no
).
- Removed the YSort node in favor of the Node2D YSort property.
- Removed the deprecated
Color.gray()
method.- Use
Color.v()
for a better grayscale approximation instead.
- Use
- 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.
- Removed the Dim Dialog on Editor Popup editor setting since it was made obsolete by the multi-window paradigm.
- Removed the ToolButton node in favor of Button.
- Existing ToolButton nodes from Godot 3.x projects will be converted to Button nodes.
- Removed the
DisplayServer.get_latin_keyboard_variant()
method (replaced by the more flexibleDisplayServer.keyboard_get_current_layout()
).
- Removed the deprecated
allow_object_decoding
property from PacketPeer. - Removed the deprecated
sync
andslave
high-level multiplayer keywords.
- Removed the deprecated PhysicsBody
friction
andbounce
properties (replaced by PhysicsMaterial).
- Removed OpenGL ES 2.0 renderer (replaced by the new mobile-oriented OpenGL 3 renderer).
- Vulkan, OpenGL 3.3, OpenGL ES 3.0 or WebGL 2.0 support is now required to run Godot.
- Removed support for 16× MSAA due to driver bugs and low performance.
- For high-quality offline rendering, using supersampling together with 8× MSAA is a better option anyway.
- The positional command line argument now considers
.res
and.tres
files as runnable scene formats.- This fixes Godot not running the main scene or a custom scene if they were saved with a
.res
or.tres
extension.
- This fixes Godot not running the main scene or a custom scene if they were saved with a
- macOS/Linux: Fix the result of
Directory.get_space_left()
. - Windows: Godot can now kill its own PID using
OS.kill()
.
- 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.
- Fixed OptionButton minimum size.
- TabContainer is no longer too large when tabs are hidden.
- ScrollBar now allows using
scroll_to_line()
when Scroll Active is disabled. - DynamicFont outlines now have antialiasing disabled if it was disabled on the font itself.
- Windows:
OS.execute()
now only quotes command line arguments if they contain special characters.
Any plans to add support for opening encrypted and/or compressed arbitrary files (via File.open_encrypted, File.open_encrypted_with_pass, File.open_compressed)? Currently I think only resources exported by godot are accepted by those methods, otherwise an error = 15 (unrecognized) is returned. There are already some issues on this topic, like #32881 and #28999, for instance.