Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
Godot 4.0 preliminary changelog (does not list changes that were also backported to Godot 3.x)


All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog.

[4.0] - TBD





  • 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.
    • Annotations to replace keywords in certain cases (@export, @onready, @rpc(), @tool, @warning_ignore(), …).
    • Typed arrays (var array_of_nodes: Array[Node]). Any type can be used, including custom classes.
    • See individual progress reports for more information: #1, #2, #3.
  • 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.


  • 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).
  • RichTextLabel's img tag now supports an optional color 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() and DisplayServer.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.






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



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




  • Tweaked the output strings to be more human-readable when printing various built-in Variant and Object types.
  • Renamed File's endian_swap property to big_endian for consistency with ResourceSaver and StreamPeer.
  • Renamed File's get_len() method to get_length().
  • Renamed Vector2.clamped() to Vector2.limit_length() to differentiate it from the new Vector2.clamp().
  • Renamed rand_range() to randf_range() to avoid ambiguity with the new randi_range() and make its return type more obvious.
  • Replaced Node.add_child_below_node() with Node.add_sibling().
  • Replaced Directory.list_dir_begin()'s skip_navigational and skip_hidden arguments with show_navigational and show_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.
  • Renamed the built-in Quat type to Quaternion.
  • Renamed the built-in Transform type to Transform3D.
  • Renamed Node3D's translation property to position 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.
  • 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 to keycode.
  • Renamed InputMap's get_action_list() to get_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 to enabled with its behavior inverted.
  • 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 to linuxbsd 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.
  • 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 DisplayServer.get_latin_keyboard_variant() method (replaced by the more flexible DisplayServer.keyboard_get_current_layout()).


  • Removed the deprecated allow_object_decoding property from PacketPeer.
  • Removed the deprecated sync and slave high-level multiplayer keywords.



  • Removed the deprecated PhysicsBody friction and bounce 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.
  • 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.
Copy link

Calinou commented Dec 11, 2019

@Jummit Games like Trackmania come to mind here. All official and user-made tracks are made by placing pre-made blocks on a 3D grid (with a system similar to autotiling to handle connections).

@lodu44 LOD and occlusion culling will be implemented in 4.0, as part of the new Vulkan renderer.

Copy link

smt923 commented Dec 14, 2019

I can say for sure that more than 50 percent of Godot users will not use 3D Terrain. This is because Godot is currently mostly used for 2D games. I don't get all the fuss about adding high level features to Godot; being able to add them as addons has no downsides.

you're right about addons, but people probably aren't using Godot for 3D because it's lacking 3D features that other 3D engines have out of the box, it'd be a good idea to make these as easy to use as possible so more people might try Godot, see that it now has feature parity to other 3D engines and start using it for 3D, I've chosen Unity or UE4 over Godot for things purely because Godot doesn't match the terrain, ai and navmesh tools of the other engines

Copy link

Calinou commented Dec 19, 2019

@kuroodo Sorry for the late response, but the feature you mentioned was cherry-picked into 3.1.1. This means it's both available in 3.1.1 and the current 3.2 betas.

This particular changelog all tracks changes from 3.1 to 3.2, not just from the latest 3.1 patch release to 3.2.

Copy link

ShlomiRex commented Jan 17, 2020

amazing! Keep up the good work!

Copy link

RichardR01 commented Jan 19, 2020

Has there been any improvements, for 3D, in shadowing and a fix for the fire flies in reflective materials? Also we need FXAA antialiasing, IMO, as MXAA produces artifacts and does not do a good job at removing the jaggies. I get better results having it off.

Shadows produce artifacts depending on the orientation of the light and camera and look pretty bad in general. Also, in the material shaders, for SpatialMaterials, refraction does not work. It makes transparent objects opaque and the scale slider does nothing. (I assume because this is meant for a texture?) On that note, it should not be scale, but IOR for Index of Refraction.

I didn't want to come here to complain but I am finding it hard to get any information on how people deal with these issues, and I feel they need to be brought into the light. If there is no plans on fixing/supporting 3D for Godot, why not just make Godot strictly 2D? If I could help in the development of Godot, I would; but I am just a bad artist who blames his tools (for good reason), and am quite frustrated.

MSAA artifacts (bad aliasing)

Shadow artifacts

Bad shadowing

Reflected firefly starburst

Copy link

Calinou commented Jan 19, 2020

@RichardR01 There is a FXAA shader available here. It works with both the GLES3 and GLES2 renderers. As for the MSAA artifacts on the screenshot, this seems to be due to screen-space reflections; try disabling them.

Shadows produce artifacts depending on the orientation of the light and camera and look pretty bad in general.

Try disabling contact shadows. These are known to create artifacts and generally decrease performance.

Also, try playing around with the bias values in the light nodes. If your game is based around a camera that never moves or a camera that moves constantly at a high speed (e.g. a racing game), you can set the DirectionalLight depth range to Optimized instead of Stable. This will increase the effective shadow resolution, at the cost of stability when the camera moves.

As for the bad shadow filtering, try decreasing the directional shadow size in the Project Settings. There are known issues with the filtering when the size is set too high.

Finally, the firefly starbursts should be alleviated by increasing the radiance size in the Environment resource.

Also, in the material shaders, for SpatialMaterials, refraction does not work.

Does it work in the Material Testers demo (which is in this repository)? If not, it may be an issue with your graphics hardware. Otherwise, it's likely a configuration issue somewhere in the SpatialMaterial (check the one in the demo).

On that note, it should not be scale, but IOR for Index of Refraction.

We don't claim to be physically accurate, so I'm not sure if that's a good idea 🙂

If the scale doesn't match IOR, it may be possible to change this for 4.0, but we need to see whether it would incur a performance cost.

If there is no plans on fixing/supporting 3D for Godot, why not just make Godot strictly 2D?

We're not flawless, we're work-in-progress. 3D will be much improved in 4.0, but we already consider it to be usable for many projects in 3.x. Godot 3.2 will make it significantly better by improving the asset pipeline.

Copy link

ibsantos commented Jan 21, 2020

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.

Copy link

Calinou commented Jan 21, 2020

@ibsantos Someone needs to step up to implement this feature 🙂

Copy link

emo10001 commented Jan 22, 2020

So with the integration of Assimp, does this mean we'll be able to import .X models? It's a supported file type according to the Assimp site. Also, direct importing of blend files? Because that would be awesome!

Copy link

Calinou commented Jan 22, 2020

@emo10001 I don't remember the exact list of model formats in Godot's implementation of Assimp. I was definitely able to import MDL, MD2, MD3 and MD5MESH formats at least. I guess it'd be nice to provide a testbed project so the support for various model formats can be checked easily.

Edit: Godot 3.2 and later doesn't use Assimp as-is anymore, so importing formats such as MD2 isn't possible anymore.

Copy link

Calinou commented Jan 22, 2020

On another note, this changelog is now merged into Godot 3.2 🎉

Stay tuned for the upcoming Godot 4.0 changelog!

Copy link

emo10001 commented Jan 27, 2020

@Calinou hey I was just thinking about the Assimp integration with it's focus on FBX. I certainly don't claim to know all the industry buzz, but hasn't there always been issues with FBX due to it being proprietary? Has the Godot team found a way around that? Or has then been some agreement or change to FBX that would allow it?


Copy link

Calinou commented Jan 27, 2020

@emo10001 I believe Assimp's FBX support is the fruit of reverse engineering. It doesn't rely on Autodesk's proprietary SDK. In 3.2, we've had an Assimp contributor work on improving Assimp's integration with Godot (and Assimp's FBX support itself).

Copy link

eltharionx commented Jan 28, 2020

No mention of this game breaking change with this update from v3.1.2stable to v3.2RC4:

int get_closest_point ( Vector3 to_position ) const

int get_closest_point ( Vector3 to_position, bool include_disabled=false ) const

With the new default include_disabled=false, and the expected behavior to be defaulted to true... it breaks backward compatibility. Recommend highlighting as potential breaking change in ChangeLog.

Copy link

Calinou commented Jan 28, 2020

@eltharionx This shouldn't be a breaking change actually per godotengine/godot#32249.

Copy link

eltharionx commented Jan 28, 2020

@Calinou Understood that there is a fix for this. I guess it's "breaking" in the sense that one may need to go back into their code and update all their get_closest_point( x ) to get_closest_point( x, true). Specifically, I needed to do this, and only was able to figure this out the long way since there was no mention in it here in this ChangeLog.

Copy link

akien-mga commented Jan 28, 2020

@eltharionx Actually you're right, it's not godotengine/godot#32249 which is breaking, but the previous PR that prompted the need for this argument: godotengine/godot#30112.

This is probably fine with false as default value, but it does break compatibility and should be identified as such indeed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment