ReDoom game engine is an unpretentious side project, conducted for learning purposes. The main goal is to develop a game engine from the ground up, bundling as many interesting features as possible, for me to learn as much as possible about the different concerned fields:
- Computer graphics
- Spatialized audio
- Game physics
- Networking
- Artificial intelligence and predefined behaviours
- Debugging, software profiling, benchmarks, optimization
- ...
There is no fixed end goal, as this project aims to be a playground for any idea I would be interested in trying. However an unofficial goal is to recreate at some point one level from the first Doom game, mostly as a tribute to this game which is considered, alongside its older brother Wolfenstein 3D, to be the grandfather of first-person-shooter games.
As this is a project with no fixed end goal, conducted only for learning
purposes, it also has no clear roadmap. I am developing features to my liking.
For that reason, I describe herebelow not a complete roadmap, but only the
current status of the project and what I plan to do next, in the short term.
You can also visit the project's open issues where I keep track of improvements I want to bring to my project, as well as the known bugs or performance issues I want to fix.
Domain | Feature | Status |
---|---|---|
Build system / CI | ||
Use clang-format and clang-tidy to lint and perform static analysis on the code | ✔️ | |
Use thread-sanitizer to detect potential data races | ✔️ | |
Use ccache and ctcache to reduce build times in Github Actions | ✔️ | |
Core | ||
Implement a data-oriented Entity Component System pattern | ✔️ | |
Support custom behaviours (as components) | ✔️ | |
Perform core allocations via an Object Pool to limit kernel calls | ✔️ | |
Perform thread spawns via a Thread Pool to limit kernel calls | ✔️ | |
Handle events via an Event Queue (keyboard, mouse) | ✔️ | |
Serialize and deserialize scenes | ✔️ | |
Asset pipeline | 📅 | |
User interface | ||
Basic game engine UI and scene visualization/edition | 🚧 | |
Computer graphics | ||
Perspective projection camera with free movements | ✔️ | |
Render textures | ✔️ | |
Render 3D meshes | ✔️ | |
Load and render 3D models | ✔️ | |
Render fonts | 📅 | |
Basic lighting (directional, specular, ambient) | ✔️ | |
Basic shadows | 📅 | |
Game physics | ||
Gravity and movement forces | ✔️ | |
Hitboxes and debug wireframe visualization | ✔️ | |
Collision detection | ✔️ | |
Collision response | 🚧 |
To build the project, follow the steps below:
# Make sure you have the necessary system packages installed
# ⚠️ The following system packages installation commands may change depending on
# your OS. Below example is for Ubuntu 20.04
sudo apt-get update -qq
sudo apt-get install -y cmake clang ninja-build
sudo apt-get install -y --no-install-recommends libx11-dev libxcursor-dev libxrandr-dev libxinerama-dev libxi-dev libxext-dev libxfixes-dev libgl1-mesa-dev
# clone the repository
git clone git@github.com:adrienlucbert/redoom.git
cd redoom
# clone git submodules
git submodule update --init --recursive
# apply patches (some submodules need patches to work with the project's build system
git apply .patches/system_includes.diff
# create the build directory and generate the build system
mkdir build
cd build
cmake .. -GNinja -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++
# build the project
ninja
Once the project is built, binaries are located in the following directories:
.
└── build/
└── bin/
├── benchmarks/ # various benchmarks done to improve game engine's performance
├── tests/ # game enine tests
├── examples/ # game examples using the game engine
└── redoom # game engine binary