Progress report for 3 monthsGeneral ·
It was quite a while since I did the last post about the progress in rg3d (November 2020, ouch). Now it’s the time to fix that! For last three months rg3d and rusty-editor has gained lots and lots of big features and improvements. Also I started making new game using the engine - a Sci-Fi 3D shooter called Station Iapetus, check the end of the post for more info, but for now just check the video:
Lets start from the engine, it has 139 new commits from November 2020, here are the most interesting changes (prepare for the wall of text :) ):
- Improved dark UI theme - default dark theme is more elegant now.
- Added verbosity levels for logger - now you can reduce “noise” levels from the engine by setting verbosity for the logger.
- Improved lightmap quality - lightmaps are now smoothed and almost seam-free.
- Added proper syncing between physics and scene graph - which means that it is possible now to add a static physical body to a node and every descendant node will provide its geometry as collider for the body.
- Improved examples - added navigational mesh example which demonstrates how to use navigation agents.
- Improved particle systems - added cylinder emitter for particle systems, improved performance.
- TextBox widget now have multiline mode and different “commit” modes (LostFocus, Enter, etc).
- Improved lots of UI widgets and added VectorImage widget.
- rg3d-sound is now able to manage multiple contexts - which means that you can easily create multiple sound scenes and operate on them separately! This is extremely useful for multi-scene games: for example you can now create a sound scene for a menu and one for game level and all entities on the sound scenes will be completely decoupled from each other.
- hrtf crate now has 2 times better performance - thanks for performance improvements in rustfft crate.
- Added support for 64-bit FBX format (version 7500+) - it is very important because mixamo.com migrated to latest FBX SDK and all of the animations and character models have become “unloadable” - now it is fixed.
- Animation blending state machines were improved - I added BlendAnimationsByIndex state machine node which allows you to switch animations by index with given amount of time for transition.
- It’s now possible to copy nodes in-place - previously it was possible only to copy node from scene to scene.
- The number of draw calls for UI was reduced by 70% - I changed the way of how clipping works: previously it was using stencil buffer, now it uses scissor test.
- Fixed UI clipping issues - this is related to previous point - it seems that using stencil test wasn’t a good idea.
- Fixed text measurement in the UI - previously text’s height was measured incorrectly.
- Opacity for UI widgets was added - this extensively used to greyout disabled widgets.
- Layout of Scroll- and Wrap- panels was fixed.
- Light scatter issues for spot lights were fixed - due to incorrect trigonometry calculations light volumes were clipped.
- Support for transparent meshes - simple forward renderer was added to render transparent meshes.
- Migrated to rapier 0.5 - which fixed lots of issues in the physics.
- Animation signal handling is fixed when animation playing in reverse.
- Animation tracks now are able to filter position/scale/rotation.
- Sprite rendering fixes - there was incorrect blending options that were causing graphical issues.
- Pool now implements FromIterator trait.
- Navigation meshes are now correctly copied when instantiating model resource, however inheritance is not yet implemented.
- Fixed polygon triangulation - there was an incorrect loop exit condition.
- Now FBX loader does not add redundant “root” node in the scene during instantiation.
- Fixed layout issues in FileBrowser and FileSelector widgets.
- Now it is possible to render instances of UserInterface in separate render targets - this is extremely useful when you need to draw offscreen UI (for example a touch screen panel in a sci-fi game).
- Added Fast Approximate AntiAliasing (FXAA) - not the best solution for anti-aliasing, but very cheap and easy to implement.
- Fixed lots of Clippy warnings.
- Added integrity checks for resource instances - now engine automatically adds missing nodes from resource if an instance of the resource does not have it.
- Improved resource inheritance - now the engine is able to correctly resolve dependencies of resources.
- Scene nodes now have tags - very useful feature to mark nodes with game info. For example, lights can be marked with “FlashingLight” tag and later on you can search all the lights with such tag and add “flashing” behaviour.
- Now scene graph allows to perform custom search using custom predicate.
- Slightly improved user interface performance.
- Improved performance of animation machine’s
- Now it is possible to select binding direction between a rigid body and a scene node - previously only node-to-body binding was possible, but now body-to-node binding is available too.
- Lots of improvements in SceneDrawingContext - fixed drawing of shapes, added
- Fixed calculation of isometric transform which was used in physics-to-graph transform syncing.
- Now scene gathers performance statistics per frame.
- Added ColorGradientBuilder which allows to build ColorGradient in declarative manner.
- Added navigation agents (commonly known as NavmeshAgent) which are used for navigation on arbitrary navigation meshes.
- Added path smoothing for navmeshes - now behaviour of agents are much nicer, check the video below.
rusty-editor changes rapidly too, it has 96 new commits from November 2020, here are the most interesting changes:
- Added an editor for navigation meshes - there is still no automatic generation for navmeshes, so I added simple navmesh editor.
- Added an editor for particle systems - currently is not so flexible, but powerful enough for some not too complex effects.
- Improved copy/paste in rusty-editor - now it correctly copies all associated entities (rigid bodies, colliders, etc)
- Configurator now remembers history of previously selected working directories, which is very useful for quick iterations.
- Now gizmos have shadows disabled.
- Interaction modes now behaves almost correctly.
- Added debug drawing of the physics - this allows a user to precisely configure location of colliders and rigid bodies.
- Now it is possible to edit properties of colliders.
- Fixed deletion of complex selection - this means that editor won’t panic or behave unexpectedly when you trying to delete multiple nodes at once.
- Added support for joints of various kinds.
- Disabled ability to delete root node.
- Added ability to create directional lights.
- Added scene validation before saving.
- Some menu items are now disabled when there is no active scene.
- Asset previewer now has grid which allows you to quickly understand the size of a model.
- Now editor prints current scene’s path.
- Added “breadcrumbs” - it shows a path from selected node to scene root, it is very useful for quick navigation.
- Limited camera pitch - now it is impossible to be upside-down.
- Added switch for binding direction for rigid bodies.
- Added “Is Sensor” flag for rigid bodies.
- Disabled editing node names of resource instances - this is related to resource inheritance, it relies on the suggestion that name won’t change after instantiation.
- Track instantiated animations - previously editor just “forget” about instantiated animations which was leading to orphaned animations.
- Added ability to edit tags.
As I mentioned in the beginning of the post, I started making a new game. It will eventually be released in the Steam, and I hope it will become the proof that the engine is production-ready quality. Here are some fresh screenshots:
I’m planning to release demo in at 29th of March to get some feedback and improved the game before release it in Steam. Check the repository for more info.
The future of the engine
Unfortunately, the future of the engine heavily depends on the money. I’ve tried to get some sponsorship from various companies, but with no luck yet. I hope to get some money by selling Station Iapetus in the Steam. I’m working on the engine for more than 2 years now and getting very little financial support. If you want to see the project alive, please consider to make a donation on Patreon or LiberaPay , unfortunately GitHub sponshorship is not available in my country.