Game Engine

2D and 3D

The engine supports the ability to render 2D sprites and 3D meshes. Along with 2D sprites comes the ability to print UI graphics and dynamic/static text.

Programmatic Primitives

Included with the system are a handful of primitives that can be used. Each primitive is created programmatically based on the request number of vSlices and hSlices (if applicable). These primitives can be used for quick development testing without the need for a more complex mesh.

Multiple Camera Support

The ability to switch between different active cameras is supported. Along with multi-cam support are two different types of cameras: Perspective and Orthogonal. The OrthogonalCamera when used with a 3D object can give the scene a nice top-down effect. The PerspectiveCamera supports different field of view and the ability to change them at runtime. This allows for different stylistic effects, ranging from the traditional FOV (50 degrees) to the infamous DOOM FOV (90 degrees).

Multiple Shaders

The game engine includes multiple types of shaders, already built-in. Each shader can easily be toggled between filled and wireframes modes. The included shaders that support lighting use Phong-based shading for a balance between speed and realism.

Compute Shaders

The engine supports the ability to load and use compute shaders. The compute shader interface is wrapped into a easier to use interface for both dispatching and reading/writing buffers.

Camera Frustum Culling

While the GPU has its own early abort within the rendering pipeline, we can optimize this even further before requesting the draw of the mesh. Support for camera culling is available if toggled on. Using a frustum collision check with the mesh's bounding sphere, we can decide if the mesh would be visible in the frame. If the bounding sphere is visible in the frame, we must request the draw. If the sphere isn't within the frustum, we don't try to draw the model. Note: For this feature to work, all transformations must be uniform scaling.

Scene Support

The engine supports the ability to create and switch between different scenes. Scenes can contain their own object managers and resources, allowing for more optimized and separated game logic. Resource managers, such as TextureMan and ModelMan, are shared between all scenes in order to reduce redundancy and lower memory footprint.