I've been really passionate about this project. In 2023, I learned the ins and outs of WIN32 at my university and I decided to play around with its functionality. It slowly formed into a small game loop and I wanted to see what I could do with only the provided Windows SDK tools. So I started developing the engine with the goal of making a game in mind.
In 2024, my university taught me how to create a proper component-based engine (see: The Custom 2D Engine) and I'm planning to integrate this pattern soon into my own engine.
This is something I can only work on in my free time and for now, I mostly worked on making sure the low level systems are working well and that the basics for making a game are in there (textures, fonts, audio, ...). There's still a lot on my To-Do list to implement which I look forward to. The first version has been released on Github with full documentation: JelA Engine v1.0.0
Read about some current implementations down below.
I spent quite some time uncovering the secrets of the Windows SDK. The engine is made with the WIN32 API and I used the provided SDK tools such as XInput, Windows Media Foundation (WMF), DirectWrite and Direct2D.
I used WMF for the audio implementation, it is based on this example found in the microsoft documentation: How To Play Media Files . This was a tough task, but I managed to make it work. I'm planning on improving this even more in the future to gain some deeper insight in decoding audio and video files.
Using Direct2D felt really intuitive so far. Based on the documentation I was able to create and render textures (and primitives). I also implemented a transform system (supports translation, rotation and scaling) simular to the openGL system where you have to push and pop a transformation matrix.
I spent quite a few days researching how fonts are actually created and used. Eventually, I discovered DirectWrite has an intuitive usage simular to Direct2D.
Font objects need a FontCollection and a TextFormat. FontCollections are created with a filename or a locally installed fonts name. TextFormats are created with the FontCollection. They specify weight, style, stretch, size and allignment. The user of the engine can specify these properties.
When users want to make use of resources like textures and fonts, this should feel intuitive and non-verbose.
I implemented a ResourceManager that keeps a unordered map per resource type and it maps the filename to the resource object. I decided that the user should be able to get a raw pointer that refers to the object, because it implies non-ownership. But also because it happens often that you want some certain behaviour when the 'reference' pointer is a nullptr. This isn't possible with C++ references.
The ResourceManager sets these 'reference' pointers to nullptr whenever the resource object gets removed. It also handles the removal whenever such a 'reference' pointer goes out of scope.
The engine supports switching between different standardized character sets. On the left you can see defines in addition to the tchar.h defines. This make the project character independant so the user can decide what character set to use.
These are some To-Do's I will implement in the near future:
Component-based architecture
Event system
Rendering videos with Windows Media Foundation
Direct2D Effects (noise filter, Gaussian Blur, etc.)