Acid is a high speed, cross-platform, game engine written in C++17. Features are broken down into modules, modules can be added or removed from Acid with ease.
Vulkan is used as the only rendering API, as a result Vulkan can be used directly in games, but should be avoided. Metal is supported through MoltenVK, eventually OpenGL and DirectX will be supported in a similar way.
Acid is licensed under MIT and is open to contributions, use the 'Compiling' section in the README.md to get started with Acid.
Readme Read more
Documentation Autogen docs
Metrics Code metrics
Website Learn more
Trello Board
This is a list of current features in Acid:
- On the fly GLSL to SPIR-V compiler
- Modular rendering and compute pipeline
- Deferred PBR rendering
- Bullet physics
- Frustum and Occlusion culling
- Resource management
- Event and tasks systems
- Resource path searches, and packaging
- GUI and font rendering
- Particle effect systems
- Audio and music
- Skyboxes and fog
- Shadow mapping
- GameObjects and component system
- Post effects (Lensflare, Glow, Blur, SSAO, ...)
- Model file loading (OBJ)
- Animations loading (COLLADA)
- Image file loading (JPG, PNG, TGA, BMP, PSD, GIF, HDR, PIC)
- GameObject prefab loading/saving (JSON, XML)
- Visual drivers and maths classes
- Flexible input classes
- C# generated files
- Networking (WIP)
- Steam integration (WIP)
Acid uses the following libraries:
- Vulkan - Vulkan interface
- Glslang - Shader compiling
- GLFW - Window creation
- OpenAL - Audio interface
- Bullet3 - Physics integration
- STB - Texture and OGG loading
- FastNoise - Noise generation library
// Imports a 2D texture.
auto guiBlack = Texture::Resource("Guis/Black.png");
// Imports a 3D cubemap.
auto skyboxSnowy = Cubemap::Resource("Objects/SkyboxSnowy", ".png");
// Imports a model.
auto dragon = ModelObj::Resource("Objects/Testing/ModelDragon.obj");
// Plays a 3D sound (sound buffer internally managed), at the origin, at half volume.
auto jump = Sound("Sounds/Jump.ogg", 0.5f);
jump.SetPosition(Vector3::ZERO);
jump.Play();
// Imports a game object.
auto playerObject = new GameObject("Objects/Player/Player.json", Transform());
// Creates a game object.
auto sphere = new GameObject(Transform(Vector3(6.7f, 6.7f, -8.0f), Vector3::ZERO, 3.0f));
sphere->AddComponent<Mesh>(ShapeSphere::Resource(30, 30, 1.0f));
sphere->AddComponent<ShapeSphere>(2.0f);
sphere->AddComponent<Rigidbody>(2.0f);
sphere->AddComponent<MaterialDefault>(Colour::WHITE, Texture::Resource("Objects/Testing/Albedo.png"),
0.0f, 0.0f, Texture::Resource("Objects/Testing/Material.png"), Texture::Resource("Objects/Testing/Normal.png"));
sphere->AddComponent<MeshRender>();
// Vector maths.
Vector2 a(3.0f, -7.2f);
Vector2 b(-1.74f, 15.4f);
Vector2 c = a * b;
float dist = a.Distance(b);
Once Acid is cloned run git submodule update --init --recursive
in the Acid directory to update the submodules. All platforms depend on CMake to generate IDE/make files.
Vulkan SDK and OpenAL SDK are required to develop and run Acid.
Ensure you are using a compiler with full C++17 support, on Windows it is recommend you use MSVC or MinGW w64.
If using Visual Studio it must be 2015 or later. Use the Visual Studio installer and select both "Desktop development with C++" and "Windows SDK" if they are not already installed. Then on Visual Studio Acid can be opened as a CMake workspace folder.
On Linux Acid requires xorg-dev
, libopenal1
, and libvulkan1
to be installed. Read about how to setup Vulkan on Linux so a Vulkan SDK is found.
Setup on MacOS is similar to the setup on Linux, a compiler that supports C++17 is required, such as XCode 10.0.
You can contribute to Acid in any way you want, we are always looking for help. You can learn about Acid's code style from the GUIDELINES.md.