# Main Loop
# Initialising
The main function in Sandbox only contains 4 lines:
fn main() {
let mut app = glamour::App::new("Glamour Sandbox", 1920, 1080);
let sandbox_layer = SandboxLayer::new("SandboxLayer");
app.push_layer(Box::new(sandbox_layer));
app.run();
}
Calling glamour::App::new(title: &str, width: u32, height: u32) will do the following:
- Create a new event loop from the
glutincrate to handle OS I/O - Build a window with the supplied
title,width, andheight - Load OpenGL within that window's context
- Load imgui
- Initialise the Layer stack.
After this point, layers can be pushed to the app, and then run.
# Layer
A Layer is a basic trait to handle events of distinct parts of the application. Layers don't communicate with each other through the app, they're meant to be separate. There are only two layers used in the app:
PerfMetricsLayerfor reporting performance metricsSandboxLayeris a place to store all Sandbox related things.
Layer provides a few funtions that an implementation can use:
init()on_event()on_fixed_update()on_frame_update()on_imgui_update()
Hopfully, those should be fairly self documentating.
# Event Loop
Calling app.run() kickstarts the main event loop, which is responsible for
- Polling for events
- Managing fixed and frame updates
- Updating and rendering imgui
- Calling the each layer's
Layertrait functions at the appropriate point - Swapping the frame buffer to actual show the rendered image on the screen.
# AppContext
App also maintains a struct that holds the context of the application. This is AppContext, it provides some convenience to access things such as the window context and frame timings. This is passed to each Layer function.