Simulant 21.06 Released!

Unfortunately a little later than scheduled, I'm happy to announce the release of Simulant 21.06!

Due to me moving home it's a little less feature packed than some releases, but, there's still plenty to see! Without further ado, here's the new shiny!

Support for VQ Compressed Texture Formats

The Dreamcast natively supports a kind of texture compression called VQ compression. It's a remarkably memory efficient way of supplying texture data. Of course, other platforms don't natively support VQ compression in hardware so that makes it tricky to support in a cross-platform way.

In 21.06 we've added support for .dtex files which is the output format of the excellent texconv utility. When loading .dtex files, VQ compressed formats are loaded directly to hardware on the Dreamcast, but decompressed in software on other platforms! This allows you to ship a single compressed image format for use everywhere, with the caveat that decompression will hit loading times (and of course, memory) on non-Dreamcast platforms.

Introduction of the Path Type

Up until now, Simulant has been using the unicode type to deal with file paths. However, paths are not always valid unicode and so should not be stored in a unicode type. Instead Simulant now uses a new Path type that is based on std::string. This will behave more correctly, and also be more efficient.

VertexData and IndexData can now be Shared

Previously each Mesh got its own VertexData instance, and each SubMesh got its own IndexData. This could potentially be very wasteful. Now you can pass a VertexDataPtr or IndexDataPtr during Mesh or SubMesh creation respectively and these can be shared across multiple meshes/submeshes.

Doxygen Documentation Generation

We now have an automated Doxygen build process that generates up-to-date API documentation which you will always be able to find here.

get_platform() is now Global

Previously information on the platform an app was running on was available via the window property. This made little sense, as by definition the platform is global state.

Now in addition to get_app() which was added in the last release, there is now a global get_platform() function that returns a Platform* so you can query information about the system (e.g. how much memory is available etc.)

Materials now Contain Fog Properties

Up until now you could enable fog in some capacity on the stage, this API has been removed in favour of fog being a Material-level property as it should always have been. The additional properties are:

  • s_fog_mode
  • s_fog_density
  • s_fog_start
  • s_fog_end
  • s_fog_colour

Revamped Texture Formats

Texture formats previously didn't allow for different component orders (e.g. BGRA) and some formats were ambiguous. These problems have now been rectified with better texture format naming.

Improvements to Skyboxes

You can now pass TextureFlags when loading skyboxes to have full control over the kind of filtering etc. that takes place.

Added StageNode::link_position

It's a common case that you'd like a stage node to "follow" another node, but without any kind of hierarchical re-parenting. For example, once you've created a skybox, you'd probably like it to stay positioned around your camera. Previously you could use node parenting and the (brittle) StageNode::lock_rotation function, but this has now been replaced with link_position e.g.

skybox->link_position(camera);

To unlink you simply pass nullptr to link_position

Better Sound Buffer Size Calculation

Previously sounds used a constant buffer size, but this could mean that high quality audio could suffer from drop-outs. Now the buffer size is calculated based on the bitrate of the audio.

Renaming of Sound Classes

A little bit of API clean up. Source is now named AudioSource, and SourceInstance is now called PlayingSound. This makes the API much clearer.


That's it! There's the usual scattering of bug fixes and small features but 21.06 is a big leap forward in just a few months!