A C++ Game Engine for Linux and Windows
Clone or download the repo. To clone the repo, use: git clone --recurse-submodules https://github.com/VGED-ORGANIZATION/VGED-ENGINE
Under Linux, build using "./build.sh" (debug) or "./build.sh -v release" (release, verbose)
Dependencies are described further down.
|-application
|-engine
|-editor
|-resources
|-scripts
|-vendor
Main project domains: render engine, game engine, scene/game editor, application
Users add their games as an external Git submodule under ~/application
An example application is provided under ~/application/Scabb
All assets go into seperate Git submodules, e.g. ~/application/Scabb/assets
PascalCase for structs and classes. snakecase for variables, functions, and file names
vk stuff will have vk prefix, language: American English, indention: four spaces
Everything goes into namespaces
Header files are included with path+filename; some predefined paths are provided:
~/engine
~/engine/platform/Vulkan
~/vendor
Try to avoid heap allocating per frame, rather stack allocate memory or preallocate memory in pools
Use references to pass arguments as much as possible
Use smart pointers to own data and pass references of those or raw pointers around to share this data when possible
Keep files short and sweet (one class per file if possible)
Member fields of classes and structs start with m_ and continue with PascalCase
The formatting of opening and closing parentheses, brackets, and braces () [] {} is as follows
void Layer::setTag(const std::string& tag) { m_Tag = tag; }
using u8 = std::uint8_t;
using u16 = std::uint16_t;
using u32 = std::uint32_t;
using u64 = std::uint64_t;
using usize = std::size_t;
using i8 = std::int8_t;
using i16 = std::int16_t;
using i32 = std::int32_t;
using i64 = std::int64_t;
using isize = std::ptrdiff_t;
using f32 = float;
using f64 = double;
One default render sequence with a lighting renderpass (geometry, lighting, transparency subpasses) and GUI renderpass (2D subpass)
Abstraction for custom render sequences
Abstraction layer for different APIs via pure virtual functions
PBR lighting
Material system
Support for custom shaders
Anti-aliasing
Shadow Mapping, Ambient Occlusion (AO), and Global Illumination (GI)
Skybox
Bloom
Reflections
GPU ray tracing support is detected: If a feature is implemented with ray tracing, the same feature should be provided for the raster pipeline
A debug GUI based on ImGUI is provided for developers
God rays, haze, dust, mist, vapor, steam, smoke, and fog
Particle system
Entity-Component-System (ECS)
Scene and prefab loading/unloading
Supported file types for 3D models: glTF, Obj Wavefront, FBX
Built-in movement (physics)
Menu/in-game GUI
Texture atlas support and texture atlas generator, spritesheet abstraction/animation
Game controller support
Sound support
Profiling/Instrumentation
Resource system for crucial assets (app icon, minimal shader to display warning messages, gamecontroller DB)
Settings manager
Event system
Layer stack
Debug logger (spdlog)
Native C++ scripting and/or C# and/or Python
Hot-reloading
Install the Vulkan SDK, for example on Ubuntu with:
wget -qO - http://packages.lunarg.com/lunarg-signing-key-pub.asc | sudo apt-key add - && sudo wget -qO /etc/apt/sources.list.d/lunarg-vulkan-focal.list http://packages.lunarg.com/vulkan/lunarg-vulkan-focal.list &&
sudo apt update && sudo apt install vulkan-sdk
Install dependencies, for example on Ubuntu with:
sudo apt install git build-essential xorg-dev libxrandr-dev libvulkan-dev gcc-10
The project is using C++20, be sure your compiler supports it. For gcc, version 10 or higher is recommended.