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!
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.
Path
TypeUp 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.
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.
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 GlobalPreviously 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.)
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
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.
You can now pass TextureFlags
when loading skyboxes to have full control over the kind of filtering etc. that takes place.
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
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.
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!