WickedEngine is a free, open source gaming project written in C++ and released under MIT. It has 7,259 GitHub stars, 779 forks and 118 open issues, and was last pushed 12 hours ago. On this registry it ranks #24 of 38 tracked projects in Gaming, with 5 head-to-head comparisons available.

What is WickedEngine?

Wicked Engine is an open-source 3D engine with modern graphics, written in C++, for developers who want a C++ graphics framework, a standalone 3D editor, Lua scripting, or a codebase to learn from.

What it is

Wicked Engine is a full 3D game engine and rendering framework written in C++ under the MIT licence, distributed with a standalone 3D editor application alongside the static library. The project ships as a Visual Studio solution, CMake build files, and Xcode projects, and it exposes both a C++ API — entered by including "WickedEngine.h" and driving wi::Application — and a Lua scripting layer documented separately.

The engine solves the problem of building a modern renderer and game framework from scratch by bundling the pieces a graphics project normally has to assemble: rendering with DirectX 12, Metal, and PBR, global illumination, audio, input, an entity-component-system architecture, and Jolt physics. Asset pipelines cover FBX and glTF, so a developer can start from existing content rather than writing importers. It replaces the need to hand-roll a rendering backend, scene system, and editor tooling for each project, and it also serves as a standalone editor for authoring 3D content directly.

Key capabilities

  • Modern rendering with DirectX 12 and Metal backends, PBR materials, and global illumination.
  • An entity-component-system architecture for structuring game objects and their behaviour.
  • Jolt physics integration for simulation.
  • Asset import supporting both FBX and glTF formats.
  • Lua scripting alongside the C++ API, with a dedicated scripting reference at Content/Documentation/ScriptingAPI-Documentation.md.
  • Audio and input subsystems provided as part of the engine rather than third-party additions.
  • A standalone 3D editor with a manual at Content/Documentation/WickedEditor-Manual.pdf, plus C++ documentation at Content/Documentation/WickedEngine-Documentation.md.

Who uses it and how

  • Developers building C++ applications against the WickedEngine_Windows static library, with library directories pointed at $(SolutionDir)BUILD\$(Platform)\$(Configuration) and templates available as Samples/Template_Windows and Samples/Template_MacOS.
  • Teams authoring content in the standalone editor rather than writing engine code, using the PDF editor manual.
  • Scripters working entirely through the Lua layer without recompiling engine code.
  • Learners studying the source, with sample projects such as Samples/Tests and a minimal Template_iOS project as reference.
  • Projects targeting Windows, Linux, Mac OS, iOS, Xbox Series X|S, or PlayStation 5 from one codebase.

Getting started

Clone https://github.com/turanszkij/WickedEngine.git (or download the zip), then on Windows open WickedEngine.sln in Visual Studio and press F5; on Linux, install libsdl2-dev and build-essential and run cmake .. -DCMAKE_BUILD_TYPE=Release && make. Nightly packaged builds of the Editor are available from GitHub Actions, which requires a GitHub sign-in.

How it compares

This registry's facts name no other engines or tools to set it against, so Wicked Engine stands alone here; its closest points of reference are the licence and platform facts themselves — it is MIT-licensed and builds for Windows, Linux, Mac OS, iOS, Xbox Series X|S, and PlayStation 5.

When to use it — and when not

It suits developers who are comfortable operating a native build toolchain — Visual Studio, CMake with g++ and SDL2, or Xcode — since it is a library and editor rather than a hosted service, and it needs no database, storage, or SMTP infrastructure. Note that console-specific extension files required for building on Xbox Series X|S and PlayStation 5 are currently private, so console targets are not buildable from the public repository alone, and the 118 open issues suggest active rough edges; developers wanting a packaged, point-and-click toolchain or a hosted option should look elsewhere.

project readme (upstream, from github) — read inline

Wicked Engine

Github Build Status Discord chat follow on Twitter
Steam Itch.io


Wicked Engine is an open-source 3D engine with modern graphics. Use this as a C++ framework for your graphics projects, a standalone 3D editor, LUA scripting or just for learning.

You can get the full source code by using Git version control and cloning https://github.com/turanszkij/WickedEngine.git, or downloading it as zip. You can also download nightly packaged builds of the Editor here (requires Github sign in): Github Build Status


Platforms:

  • Windows
  • Linux
  • Mac OS
  • iOS
  • Xbox Series X|S
  • PlayStation 5

How to build:

Windows

To build Wicked Engine for Windows, open the WickedEngine.sln solution file with the latest Visual Studio. When it's opened, press F5, then Wicked Engine and the Editor application will be built and then start. You can check out other sample projects in the solution too.

If you want to develop a C++ application that uses Wicked Engine, you can build the WickedEngine_Windows static library project and link against it. Including the "WickedEngine.h" header will attempt to link the binaries for the appropriate platform, but search directories should be set up beforehand. For example, you can set additional library directories to $(SolutionDir)BUILD\$(Platform)\$(Configuration) by default. For examples, see the Samples/Template_Windows, Samples/Tests, and Editor_Windows projects.

You can also use cmake to build on windows with these commands:

cmake -B build
cmake --build build --config Release
Linux

To build the engine for Linux, use Cmake. You can find a sample build script for Ubuntu here (in the linux section).

On Linux you will need to ensure some additional dependencies are installed, such as Cmake (3.7 or newer), g++ compiler (C++ 17 compliant version) and SDL2. You can use the following commands to install dependencies:

sudo apt update
sudo apt install libsdl2-dev
sudo apt install build-essential

Example commands to build the engine with cmake in Release mode:

mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make
Mac OS and iOS

To build the engine for Mac OS and iOS, use the provided .xcodeproj files with the Xcode development environment, for example:

  • WickedEngine/WickedEngine.xcodeproj to build static library
  • Editor/Editor.xcodeproj to build the Wicked Editor
  • Samples/Template_MacOS/Template_MacOS.xcodeproj to build a minimal template application for MacOS that you can use as a base for your application
  • Samples/Template_iOS/Template_iOS.xcodeproj to build a minimal template application for iOS that you can use as a base for your application
Xbox Series X|S and PlayStation 5

Console specific extension files required for building are currently private.

Examples:

Initialization (C++):
// Include engine headers:
#include "WickedEngine.h"

// Create the Wicked Engine application:
wi::Application application;

// Assign window that you will render to:
application.SetWindow(hWnd);

// Run the application:
while(true) {
   application.Run(); 
}
Basics (C++):
application.Initialize(); // application will start initializing at this point (asynchronously). If you start calling engine functionality immediately before application.Run() gets called, then you must first initialize the application yourself.

wi::RenderPath3D myGame; // Declare a game screen component, aka "RenderPath" (you could also override its Update(), Render() etc. functions). 
application.ActivatePath(&myGame); // Register your game to the application. It will call Start() once, then Update(), Render(), etc. from now on every frame...

wi::scene::LoadModel("myModel.wiscene"); // Simply load a model into the current global scene
wi::scene::GetScene(); // Get the current global scene

wi::scene::Scene scene2; // create a separate scene
wi::scene::LoadModel(scene2, "myModel2.wiscene"); // Load model into a separate scene
wi::scene::GetScene().Merge(scene2); // Combine separate scene with global scene

myGame.setFXAAEnabled(true); // You can enable post process effects this way...

wi::RenderPath2D myMenuScreen; // This is an other render path, but now a simple 2D one. It can only render 2D graphics by default (like a menu for example)
application.ActivatePath(&myMenuScreen, 0.8f); // activate the menu after a 0.8 second fade out, the previous path (myGame) will be stopped

wi::Sprite mySprite("image.png"); // There are many utilities, such as a "sprite" helper class
myMenuScreen.AddSprite(&mySprite); // The 2D render path is ready to handle sprite and font rendering for you

wi::audio::Sound mySound;
wi::audio::CreateSound("explosion.wav", &mySound); // Loads a sound file
wi::audio::SoundInstance mySoundInstance;
wi::audio::CreateSoundInstance(&mySound, &mySoundInstance); // Instances the sound file, it can be played now
wi::audio::Play(&mySoundInstance); // Play the sound instance
wi::audio::SetVolume(0.6, &mySoundInstance); // Set the volume of this soundinstance
wi::audio::SetVolume(0.2); // Set the master volume

if (wi::input::Press(wi::input::KEYBOARD_BUTTON_SPACE)) { wi::audio::Stop(&mySoundInstance); } // You can check if a button is pressed or not (this only triggers once)
if (wi::input::Down(wi::input::KEYBOARD_BUTTON_SPACE)) { wi::audio::Play(&mySoundInstance); } // You can check if a button is pushed down or not (this triggers repeatedly)
Scripting (LUA):
-- Set a rendering path for the application
path = RenderPath3D;
application.SetActivePath(path);    -- "application" is created automatically by wi::Application

-- Load a model entity into the global scene:
entity = LoadModel("myModel.wiscene");

-- Load a model entity into a separate scene:
scene2 = Scene()
entity2 = LoadModel(scene2, "myModel2.wiscene");

-- Combine the separate scene with the global scene:
scene.Merge(scene2);

-- Get the current global scene:
scene = GetScene();

-- Move model to the right using the entity-component system:
transform = scene.Component_GetTransform(entity);
transform.Translate(Vector(2, 0, 0));

-- Print any WickedEngine class information to the backlog:
getprops(application);	-- prints the application methods
getprops(scene);	-- prints the Scene class methods
getprops(path);	-- prints the deferred render path methods

-- Play a sound:
sound = Sound()
audio.CreateSound("explosion.wav", sound)
soundinstance = SoundInstance()
audio.CreateSoundInstance(sound, soundinstance)  -- several instances can be created from one file
audio.Play(soundinstance)
audio.SetVolume(0.6, soundinstance)  -- sets the volume of this soundinstance
audio.SetVolume(0.2)  -- sets the master volume

-- Check for input:
if(input.Press(KEYBOARD_BUTTON_LEFT)) then
   audio.Play(soundinstance); -- this will play the sound if you press the left arrow on the keyboard
end

(You can enter lua scripts into the backlog (HOME button), or the startup.lua script which is always executed on application startup if it is found near the app, or load a script via dofile("script.lua") command)

For more code samples and advanced use cases, please see the example projects, like the Template_Windows, Tests, or Editor project. There are also sample models and scripts included with Wicked Engine in the Content/models and Content/scripts folders. Check them out to learn about more features.

Scripting API:

You can use a lot of of engine features through Lua scripting. The included applications, like the Editor, contain a scripting input method toggled by the "Home" key. A text screen will be presented where the user can type in LUA commands. For further details, check the scripting API documentation: Wicked Engine Scripting API

Model import/export:

The native model format is the WISCENE format. Any application using Wicked Engine can open this format efficiently.

In addition, the Editor supports importing some common model formats:

  • OBJ
  • FBX
  • GLTF, GLB
  • VRM, VRMA
  • PLY

You can import models into the Editor, and save them as WISCENE, then any Wicked Engine application can open them.

Graphics API:

The default renderer is DirectX 12 on Windows, Vulkan on Linux and Metal on Apple systems. You can specify command line arguments (without any prefix) to switch between render devices or other settings. Currently the list of options:

Argument Description
vulkan Use the Vulkan rendering device on Windows
debugdevice Use debug layer for graphics API validation. Performance will be degraded, but graphics warnings and errors will be written to the "Output" window
gpuvalidation Use GPU Based Validation for graphics. This must be used together with the debugdevice argument. Currently DX12 only.
gpu_verbose Enable verbose GPU validation mode.
igpu Prefer integrated GPU selection for graphics. By default, dedicated GPU selection will be preferred.
amdgpu Prefer AMD GPU selection for graphics.
nvidiagpu Prefer Nvidia GPU selection for graphics.
intelgpu Prefer Intel GPU selection for graphics.
alwaysactive The application will not be paused when the window is in the background.

Other software using Wicked Engine

  • Wicked Shooter: FPS sample game in Wicked Engine
  • Wicked Adventure: Adventure RPG sample game in Wicked Engine
  • Grass Zen: A relaxing game made with Wicked Engine where you control the wind
  • Game Guru MAX: Easy to use game creator
  • Flytrap: Demoscene production by qop
  • doddering: Demoscene production by qop
  • Your project: add your project to this readme and open a pull request

Troubleshooting

If you are having trouble getting the applications to run, make sure that you satisfy the following conditions:

  • If you built the application with Visual Studio, run it from the Visual Studio environment, where the executable working directory is set up to be the Project directory (not the build directory where the exe will be found)
  • If you want to run an application without Visual Studio, either copy the executable from the BUILD directory to the correct project directory, or set the working directory appropriately. You can also check the Working directory setting in Visual Studio to find out the right working directory of every project.
  • If you experience crashes, you can try these to find out the problem:
    • make sure your environment is up to date, with latest graphics drivers and operating system updates.
    • see if there is a log.txt in the working directory of the application (most likely near the application exe)
    • request help on Discord or via a Github issue
    • build the engine in Debug mode and try to run it, see where it crashes
    • run the engine with the debugdevice command argument and post the text from your console output window when the crash happens
      • for very advanced users, using gpuvalidation with debugdevice will print additional graphics debug information

Frequently asked questions

Is WickedEngine free to use?

WickedEngine is open source under the MIT licence. There is no licence fee and no seat count — you can self-host it or, where the project offers one, pay a vendor for a managed version instead.

What does WickedEngine do?

3D engine with modern graphics

What is WickedEngine written in?

WickedEngine is primarily written in C++. Its source is publicly available at https://github.com/turanszkij/WickedEngine, and it has 7,259 GitHub stars.