Godot 3.4 is released with major features and UX polish
By: Rémi Verschelde 6 November 2021
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.
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.
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.
- Promote object validity checks to release builds
- Large files support (> 2.0 GiB)
- Frame delta smoothing
- Improved input handling
- Crypto: AES and HMAC contexts
- Portal occlusion culling
- ACES Fitted tonemapper
- Ring emitter for 3D particles
- Shader language features
- More rendering improvements
- Android: Scoped storage, Play Asset Delivery, input responsiveness
- macOS: Mono universal build, GDNative Framework, notarization
- KinematicBody improvements in 2D and 3D
- Faster and more reliable convex hull generation
- Revamped collision layer grid in the inspector
- Dynamic BVH for Godot Physics 2D
- Improvements and new features in Godot Physics 3D
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.
Promote object validity checks to release builds
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)
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.
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.
Improved input handling
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_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()
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.
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
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.
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.
Android: Scoped storage, Play Asset Delivery, input responsiveness
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.
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.
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
macOS: Mono universal build, GDNative Framework, notarization
Thanks to an update of our Mono version to 18.104.22.168 (Preview), macOS builds can now target Apple Silicon too, so the macOS Mono builds are now also universal builds (both
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
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.
- 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.
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.
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:
- Use QuickOpen to load resources in the inspector
- Rationalize property reversion
- Allow to create a node at specific position
- New export templates manager
- Make several actions in the Inspector dock more obvious
- Improve the 3D editor manipulation gizmo
- Improve the animation bezier editor
- And more! Search "editor" in the changelog.
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
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.
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.
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.