

Project Description
In this project my goal is to create a custom engine using Vulkan following an ECS architecture, that I can use to make games with and learn how different systems work.
Engine Architecture
For this project I created an engine using an Entity Component System (ECS).
Scene:
A scene is a collection of Entities and their Components.Entity:
An abstract concept of an "object" in the world. A Game Object has no behaviour or functionality and is just an ID. The behaviours are added with Components. Entities always have a Transform component(position, rotation and scale).Component:
Data that is added to an entity that adds behaviour and functionality from the systems.System:
A system is something that will preform actions or behaviours on a set of components.
Taking this approach leads to an engine that can be used to make games from different genre's, as well as teaches a unique data-driven design to programming. Additionally it can lead to performance benefits as there is no wasted time due to inheritance look-ups, and abstracting components/systems that don't impact each other mean it can be multi-threaded later on.
The engine has two configurations: Dev and Release. Currently Dev mode displays the Editor UI and allows for some debug information to happen, whilst Release mode will strip that out and display only the final game. In future the Release mode will use built data, meaning that this will be optimised for the specific game being designed.


Reflection
The engine uses a custom build process which generates RTTI for each of the components. This generated RTTI allows for components to be serialized and deserialized out, as well as have their type structure/decomposition. This is used to auto-populate the properties panel, meaning any new component added will automatically have a properties panel control to adjust the values and see the impact at run-time.




An example of the serialized scene for all the entities and components:
Test Methods
In the solution, there are multiple projects used to create test cases for the implemented structures and ensure that correct behaviour is followed. This is used extensively during development to ensure that the systems programmed will run as expected, in addition to prevent future regressions when adding new features that test cases and situations are valid before submission.
Example of tests for quaternions and bounding box intersection are shown below:

