Cirrus, as well as being high altitude clouds is also my high-level Nuaj wrapper also available at the same SVN repository as Nuaj here.
It's loaded with cool stuff like a FBX scene importer that allows you to load any FBX scene from your favorite 3D package like 3DS Max and Maya into a Cirrus scene that can later be saved as a unit using the (quite lousy) Cirrus proprietary format.
Cirrus is not a 3D engine filled with humongous amounts of code and 3rd party libraries : as for Nuaj its sole purpose is to ease the development of 3D projects so you can quickly come up with a 3D application that fills your needs (and some polygons at the same time, mirf hirf hirf ).
The architecture in Cirrus is quite simple and is organized like this :
Structures
There's nothing much to say about the Renderer and the Pipelines, a Renderer is (usually) a singleton (although you can create as many as you like) that contains a collection of pipelines which, in turn, contain a collection of RenderTechniques. The RenderTechniques on the other hand are quite interesting as they are the main render units that actually draw the polygons.
The base RenderTechnique class contains 3 abstract methods that need to be implemented :
- Render(), that performs the rendering of the primitives registered to the technique
- CreatePrimitive(), that creates a primitive of the type supported by the technique
- GetPrimitiveInfos(), that returns the informations about a primitive supported by the technique (basically, its name, vertices/indices count and the content of the vertex/index buffers for serialization)
Large Scenes Support
I have refurbished my old FBX importer that I used to import O3D scene and adapted it to Cirrus so you can easily load FBX scenes.
The FBX scene loader takes a bunch of parameters to load and convert an FBX scene into the Cirrus proprietary format that you can later save and load as you like.
As an input, the FBX scene loader needs what I call a "Texture Provider" that is able to create textures from a path. The default provider loads files from the disk but it's really simple to create another one that would load textures from an archive, or to make the provider part of a larger "texture manager".
Also, the scene loader needs what I call a "Material Mapper". This is basically a collection of delegates that are interrogated one after another and that should be able to convert an FBX material into a Cirrus RenderTechnique. This is quite important otherwise materials cannot be rendered, the RenderTechnique then takes the charge of creating the primitives from the FBX meshes. It's also that render technique that is able to save and reload the primitive once it's in Cirrus proprietary format.
Examples
So you see this basic organization is actually quite powerful, here are some examples of renderings I have already achieved in a few weeks.
I have written some "advanced" render techniques already like the Cascaded Shadow Map technique that computes shadow maps for your scene and provides shadow map support for the shaders :
Another technique is able to render sub-surface scattering for realistic skin rendering :
This technique can render voxel terrains (an adaptation of the GPU Gems 3 - Chapter 1) :