Fusion Frame engine is a framework type game engine that focuses on delivering a compact and easy-to-use interface for 3d game development while preserving speed. It also supports different physics algorithms to speed up the game development.
- Deferred rendering(soon to be clustered deferred as well as forward+ as an option)
- Omnidirectional shadows for point lights
- Linear shadows for directional lights
- PBR-IBL shading
- HDRI and cubemap support
- Deferred and forward mesh instancing
- Compute shader based particle emitter
- Skeletal animation support
- Deferred ScreenSpace decals
Also planning to implement a voxel based GI soon.
- Oct/Quad tree for general object class
- Half-edge mesh structure
- Easy collision mesh creation from meshes and bounding boxes
- AABB and SAT collisions
Also using half-edge data structure , wrote couple of premature mesh algorithms like subdivision for triangular meshes. Mesh utility algorithms like quickhull to create collision boxes are also in the TO-DO list
Currently has a ray/path tracer with reflections , indirect lighting and shadows. Ray tracing is done on a compute shader using a hybrid BVH(top and bottom) for acceleration.
Here is a quick demo scene with basic pbr shading and visualization of the BVH structure.
The overall API is pretty simple and user friendly. I'll try to demonstrate some of the functionality to get you started
- Initializing the window and the resources
const int width = 1000;
const int height = 1000;
FUSIONCORE::Window ApplicationWindow;
ApplicationWindow.InitializeWindow(width, height, 4, 6, false, "FusionFrame Engine");
FUSIONUTIL::InitializeEngineBuffers();
FUSIONUTIL::DefaultShaders Shaders;
FUSIONUTIL::InitializeDefaultShaders(Shaders);
- Importing a HDRI
FUSIONCORE::CubeMap cubemap(*Shaders.CubeMapShader);
FUSIONCORE::ImportCubeMap("Resources/rustig_koppie_puresky_2k.hdr", 1024, cubemap, Shaders);
- Engine supports both deferred and forward rendering so you can use a gbuffer to use deferred rendering.
const FUSIONUTIL::VideoMode mode = FUSIONUTIL::GetVideoMode(FUSIONUTIL::GetPrimaryMonitor());
FUSIONCORE::Gbuffer Gbuffer(mode.width, mode.height);
FUSIONCORE::FrameBuffer ScreenFrameBuffer(mode.width, mode.height);