🌎 Read this in: English | Español | Français | 简体中文
Table of content
Code of Conduct
Overview
Getting Started
┕ Prerequisites & Dependencies
┕ Setting up the Development Environment
Building the Engine
┕ Windows
┕ Linux
┕ MacOS
┕ Troubleshooting
How to Contribute
┕ Reporting Bugs
┕ Suggesting Enhancements
┕ Tackling Good First Issues
Engine Architecture & Structure
┕ Core Modules
┕ Rendering Pipeline
┕ Directory Structure
Development Workflow
┕ Branching Strategy
┕ Commit Message Guidelines
┕ Pull Request Process
┕ Code Review
Coding Standards
┕ Style Guide
┕ Naming Conventions
┕ Performance & Memory Guidelines
Testing
┕ Writing Unit Tests
┕ Running the Test Suite
Documentation
┕ Inline Code Documentation
┕ Writing Tutorials & Examples
Community & Getting Help
We are committed to fostering a welcoming, respectful, and harassment-free environment for everyone, regardless of experience level, background, or identity.
To ensure that the Graphical Playground community remains a safe space to learn, collaborate, and build, we expect all maintainers, contributors, and community members to adhere to our community standards.
Before participating in the gp-engine project, whether by opening an issue, submitting a pull
request, or joining our community channels, please read our full
Code of Conduct. By participating in this project, you agree to abide by its
terms.
Welcome to the gp-engine (Graphical Playground) contributor's guide!
First and foremost, thank you for your interest in contributing. Open-source projects thrive on the diverse skills, perspectives, and time of their communities. Whether you are a rendering expert, a technical writer, or a student looking for your first open-source contribution, we are thrilled to have you here.
gp-engine is built strictly using C++23 and utilizes a custom CMake-based toolchain, the
Graphical Playground Build Tool (GPBT). To ensure a consistent and highly optimized build
environment, we heavily enforce the use of LLVM/Clang.
Before you begin, ensure your system has the following core tools installed:
- CMake: v3.28 or newer.
- Compiler Toolchain (LLVM/Clang v22+ Recommended):
- Linux/macOS: You are strictly obligated to use
clangandclang++. You must also link against LLVM'slibc++andlibc++abi.lldis the default linker for Linux. - Windows: You must use
clang-clvia the MSVC x64 Native Tools Command Prompt.
- Linux/macOS: You are strictly obligated to use
- Build Generator:
ninjais strictly required. - Caching (Optional but recommended):
ccache(Automatically utilized by our CMake presets). - Code Quality Tools:
clang-format,clang-tidy, andclangd(v22+). - Documentation (Optional):
doxygenandgraphviz.
Note on Engine Dependencies: Third-party libraries (e.g., SDL3, Vulkan headers, TBB, Tracy) are automatically fetched and built (or downloaded as binaries) via the GPBT. You only need to install the system-level libraries required to compile them.
If you are on Linux, we provide helper scripts to install all necessary packages, headers, and build tools for Wayland, Pipewire, X11, Vulkan, Tracy, and LLVM.
Run the script matching your distribution from the project root:
# For Ubuntu/Debian (22.04+)
./toolchain/dependencies/ubuntu-debian.sh
# For Fedora (34+)
./toolchain/dependencies/fedora.shWe highly recommend using Visual Studio Code. The repository includes a .vscode directory
populated with recommended extensions and code snippets.
- Crucial: We strongly advise using the clangd extension for code completion and navigation instead of the default Microsoft C/C++ IntelliSense engine.
If you prefer an isolated, pre-configured environment, the repository includes an Ubuntu 24-based Devcontainer. Opening the project in VS Code with the DevContainers extension will automatically build a ready-to-use C++23/Clang 22 environment.
The build process is orchestrated by our custom gp-build-tool, which is integrated as a Git
submodule (GraphicalPlayground/gp-build-tool).
When you clone the repository, you should initialize submodules:
git clone --recursive https://github.com/GraphicalPlayground/gp-engine.git
cd gp-engineSubmodule Management: Our
CMakeLists.txtis designed to automatically ensure thegp-build-toolsubmodule is initialized and up to date upon configuration. If you are developing the build tool locally or working offline, you can bypass this forced update by passing-DGP_SKIP_SUBMODULE_UPDATE=ONto CMake.
We utilize CMake Presets to standardize the build process across operating systems. Configuration
flags, compile commands, and build directories (build/) are automatically handled.
To see available presets for Windows, run:
cmake --list-presetsExample output:
Available configure presets:
"windows-release"
"windows-debug"
"windows-profile"
"windows-development"
"windows-asan"
For detailed information on what each configuration entails, please refer to the Build Type documentation.
- Open the x64 Native Tools Command Prompt for VS (required to ensure the correct architecture and tools are in your PATH).
- Run the CMake commands using the Windows presets:
# Configure the project
cmake --preset windows-development
# Build the project
cmake --build --preset windows-developmentWhile CMake generates its intermediate files in the build/ directory, the final compiled
executables and shared libraries are automatically routed to the binaries/ directory at the
project root:
- Executables:
binaries/bin/ - Libraries:
binaries/lib/
For advanced compiler flags, custom GPBT arguments, and deeper configuration options, please consult the GP Build Tool Configuration Guide.
When you clone the repository, you should initialize submodules:
git clone --recursive https://github.com/GraphicalPlayground/gp-engine.git
cd gp-engineSubmodule Management: Our
CMakeLists.txtis designed to automatically ensure thegp-build-toolsubmodule is initialized and up to date upon configuration. If you are developing the build tool locally or working offline, you can bypass this forced update by passing-DGP_SKIP_SUBMODULE_UPDATE=ONto CMake.
We utilize CMake Presets to standardize the build process across operating systems. Configuration
flags, compile commands, and build directories (build/) are automatically handled.
To see available presets for Linux, run:
cmake --list-presetsExample output:
Available configure presets:
"linux-release"
"linux-debug"
"linux-profile"
"linux-development"
"linux-asan"
"linux-ubsan"
"linux-tsan"
"linux-msan"
For detailed information on what each configuration entails, please refer to the Build Type documentation.
Ensure you are in the project root. Configure and build using your desired preset (e.g.,
linux-development):
# Configure the project
cmake --preset linux-development
# Build the project utilizing all available CPU cores
cmake --build --preset linux-development -j$(nproc)While CMake generates its intermediate files in the build/ directory, the final compiled
executables and shared libraries are automatically routed to the binaries/ directory at the
project root:
- Executables:
binaries/bin/ - Libraries:
binaries/lib/
For advanced compiler flags, custom GPBT arguments, and deeper configuration options, please consult the GP Build Tool Configuration Guide.
When you clone the repository, you should initialize submodules:
git clone --recursive https://github.com/GraphicalPlayground/gp-engine.git
cd gp-engineSubmodule Management: Our
CMakeLists.txtis designed to automatically ensure thegp-build-toolsubmodule is initialized and up to date upon configuration. If you are developing the build tool locally or working offline, you can bypass this forced update by passing-DGP_SKIP_SUBMODULE_UPDATE=ONto CMake.
We utilize CMake Presets to standardize the build process across operating systems. Configuration
flags, compile commands, and build directories (build/) are automatically handled.
To see available presets for MacOS, run:
cmake --list-presetsExample output:
Available configure presets:
"macos-release"
"macos-debug"
"macos-profile"
"macos-development"
"macos-asan"
"macos-ubsan"
"macos-tsan"
For detailed information on what each configuration entails, please refer to the Build Type documentation.
Ensure you are in the project root. Configure and build using your desired preset (e.g.,
macos-development):
# Configure the project
cmake --preset macos-development
# Build the project utilizing all available CPU cores
cmake --build --preset macos-development -j$(nproc)While CMake generates its intermediate files in the build/ directory, the final compiled
executables and shared libraries are automatically routed to the binaries/ directory at the
project root:
- Executables:
binaries/bin/ - Libraries:
binaries/lib/
For advanced compiler flags, custom GPBT arguments, and deeper configuration options, please consult the GP Build Tool Configuration Guide.
Even with automated scripts and presets, environment quirks can happen. Here are the most common issues contributors encounter and how to fix them.
- The Issue: CMake cannot find the build tool required to configure the project because the Git submodule was not initialized.
- The Fix: Run the following command in the project root to fetch the build tool:
git submodule update --init --recursive- The Issue: The default Microsoft C/C++ extension is trying (and failing) to parse C++23
features, conflicting with our required
clangdsetup. - The Fix:
- Ensure the
clangdextension is installed. - Disable the default IntelliSense engine. Open your VS Code settings (JSON) and add:
"C_Cpp.intelliSenseEngine": "disabled". - Open the command palette (
Ctrl+Shift+P/Cmd+Shift+P) and run"clangd: Restart language server".
- Ensure the
- The Issue: The build system is accidentally picking up
GCCorlibstdc++instead of our mandated LLVM toolchain. gp-engine strictly requireslibc++andlibc++abi. - The Fix: Ensure you are using the official CMake presets (e.g.,
--preset linux-development). If you are running CMake manually, ensure your environment variables aren't forcingGCC. You can verify your compiler version by runningclang++ --version(must be v22+).
- The Issue: You are running the build commands in a standard PowerShell or Command Prompt
window, which doesn't know where
clang-clis located. - The Fix: You must run all CMake and Ninja commands from the x64 Native Tools Command Prompt for VS. You can search for this in your Windows Start menu.
- The Issue: The GPBT automatically fetches the libraries (like SDL3), but your operating system is missing the required underlying display server or graphics API development headers.
- The Fix: Re-run the dependency script for your distribution located in
toolchain/dependencies/. If the script completes but you still see errors, check that your package manager successfully refreshed its cache (sudo apt-get updateorsudo dnf makecache).
Still stuck? If you've run into an issue not listed here, please drop into our
community channels or open an issue on GitHub with the build-system
label. Include your OS, Clang version, and the full CMake output log.
wip...
wip...
wip...
wip...
wip...
wip...
wip...
wip...
wip...
wip...
wip...
wip...
wip...
wip...
wip...
wip...
wip...
wip...
wip...
wip...
wip...
wip...
wip...
Getting stuck is a normal part of working on a complex C++ engine! Whether you need help configuring
the GP Build Tool, want feedback on a new shader you're writing, or just want to show off a project
you built with gp-engine, we are here to support you.
Where to Connect:
- Discord: Join our Discord Server for real-time chat with the maintainers and other developers. This is the best place for quick questions and informal technical discussions.
- GitHub Discussions: For longer-form questions, architectural proposals, or sharing your showcases, head over to GitHub Discussions.
- Social Media: Follow our updates and community highlights on LinkedIn.
Reporting Security Vulnerabilities:
If you discover a security vulnerability within gp-engine, please do not report it by opening a
public GitHub issue. We take security seriously. Instead, refer to our Security Policy
and email us directly at security@graphical-playground.com so we can address it safely.
General Inquiries:
For non-technical support, business inquiries, or general questions, you can reach the core team via email:
Supporting the Project:
Maintaining a modern C++ graphics engine and creating high-quality educational resources takes a
massive amount of time and effort. If you find gp-engine valuable for your learning, research, or
development journey, please consider supporting the project!
You can sponsor the Graphical Playground project through the following links:
Thank you for being a part of the Graphical Playground. We can't wait to see what you build!
© 2026 Graphical Playground. Built for the next generation of graphics engineers.