Direct3D 11 Game Engine - Description
This project is still in progress
This project encompasses most of the work I have done in the past year and a half. It is a 3D game engine written in C++ with Direct3D11 (early versions used OpenGL and Ogre). The engine was rewritten halfway through the year. It supports compilation with the Win32 API, as well as WinRT API to x86, x64, and ARM.
This game engine is primarily designed for an open-world first-person shooter multiplayer game. Example: Procedural Terrain Generation FPS Project. It can be used for arbitrary game types. My Rogue-Lite Platformer game shows that the engine can easily be used for platformer games as well.
Since this project is still in development, this page will post updates when new features are completed or broken.
Because the scope of this project as a whole is large, this particular page will be finished later, and some of the separate components of the engine are posted on their own page. I will fill in this page with some of the parts I feel like writing about. To see videos and pretty pictures of the engine, see the Terrain Generation and Fractal mesh pages.
Other Engine Components and Projects
- Procedural Terrain Generation
- Real-Time 3D Fractal Tree and Foliage Mesh
- Rogue-Lite Platformer
- 2.5D Tetris Platformer Hybrid
- Web 3.0
- Engine Features Overview
- Simulation Engine
- Rendering Engine
The renderer and the simulation are two distinct parts of the engine. Different renderers and simulations can be arbitrarily interchanged. It is the job of the BindingGraph to join them together. The simulation can run with or without a renderer viewing it. The dedicated network server is an example of the simulation running with no renderer viewing.
It is the job of the BindingGraph to link the renderer to the simulation. When creating a new renderer or simulation, a BindingGraph object is created. Each render frame, the BindingGraph will request a list of object ID's from the simulation corresponding to currently instantiated simulation objects. The BindingGraph maintains a Map of these ID's to BindingObjects. If no BindingObject exists for a given object ID, a new one is created. If a BindingObject exists bound to an ObjectID not in the simulation objectID list, the BindingObject is queued for deletion.
Creating a BindingObject triggers the creation of a SceneNode attached to the BindingObject, essentially linking the simulation object to a SceneNode. The SceneNodes are stored in the SceneGraph.
Any information about the simulation object necessary for rendering can be stored on its BindingObject. Each render frame, the BindingGraph queries the simulation for the current state of its bound Object, and updates its bound SceneNode accordingly. Any custom code can be specified to update the SceneNode or its children, including creating meshes, particle systems, transformations, etc.