Skip to content

Instantly share code, notes, and snippets.

@Calinou
Last active May 25, 2023 19:07
Show Gist options
  • Star 53 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save Calinou/49aefe52ce8f67ffa3f743932123d14f to your computer and use it in GitHub Desktop.
Save Calinou/49aefe52ce8f67ffa3f743932123d14f to your computer and use it in GitHub Desktop.
Godot 4.0 preliminary changelog (does not list changes that were also backported to Godot 3.x)

Changelog

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

The format is based on Keep a Changelog.

[4.0] - TBD

Added

Animation

Core

Editor

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

Export

  • 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

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

GUI

  • Support for multiple windows on desktop platforms. Projects can spawn additional windows, each with their own viewport.
    • Added NOTIFICATION_APPLICATION_FOCUS_IN and NOTIFICATION_APPLICATION_FOCUS_OUT notifications for "global" project focus changes (separate from NOTIFICATION_WM_FOCUS_IN and NOTIFICATION_WM_FOCUS_OUT).
  • 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.

Import

  • Support for importing lights from glTF scenes.

Input

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

Mono/C#

Navigation

Networking

Porting

Physics

  • New CharacterBody node to supersede KinematicBody.
    • Some KinematicBody features were moved to PhysicsBody.

Porting

  • Android: Clients of the Godot library can now add their own command line arguments.

Rendering

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

Shaders

Miscellaneous

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

Changed

Audio

Core

  • 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 Object's PROPERTY_USAGE_NOEDITOR to PROPERTY_USAGE_NO_EDITOR.
  • 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.

Editor

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

GUI

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

Input

  • Renamed InputEventKey's scancode to keycode.
  • Renamed InputMap's get_action_list() to get_action_events().

Networking

  • Optimized bandwidth usage in the high-level multiplayer API.

Physics

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

Rendering

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

Shaders

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

Miscellaneous

  • 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

Buildsystem

  • Removed the server platform in favor of disabling specific DisplayServers at build-time (e.g. vulkan=no).

Core

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

Editor

  • Removed the Dim Dialog on Editor Popup editor setting since it was made obsolete by the multi-window paradigm.

GUI

Input

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

Export

Physics

  • Removed the deprecated PhysicsBody friction and bounce properties (replaced by PhysicsMaterial).

Rendering

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

Fixed

Core

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

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

Porting

  • Windows: OS.execute() now only quotes command line arguments if they contain special characters.
@ibsantos
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.

@Calinou
Copy link
Author

Calinou commented Jan 21, 2020

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

@emo10001
Copy link

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!

@Calinou
Copy link
Author

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.

@Calinou
Copy link
Author

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!

@emo10001
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?

Thanks!

@Calinou
Copy link
Author

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

@eltharionx
Copy link

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

v3.1.2stable
AStar
int get_closest_point ( Vector3 to_position ) const

v3.2RC4
AStar
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.

@Calinou
Copy link
Author

Calinou commented Jan 28, 2020

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

@eltharionx
Copy link

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

@akien-mga
Copy link

@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