PicoGine

This personal project consists of the complete programming, from scratch, of a game engine that includes several technologies and techniques I've learned during my studies, plus the addition of some new knowledge I'll acquire throughout the development. This is a living project that will be continued over the course of several years, adding new features, new technologies, new modules to the existing platform. But in order to make this task as easy as possible, everything has to be well structured, and programmed in a way that allows easy additions to existing code.

That's why abstraction will be a key element in the development of this engine, hence the use of the Pimpl programming pattern. This will make adding, for instance, a new graphics API or sound system very easy, by adding new implementation to the existing abstraction.

The project is fully available on GitHub! Link below.


The project was on hold for a while due to my internship at Ubisoft Annecy,

and now I am working on a new and more focused revision of this project, which will be available soon.

Planned features list

Covered topics

CMake Build System

Made in a separate build folder to avoid cluttering the source tree, the CMake build system allows for an easy build of both the engine's library and the game, as well as creating an installer, in case you want to publish your project or share it to friends for testing.

For now, the engine is compiled into a static library as it is only used in a single project, but later on, this can be easily replaced with a DLL installed only once for all games using this engine.

Win32

Looks like a boring window? Well there is a lot more behind the scene that is not directly visible. The window is created using Win32 only, no extra layer like SDL is used. Window creation/cleanup, message dispatching, mouse/keyboard/char messages, all these are handled in the WindowHandler class. Keyboard and mouse inputs are forwarded to the InputManager, to be available to the entire project.

Renderer

The renderer is a big part of the project. My goal is to be able to implement multiple rendering AIP's behind a common interface using programming patterns like Pointer to Implementation, Pimpl for short. At the moment, DirectX 11 is the only one implemented, working on DirectX 12, and Vulkan will be the next one.

Another advantage of Pimpl, besides the ease to change implementations, is that include dependencies gets moved in the cpp file  instead of the header, keeping them local to the renderer, instead of everything that includes it. But on the other hand, every class that workd in combination with the renderer, like materials for example, as they store shader information, will require to be "Pimpl'ed" as well. Again, this remain contained in the implementation itself, and does not affect code that uses these materials.

The project is available on GitHub!