ARISE is:
Advanced
Rendering
Interface &
Sandbox
Engine
A modern, cross-platform graphics engine built with C++20, designed following KISS, YAGNI, SoC, and SOLID principles. ARISE prioritizes simplicity and maintainability while delivering robust rendering capabilities across multiple graphics APIs.
- Cross-platform rendering with DX12 and Vulkan backends
- Modern rendering pipeline with multiple passes (base, debug, final)
- Various visualization modes (solid, wireframe, normal map visualization, vertex normal visualization, shader overdraw)
- Material and texture management
- GPU and CPU profiling support with Tracy integration
- Entity Component System (ECS) architecture
- Scene management system
- Service locator pattern
- Comprehensive ImGui-based editor (not just for debugging)
- Scene view and hierarchy panel showing the scene structure
- Performance monitoring with FPS display and graphs
- Object inspector for manipulating entity properties (translation, rotation, scale)
- Gizmo tools for visual transformation of objects
- Shader mode selection panel for switching between different visualization modes
- Input control legend for camera movement and speed adjustment
- File dialog support for loading assets
- Hot-reload system with file watcher (WIP - shader reload)
- Support for seamless switching between editor and game modes
- Comprehensive logging system with multiple backends (console, file, memory)
- Configuration system
- Offline asset conversion tools (gltfpack & toktx)
- PIX markers support for DirectX debugging
- glTF 2.0 support with KTX2/BasisU textures
- Mesh optimization at runtime (EXT_meshopt decoder)
- MikkTSpace tangent generation
- Image loading with multiple backends (DirectX Tex, STB)
- Resource management for models, meshes, textures, and materials
- Event system (window, keyboard, mouse, application events)
- Input management
- Memory management and allocation
- Time measurement and management
- Profiling infrastructure for performance analysis
I strongly recommend creating a separate build directory and building the project there. This approach makes it easy to clean up build-related files and folders, ensuring that they do not clutter the root directory.
- CMake 3.26 or higher
- C++20 compatible compiler
- For DirectX: Windows SDK
- For Vulkan: Vulkan SDK
-
Clone the repository
git clone git@github.com:vadymchan/game_engine.git cd game_engine -
Create a build directory (optional but recommended)
mkdir build cd build -
Configure the project using CMake
Basic configuration:
cmake ..
With specific options:
cmake -DUSE_DIRECTX=ON -DUSE_PROFILING=ON ..
USE_VULKAN(default: ON) - Enable Vulkan supportUSE_OPENGL(default: OFF) - Enable OpenGL support (deprecated)USE_DIRECTX(default: ${WIN32}) - Enable DirectX 12 supportFORCE_RHI_API(default: OFF) - Force specific RHI API at compile time
BUILD_SDL(default: ON) - SDL2 window managementBUILD_GLFW(default: OFF) - GLFW window managementBUILD_SPDLOG(default: ON) - Logging libraryBUILD_BULLET(default: OFF) - Physics engineBUILD_IMGUI(default: ON) - Dear ImGui UI libraryBUILD_STB(default: ON) - STB image loadingBUILD_MATH_LIBRARY(default: ON) - Custom math library with SIMDBUILD_ENTT(default: ON) - Entity Component System
USE_GLTF(default: ON) - Enable glTF/KTX supportBUILD_CGLTF(default: ON) - cgltf parserBUILD_LIBKTX(default: ON) - KTX2/BasisU loaderBUILD_MESHOPTIMIZER(default: ON) - Runtime mesh optimizationBUILD_MIKK_T_SPACE(default: ON) - Tangent space generation
USE_GLTF_SAMPLE_MODELS(default: OFF) - Download glTF sample models
USE_PROFILING(default: OFF) - Enable profiling supportBUILD_TRACY(default: ON if profiling enabled) - Tracy profilerUSE_CPU_PROFILING(default: ON if profiling enabled)USE_GPU_PROFILING(default: ON if profiling enabled)USE_TRACY_GPU_PROFILING(default: ON if GPU profiling enabled)
BUILD_ASSET_TOOLS(default: OFF) - Build offline asset conversion toolsBUILD_IMGUIZMO(default: ON) - ImGuizmo gizmo libraryBUILD_IMGUIFILEDIALOG(default: ON) - File dialog for ImGuiBUILD_WINPIX_EVENT(default: ON on Windows) - PIX3 markers for debugging
USE_DIRECTX_AGILITY(default: ON if DirectX) - DirectX 12 Agility SDKUSE_DIRECTX_TOOL_KIT(default: ON if DirectX) - DirectX Tool KitUSE_DIRECTX_SHADER_COMPILER(default: ON) - DXC shader compilerUSE_DIRECTX_TEX(default: ON) - DirectXTex library
If you prefer using CMake GUI:
- Open CMake GUI
- Set source directory to the repository root
- Set build directory (e.g.,
game_engine/build) - Click "Configure" and choose your generator
- Modify options as needed
- Click "Generate"
- Open
game_engine.slnin the build directory - Right-click
GameEngineproject → Set as Startup Project - Build:
Ctrl+Shift+Bor Build → Build Solution - Run:
F5or click Start button
cmake --build . --config ReleaseFor basic CPU and GPU profiling, simply enable the profiling options during CMake configuration (see build options above):
cmake -DUSE_PROFILING=ON ..However, if you need GPU profiling with Tracy, additional steps are required because Tracy's GPU profiling macros cannot be switched at runtime:
-
Force a specific RHI API (since GPU profiling is API-specific):
cmake -DFORCE_RHI_API=ON -DFORCED_RHI_API=Vulkan .. # or DirectX -
Enable Tracy GPU profiling:
cmake -DUSE_PROFILING=ON -DUSE_GPU_PROFILING=ON -DUSE_TRACY_GPU_PROFILING=ON ..
-
Complete example for Vulkan GPU profiling with Tracy:
cmake -DUSE_VULKAN=ON -DFORCE_RHI_API=ON -DFORCED_RHI_API=Vulkan -DUSE_PROFILING=ON -DUSE_GPU_PROFILING=ON -DUSE_TRACY_GPU_PROFILING=ON ..
Note: The forced RHI API is necessary for Tracy GPU profiling because the profiling macros are compile-time dependent and cannot be switched between different graphics APIs at runtime.
Edit config/debug/config.json in your build directory:
{
"renderingApi": "vulkan", // or "dx12"
"applicationMode": "editor" // or "standalone"
}To enable profiling, build with -DUSE_PROFILING=ON. The engine integrates with Tracy profiler for both CPU and GPU profiling. In Debug and RelWithDebInfo builds, profiling will be automatically enabled.
- SDL - Window management
- spdlog - Logging
- ImGui - UI framework
- EnTT - Entity Component System
- math_library - Custom SIMD-optimized math
- Vulkan Memory Allocator
- D3D12 Memory Allocator
- DirectX Shader Compiler (via vcpkg)
- DirectXTex (via vcpkg)
- stb - Image loading
- cgltf - glTF parsing
- libktx - KTX texture loading
- meshoptimizer - Mesh optimization
- MikkTSpace - Tangent generation
- ImGuizmo - 3D gizmos
- ImGuiFileDialog - File dialogs
- Tracy - Profiler
- RapidJSON - JSON parsing
- Watcher - File watching
- xxHash - Fast hashing
- EASTL - EA Standard Template Library
- vcpkg-cmake-integration - vcpkg integration
- cmake-modules - Windows SDK detection
The project follows a unified source structure where all source files (.cpp, .h, .inl) are located in the src/ directory. This simplifies the organization and makes navigation easier.
This project uses clang-format for consistent code formatting.
| Code Element | Naming Convention | Example |
|---|---|---|
| Classes | CamelCase | GameEngine |
| Structures | CamelCase | Vector2D |
| Unions | CamelCase | DataUnion |
| Functions/Methods | camelCase (global: g_ prefix) |
updatePosition(), g_initializeGame() |
| Public Member Variables | m_ prefix + camelCase |
m_position |
| Private Member Variables | m_ prefix + camelCase + _ postfix |
m_position_ |
| Protected Member Variables | m_ prefix + camelCase + _ postfix |
m_counter_ |
| Public Methods | camelCase | updatePosition() |
| Protected Methods | camelCase + _ postfix |
run_() |
| Private Methods | camelCase + _ postfix |
initialize_() |
| Enums | CamelCase | Color |
| Enum Constants | CamelCase | Difficulty::Easy |
| Namespaces | lowercase with underscores | game_logic |
| Interface Classes | I prefix + CamelCase |
ICollidable |
| Template Parameters | CamelCase | ContainerType |
| Macros | UPPER_CASE_WITH_UNDERSCORES | MAX_HEALTH |
| Typedefs/Type Aliases | CamelCase | BigInt |
| Static Constant Members | s_k prefix + CamelCase |
s_kMaxValue |
| Class Constant Members | s_k prefix + CamelCase |
s_kDefaultColor |
| Constants | k prefix + CamelCase |
kMaxPlayers |
| Static Variables | s_ prefix + camelCase |
s_instanceCount |
| Global Variables | g_ prefix + camelCase |
g_gameState |
| Global Constants | g_k prefix + CamelCase |
g_kInitialSpeed |
| Class Members | s_ prefix + camelCase |
s_memberVariable |
| Class Methods | s_ prefix + camelCase |
s_classMethod() |
| Template Value | camelCase | defaultValue |
| Type Template | CamelCase | TypeParam |








