Okay, here is the first progress report on Galatea, my anime-themed high school romance simulator. As stated in the previous post, this one will largely focus on very dry technical features. I promise that more gameplay-related content will be coming soon. Here are some of the new engine features I’ve been working on:
New audio system
I had an audio mixer from the earlier incarnation of this engine when it was only designed as a reimplementation framework, but it was VERY basic, with only two channels of audio, no streaming, and support only for uncompressed PCM wave files. This new audio system is a complete rewrite, and while abstract enough to work with any audio API or custom-built mixer, it is currently based off OpenAL. It provides the basic standard features you’d expect such as 3D positional audio and multi-threaded streaming, which should be enough for the purposes of this game. For the streaming, I have written an API which can easily be extended with ‘plugins’ for new types of compressed audio streams, and as such I’ve included support for compressed OGG Vorbis audio with this system.
Improvements to the Renderer
The OpenGL renderer now has proper support for GLSL shaders and vertex buffer objects. I wanted to support shaders in such a way that integrating them with the currently existing material system would allow the configuration of shader uniforms to be handled largely automatically and invisibly. I also wanted the shader API to be abstract enough to allow the other rendering interfaces to be completely unaffected if I ever decided to add support for another graphics API. Although unlikely to be fully supported, the shader implementation also allows a fallback onto a fixed-function path in the rare cases where shaders are not supported, on very old mobile devices for example. Vertex buffer objects are a feature which has been common in GPUs for over a decade now, and simply allows the storing vertex data in VRAM as a means of gaining back performance which would otherwise be spent sending the data across the bus, so some changes had to be made to core architecture of the renderer to better support this. As such, the renderer is finally beginning to look like something which isn’t straight out of the 90s. I also added support for cubemaps and skyboxes, a new scene graph based on inverse kinematics rather than forward kinematics, as well as doing some more preliminary work needed to support skinned animation rendering. There are still other things I wish add though, such as translucent objects, better sorting of objects by materials, and support for object instancing.
Bullet Physics and Collision
You may be thinking that supporting a full physics engine (bulletphysics.org) might be overkill for what is essentially a 3D waifu simulator, and you may correct, but I really wanted to integrate a proper physics engine to support subtle procedural animation features on characters such as dynamic hair and clothing. Bullet was largely simple to integrate, but I did have some trouble making it play nice with my object/component paradigm. Since the game logic system allows objects to be dynamically created and destroyed on the fly, I wanted the physics implementation to be able to implicitly create compound shapes for rigid bodies when it detects multiple collision components in its child objects. As such, most of my work on this area was developing a messaging protocol to tell physics objects when and when they shouldn’t attempt to rebuild themselves if the game state has changed. There is still work to be done in this area and missing features to add, but it is at least functional at this point.
Multi-resolution support and configurable framerates
This is fairly self-explanatory, but it still amazes me just how many PC games, even commercial AAA games, really lack in this area, as it’s such a simple feature to support. You can set the game to any full screen resolution your monitor supports, and you can also have borderless and resizeable windows now.
Resolution-independent GUI system
This feature is not complete and is still actually in the early stages, but I felt it was still worth mentioning. Since a lot of interaction in the game is going to be based around menus, I need to create a GUI system which fulfils two essential requirements, I want it to be able to scale to any resolution due to the sheer amount of screen sizes now available in the mobile space, and I want it to integrate directly with the game logic and scripting system of the 3D game world rather than being treated as a separate ‘black box’. By allowing it to integrate seamlessly with the rest of the game logic, I hope to be able to create some very impressive menus with fancy animation and behaviour with the integrated scripting language. This design should also allow support for GUIs which can be detached from the orthogonal screen perspective and projected into the 3D world, which would be necessary if I decided to support VR at some point. So far, I have only developed the algorithm which allows for rectangular GUI elements to dynamically reposition themselves through a combination of margins and anchors, but this was the part I felt would be the trickiest. Now that I have that part working, adding the rest of the support should be fairly straightforward.
Sets of game objects can now be grouped into ‘prefabs’ which allows complex objects to be loaded from separate files for convenience and organization. The Assimp loader can also automatically generate prefabs when it loads scenes which contain multiple meshes or nodes.
Everything else was largely code re-factoring, minor features, or bug fixes. However, something I’m wanting to do is put together a little tech demo together which would allow players to walk around one of the scenes which will feature in the full game. For the past few days, I’ve been working on my school scene in Blender, largely creating new modular parts and props, as well as creating UV maps for them. The one thing which is holding me back is the lack of decent textures. As you can see from the new prerender I’ve attached to this post, I have some textures in already, but they’re either mediocre efforts or just simple placeholders which do not reflect the style I’m aiming for. The actual style I need is a sort of ‘painted’ look rather than a pseudo-realistic look, with detail and shading being baked directly into the diffuse texture.
If you feel this is something you can help out with, please get in touch with me.