G-Engine is a hobby project of mine that I started developing in 2017. It is complete C++ rewrite of the engine for Gabriel Knight 3: Blood of the Sacred, Blood of the Damned, a 3D adventure game released in 1998 by Sierra Studios.
GK3 is a mostly data-driven game; even most of the gameplay logic is implemented using a custom scripting language. As a result, you can write an engine that is able to parse and utilize these data files to recreate the original experience (or improve upon it).
One way I hoped to improve upon the original game was by enabling cross-platform play. The original game game was only playable on Windows, but here is a screenshot of the game now running on Mac in the new engine:
Gabriel Knight 3 is one of those games I played as a teen and really latched onto - I enjoy it immensely, and it holds a special place in my heart. Besides being able to interact with a game I love in a unique way, a primary motivation behind this project is to improve my C++ skills and become more familiar with the internal workings of a 3D game engine.
Since starting, I have implemented the following features:
- Math library with common math functions, vectors, matrices, and quaternions
- Geometric primitives library with support for various shapes (lines, rays, planes, triangles, AABBs, etc) and various useful utilities for detecting collisions or finding nearest points
- 3D rendering pipeline with meshes, materials, and shaders
- BSP rendering logic
- Static lightmap and dynamic lighting calculations
- Key-framed vertex animation
- Compiler for the game’s custom scripting language, Sheep, which parses the language grammar into byte code (uses Flex and Bison)
- Virtual machine capable of executing custom Sheep scripts AND pre-compiled Sheep scripts packaged with the original game
- Game loop, input, and delta time calculations using SDL
- Component-based game object model
- Sound effect, music, and VO playback using FMOD
- Unit tests using “Catch” framework
- Binary parsers for proprietary assets for 3D meshes, vertex animations, and BSP (reverse engineering with Hex Fiend)
- Multithreaded asset and scene loading
- Uses CMake to achieve cross-platform IDE and build support
There’s still a lot of work to do, but I’m happy with what’s been implemented thus far! Feel free to grab the code from the public repo to try it out.
I am also accompanying development of this engine with occasional blog posts - you can find a complete list here.