Simulant 21.03 Released!

It's the end of the first quarter of 2021, and that means another Simulant release!

After the fairly quiet release in December, the time we have a feature packed version for all you lovely game developers!

Cave Demo

Initial PSP Support

It's always been the intention to support as many platforms post-Dreamcast as possible, and supporting the PSP really is a no-brainer when it has such an active homebrew community. 21.03 includes the first steps towards full-featured support for the PSP. PSP builds are running on CI, and some demos are successfully running. There's plenty more to do though, so if you're in the PSP community and want to make PSP support first-class then please get involved!

Huge Reduction in Memory Usage

Stage node memory usage has been reduced by 33% on average, sometimes this can be much more. The node pool is now shared across all stages (which reduces wasted space when using multiple stages) and larger stage node types (e.g. Widgets) have been refactored so that stage node types are approximately equally sized (again, reducing wastage).

Faster Materials, and More Memory Savings

The Material system has been re-written under the hood to reduce memory usage. Material property values are now only stored if they differ from the default material definition, effectively now Materials and MaterialPasses are a delta-diff from the base material which greatly saves memory.

In addition to this, property types are no longer stored in a Variant (which would greatly waste memory, a boolean property would take the same space as a 4x4 matrix!), and Material property accesses have been optimised to improve performance.

Faster .fnt Loading

.FNT font loading has been refactored to be blazingly fast. Previously loading fonts would stall the Dreamcast for a second or two, but now it's near instantaneous!

Input Improvements

You can now check if an input axis was activated or deactivated during the last frame by calling input->axis_was_pressed("...") or input->axis_was_released("..."). This removes some of the boilerplate needed when doing one-off checks for in-game menus, or weapons firing etc.

Improved Fullscreen and Resolution Handling

Simulant now uses SDL's desktop scaling flags if supported. Also the platform classes have gained a native_resolution() function which will tell you what the native resolution of the platform is.

Upgraded Bounce Physics

Simulant is now using the last Bounce physics engine available before it was taken offline. The Simulant community is now maintaining a fork of the project in its community GitLab group, which will be used to fix bugs etc. going forward.

Textures can now be "Flushed" to the Renderer

Previously texture uploads would always happen just before the render pipeline was processed - this was problematic if you were loading a lot of textures into RAM in a single frame. Now textures have a "flush" method which will force the renderer to upload the texture to VRAM and free the memory (if that's the configuration).

Default Textures and Texture Map Toggling

All built-in texture map properties now have a default texture, this differs depending on which map property it is, diffuse_map for example has an all-white texture. This creates consistency across renderers when accessing textures that haven't been explicitly bound.

Also, the s_texturing_enabled material property has been changed to s_textures_enabled and is now a bitmask of enabled texture maps, so you can for example turn on diffuse_map and light_map, but leave normal_map disabled etc.

Threading Fixes

There have been a lot of fixes to the threading subsystem. The Dreamcast platform no-longer uses pthread and instead uses native threading primitives.

Logging Improvements

The old L_ prefixed logging macros have been replaced by S_ prefixed macros which take printf style variadic arguments, placeholders still follow the {0}, {1} format.

Logging in release mode no longer outputs the file and line of the logging statement.

Audio Memory Improvements

Streaming .OGG files no longer maintains the whole file in memory, and instead a persistent file buffer is used.

Special Thanks

Huge thanks to all the contributors this quarter, but particularly to @freakdave who has contributed the most beautiful demo to the samples folder (seen above). Thank you!