All Godot contributors are delighted to release our latest milestone today, Godot 3.4, after more than 6 months of development!
While most development focus is on our upcoming Godot 4.0 release, many contributors and users want a robust and mature 3.x branch to develop and publish their games today, so it’s important for us to keep giving Godot 3 users an improved gamedev experience. As such, most of the focus was on implementing missing features or bugfixes which are critical for publishing 2D and 3D games with Godot 3, and on making the existing features more optimized and reliable.
Godot 3.4 is compatible with Godot 3.3.x projects and is a recommended upgrade for all 3.3.x users.
Download Godot 3.4 now and read on to learn more about the many new features in this update.
You can try it live with the Web Editor too!
Supporting the project
Godot is a not-for-profit organization dedicated to providing the world with the best possible free and open source game technology. Donations and corporate grants play a vital role in enabling us to develop Godot at this sustained pace, since they are our only source of income, and are used 100% to pay developers to work on the engine. Thanks to all of you patrons from the bottom of our hearts!
If you use and enjoy Godot, plan to use it, or want support the cause of having a mature, high quality free and open source game engine, then please consider becoming our patron. If you represent a company and want to let our vast community know that you support our cause, then please consider becoming our sponsor. Additional funding will enable us to hire more core developers to work full-time on the engine, and thus further improve its development pace and stability.
Features
A video is worth a thousand words, and thanks to GDQuest, we have one that gives a great overview of the main highlights of Godot 3.4:
There have been thousands of changes, big and small, so listing everything would be impossible. You can however consult the detailed changelog, where we attempted to list most relevant changes, separated by category: additions, changes, removals, and fixes. Note that this is a changelog between 3.3-stable and 3.4-stable, therefore it also includes some of the fixes already made available in intermediate 3.3.x maintenance releases.
In the rest of this post, we aim to give a broad overview of the most noteworthy features and changes in Godot 3.4. You can read in order, or use the index below to jump to your areas of interest.
Core:
Rendering:
Platforms:
Physics:
Assets pipeline:
Editor:
Other areas:
This is not an exhaustive list of changes in this release, so we advise interested users to also dive into the detailed changelog to know more.
Core
Most Godot users have run into situations where an Object
instance gets deleted (e.g. by calling queue_free()
) but is still accessed somewhere else in a script. Such use-after-free access needs to be guarded with is_instance_valid(obj)
, but this has been surprisingly difficult to get right due to a number of bugs and inconsistencies between debug and release builds.
Pedro J. Estébanez (RandomShaper) has become an expert on this topic and made a number of improvements included in Godot 3.2.2 and Godot 3.3. With this new change, the checks which were already performed in debug builds have been promoted to also run in release builds, solving a discrepancy which was the source of much trouble for Godot users. This has a theoretical performance cost for release builds, but it was found not to be significant.
Large files support (> 2.0 GiB)
The File
API can now manipulate files larger than 2.0 GiB, including PCK files, which used to be a limiting factor for bigger games.
Everything has been refactored to used unsigned 64-bit integers, which means that Godot now supports loading files of up to 8.4 million TiB… which should be sufficient for the foreseeable future.
Pedro started this work in 2019, and Rémi Verschelde (Akien) updated it for the 3.4 release to match the core contributors’ consensus.
Frame delta smoothing
Currently, frame deltas are measured by sampling the OS clock, which can be subject to considerable random variations. Even when frames are being consistently displayed precisely at the vsync rate, these input timings can throw off object positions. lawnjelly added an option for frame delta smoothing that detects when Godot is hitting vsync consistently, and replaces the sampled input time with the fixed vsync delta. This can significantly improve the fluidity of motion and give smoother gameplay. This option is enabled by default, but can be turned off if you experience timing-related issues with your projects.
Another option was added to sync frame delta after draw, which is disabled by default. It may lead to more consistent deltas and further reduce frame stutters for some games.
Manuel Moos (zmanuel) also implemented a fix for occasional negative frame deltas due to getting out of sync with the OS clock.
bruvzg added support for physical keys in the keyboard InputEvents. Physical keys are a way to map the position of a key based on a standard US QWERTY keyboard layout, so that the same location can be used even when the player’s keyboard layout is different. For example mapping movements keys to WASD using physical keys will automatically remap them to ZQSD on a French AZERTY keyboard (where W and Z, and Q and A, are swapped). This makes it easier to support multiple keyboard layouts.
To simplify some of the most common constructs in input handling code for character movement, Aaron Franke (aaronfranke) added two new helper methods: Input.get_axis()
and Input.get_vector()
. These methods allow simplifying code like this:
var walk = WALK_FORCE * (Input.get_action_strength("move_right") - Input.get_action_strength("move_left"))
var velocity = Vector2(
Input.get_action_strength("move_right") - Input.get_action_strength("move_left"),
Input.get_action_strength("move_back") - Input.get_action_strength("move_forward")
).normalized()
To this:
var walk = WALK_FORCE * Input.get_axis("move_left", "move_right")
var velocity = Input.get_vector("move_left", "move_right", "move_forward", "move_back")
For more information, read the “Which Input singleton method should I use?” section of the controller input article.
Crypto: AES and HMAC contexts
Fabio Alessandrelli (fales) backported a number of cryptographic features for the 3.4 release, adding an AESContext
to provide a scripting interface to AES-ECB and AES-CBC encryption/decryption methods. Godot can now save and load public keys, sign and verify a hash with a RSA key, and encrypt and decrypt RSA keys.
Jon Bonazza (jonbonazza) and tavurth respectively implemented and backported HMAC support in the crypto API via a new HMACContext
. This can be used as an authentication method notibly to interact with services such as GameAnalytics.
Rendering
Portal occlusion culling
Up till now a significant missing feature in the renderer has been the ability to cull (prevent rendering) objects that are within the camera view, but occluded by another object (for instance a wall). Although raster (pixel based) occlusion culling will not be available until Godot 4, some geometrical occlusion methods are being added to Godot 3.
Thanks to lawnjelly, Godot 3.4 introduces portal occlusion culling, which is a tried and tested occlusion solution that has been used in many games, but does require some manual setup of the scene. As well as performing occlusion culling it also provides a solution for throttling AI and processing based on proximity to the viewer.
In addition the ability to add simple geometrical occluders to scenes is being rolled out, starting with spherical occluders which are available in 3.4.
ACES Fitted tonemapper
Godot 3.4 adds a new ACES Fitted tonemapper option contributed by Endri Lauson (Lauson1ex) that allows scenes to look more realistic, such as by correctly handling the contrast of bright objects. You can try it out in the Third Person Shooter (TPS) demo which has been updated to use the ACES Fitted tonemapper.
Ring emitter for 3D particles
Ilaria Cislaghi (QbieShay) implemented a new ring emitter for 3D particles which can emit particles on a ring or hollow cylinder with configurable radii and height.
Shader language features
Our shader language maintainer Yuri Roubinsky (Chaosus) is busy doing magic on the development branch for Godot 4.0, but with the help of lyuma some of the most-requested features could be backported to Godot 3.4.
This includes support for structs and fragment-to-light varyings, as well as global const arrays. The TIME
built-in uniform was also made available in custom functions by default.
More rendering improvements
While there’s so much rendering work being done for Godot 4.0, the 3.4 release got its fair share of improvements and bug fixes, thanks to the dedication of many contributors!
Some examples are:
- Octahedral map normal/tangent attribute compression (GH-46800).
- Added basic support for CPU blendshapes in GLES2 (GH-48480, GH-51363).
- Fix draw order of transparent materials with multiple directional lights in GLES3 (GH-47129).
- Fixes depth sorting of meshes with transparent textures (GH-50721).
- Add new 3D inverse-squared point light attenuation as an option (GH-52918).
- And more! Search “rendering” in the changelog.
Fredia Huya-Kouadio (m4gr3d) implemented initial support for the new Android scoped storage API, enabling us to target API level 30 as required by Google Play. This doesn’t cover all features yet for external storage access, which are being worked on for Godot 3.5.
Initial support was also implemented for Android’s Play Asset Delivery, which replaces APK’s expansion files (OBBs) for Android App Bundle (AAB) binaries.
Pedro added an option for agile input processing, which can help increase responsiveness for input on lower-end mobile devices, so you can keep games playable even if the framerate isn’t at a steady 60 FPS.
HTML5: PWA, Godot/JavaScript interface, AudioWorklet
Our HTML5 platform maintainer Fabio kept doing a lot of work for this platform in the 3.4 development branch, which brings us a number of new features and improvements.
Godot Web projects can now optionally include support for being installed as Progressive Web Apps.
A new JavaScriptObject
was exposed to provide an interface between Godot and JavaScript, enabling you to call JavaScript methods directly from your Godot scripts. This makes it much easier to use JavaScript APIs in your Web projects.
extends Node
func _ready():
# Retrieve the `window.console` object.
var console = JavaScript.get_interface("console")
# Call the `window.console.log()` method.
console.log("test")
AudioWorklet was implemented for multi-threaded builds in Godot 3.3, solving issues with audio playback. But not all browsers or Web games platforms provide support for the necessary multi-threading APIs yet, so for single-threaded exports, AudioWorklet was also implemented as a non-threaded option. Performance is not the best, but it’s better than stuttering audio as users might experience on Chrome due to their deprecation of the previous standard ScriptProcessorNode
approach.
macOS: Mono universal build, GDNative Framework, notarization
Thanks to an update of our Mono version to 6.12.0.158 (Preview), macOS builds can now target Apple Silicon too, so the macOS Mono builds are now also universal builds (both x86_64
and arm64
support).
bruvzg also added support for using macOS .frameworks
libraries with GDNative, and in-editor integration for the Apple notarization process (only available when exporting to macOS from macOS).
Physics
Thanks to the work of multiple dedicated contributors, many improvements and fixes have been done in both 2D and 3D physics. It can’t be all detailed here, but here’s a list of the ones that have the most impact on usability and performance.
KinematicBody improvements in 2D and 3D
While character controllers are being reworked for Godot 4.0 to be more reliable and much easier to use out-of-the-box, some major improvements and fixes have been also added to the 3.4 release:
- Better handling of moving platforms thanks to fabriceci: GH-50166.
- Improved RayShape stability in Godot Physics 2D/3D: GH-53453.
- Various improvements for floor stability in Godot Physics 2D/3D.
Faster and more reliable convex hull generation
Morris Arroad (mortarroad) has worked on using a more reliable algorithm from Bullet to generate physics convex hulls from meshes. It’s now several times faster in complex cases, and has generally better results: GH-48533.
On top of that, thanks to the common work of Camille Mohr-Daurat (pouleyKetchoupp), jitspoe and lawnjelly there’s now an option to generate a simplified convex hull from complex meshes, in order to make a convex hull that’s better for performance, at the cost of losing a bit of accuracy.
Example original mesh (40K vertices):
Simplified convex hull of that mesh (56 vertices):
Revamped collision layer grid in the inspector
The layer grid widget has been improved to be more readable and support up to 32 collision layers in physics.
Dynamic BVH for Godot Physics 2D
Based on the most part on the work lawnjelly already did for 3D, pouleyKetchoupp has added support for using a dynamic BVH for the broadphase in 2D physics: GH-48314.
Like the 3D version, it generally has better performance and is more reliable, but it’s still possible to switch back to the old HashGrid in project settings if needed.
Improvements and new features in Godot Physics 3D
While Godot Physics 3D is being worked on to become the default physics engine in 4.0, new features and improvements are backported to 3.x when possible.
That includes:
- Support for HeightMap shapes with the same optimizations as in Bullet thanks to the work of Marc Gilleron (Zylann).
- Support for Sync to Physics.
- Various fixes for RigidBody and KinematicBody.
Assets pipeline
Export 3D scenes as glTF
The glTF module authored by Ernest Lee (fire for Godot 4.0 was backported to the 3.x branch by lyuma. The biggest feature this adds is the ability to export scenes as glTF. This means you can build a scene in Godot using your favorite tools such as CSG, and then bring all of the mesh data into other 3D applications such as Blender or other Godot versions.
Lossless WebP encoding
WebP is a new image format that can replace both JPEG and PNG. It has both lossy and lossless modes which are much more optimized than JPEG and PNG, it has a faster decompression time and a smaller file size compared to PNG. Godot already used WebP for lossy compression, and Godot 3.4 now defaults to using it for lossless texture compression instead of PNGs, thanks to work from Morris Arroad (mortarroad). The importer time might be slightly increased, but the imported file sizes and loading times are significantly reduced.
For existing projects, you may want to delete the res://.import
folder to force a reimport of all lossless compressed textures using WebP. PNG is still supported, and can be enforced as the default via an option.
Editor
Revamped UI theme editor
Godot provides an extensive system for customizing the looks of UI nodes, but until this point the tools for that were lacking ease of use and kept some users away from a really cool feature. To address multiple concerns and suggestions Yuri Sizov (pycbouh) worked on overhauling the editor tools for theming and skinning. The new theme editor aims to make it as straightforward as possible to adjust your control nodes. You have improve listing of available properties that can be easily overridden for your project. A control picker allows to visually select the node you want to customize right from the preview panel. You can have custom previews from the scenes that make sense for your project. Styleboxes of the same type can be edited together to save you time adjusting their margins and borders. And theming power users can enjoy a new item management dialog that gives a lot of granularity when doing bulk adjustments to Theme resources.
Take a look at the new theme editor in action in this GDQuest video:
Localized class reference
Rémi implemented support for localizing the in-editor class reference back in March 2020 for 4.0, and finally decided to backport the new feature (and first round of community-authored translations) for 3.4.
Godot 3.4 includes class reference translations for Chinese (Simplified) and Spanish with a high rate of completion. French, Japanese, and German also have translations included, but only for a subset of the API. Everyone is welcome to participate in the translation effort, so that future releases can include more languages and more translated content.
General usability improvements
The 3.4 release has a huge focus on editor usability. Those are changes which are for the most part independent of the big core, rendering and scripting changes in the 4.0 branch, and can therefore be backported relatively easily.
Here’s a short selection of some highlights:
Other areas
Animation “reset” track
One of the most common hurdles when using AnimationPlayer is that editing animations will permanently modify the state of your scene. To avoid this, users had to manually undo changes to all properties modified by the animation.
Now the resetting process can be automated, with the addition of a RESET animation feature thanks to Pedro. The RESET animation can be automatically added to AnimationPlayer and whenever a new keyframe is inserted for the first time, its value will also be mirrored in the RESET track as a default value. Upon scene save, affected properties are automatically saved with their default values, so editing animation no longer affects what is saved in your scene.
2D viewport scale factor
Ansraer added a 2D viewport scale factor in the Project Settings, which can be used to make 2D elements larger or smaller, independently of the current stretch mode.
Improvements and fixes to path mode for CSGPolygon
CSGPolygon has gotten a number of fixes and improvements in this release, notably thanks to jitspoe who added properties to configure angle simplification, UV distance, and path interval when using the Path mode.
And many more changes!
There’s a lot more that would be worth showcasing in this blog post, but it’s already fairly long and we’re eager to get it published :D
Godot 3.4 is ready to use now and we want you to have it without further ado.
We would like to take the opportunity to thank all of our amazing contributors for all the other great features merged since 3.3, and the hundreds of bugfixes and usability improvements done in this release. Even if not listed here, every contribution makes Godot better, and this release is truly the work of hundreds of individuals working together towards a common goal and passion.
For more details on other changes in Godot 3.4, please consult our curated changelog, as well as the raw changelog from Git (chronological, or sorted by authors).
Reporting issues
Godot is a complex piece of software and is not bug-free. Our contributors do their best to fix issues as they are being reported, but there’s a lot of surface to cover and you might encounter situations which we aren’t aware of yet, or couldn’t fix in time for this release. There will be 3.4.x maintenance releases focused on fixing bugs in coming weeks and months, so make sure to report any issue you encounter on GitHub, so that we can make sure to fix it for our future releases.
Giving back
As a community effort, Godot relies on individual contributors to improve. In addition to becoming a Patron, please consider giving back by: writing high-quality bug reports, contributing to the code base, writing documentation, writing tutorials (for the docs or on your own space), and supporting others on the various community platforms by answering questions and providing helpful tips.
Last but not least, making games with Godot and crediting the engine goes a long way to help raise its popularity, and thus the number of active contributors who make it better on a daily basis. Remember, we are all in this together and Godot requires community support in every area in order to thrive.
Now go and have fun with 3.4!