From de850676e79da39aec6f1ce0400cfa94cecbd744 Mon Sep 17 00:00:00 2001 From: mattkae Date: Sun, 19 Sep 2021 16:32:15 -0400 Subject: First commit --- themes/main.cpp | 128 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 themes/main.cpp (limited to 'themes/main.cpp') diff --git a/themes/main.cpp b/themes/main.cpp new file mode 100644 index 0000000..7941153 --- /dev/null +++ b/themes/main.cpp @@ -0,0 +1,128 @@ +#include "WebglContext.h" +#include "MainLoop.h" +#include "Renderer2d.h" +#include "types.h" +#include "TreeShape.h" + +enum Theme { + Default = 0, + Autumn +}; + +struct AutumnTheme { + TreeShape tree; + + void load(Renderer2d* renderer); + void update(float32 dtSeconds); + void render(Renderer2d* renderer); + void unload(); +}; + +void load(Theme theme); +void unload(); +void update(float32 dtSeconds, void* userData); +EM_BOOL selectNone(int eventType, const EmscriptenMouseEvent* mouseEvent, void* userData); +EM_BOOL selectAutumn(int eventType, const EmscriptenMouseEvent* mouseEvent, void* userData); + +WebglContext context; +Renderer2d renderer; +MainLoop mainLoop; +Theme activeTheme = Theme::Default; +AutumnTheme autumnTheme; + +int main() { + context.init("#theme_canvas"); + emscripten_set_click_callback("#theme_button_default", NULL, false, selectNone); + emscripten_set_click_callback("#theme_button_autumn", NULL, false, selectAutumn); + + return 0; +} + +// -- Scene loading, updating, and unloading logic +void load(Theme theme) { + if (activeTheme == theme) { + printf("This theme is already active.\n"); + return; + } + + unload(); // Try and unload before we load, so that we start fresh + + activeTheme = theme; + renderer.load(&context); + mainLoop.run(update); + + switch (activeTheme) { + case Theme::Autumn: + autumnTheme.load(&renderer); + break; + default: + break; + } +} + +void update(float32 dtSeconds, void* userData) { + // -- Update + switch (activeTheme) { + case Theme::Autumn: + autumnTheme.update(dtSeconds); + break; + default: + break; + } + + // -- Render + renderer.render(); + switch (activeTheme) { + case Theme::Autumn: + autumnTheme.render(&renderer); + break; + default: + break; + } +} + +void unload() { + switch (activeTheme) { + case Theme::Autumn: + autumnTheme.unload(); + break; + default: + break; + } + + activeTheme = Theme::Default; + if (mainLoop.isRunning) { + mainLoop.stop(); + renderer.unload(); + } +} + +// -- HTML5 callbacks +EM_BOOL selectNone(int eventType, const EmscriptenMouseEvent* mouseEvent, void* userData) { + printf("Default theme selected\n"); + unload(); + return true; +} + +EM_BOOL selectAutumn(int eventType, const EmscriptenMouseEvent* mouseEvent, void* userData) { + printf("Autumn theme selected\n"); + load(Theme::Autumn); + return true; +} + +// -- Autumn theme +void AutumnTheme::load(Renderer2d* renderer) { + tree.load(renderer); +} + +void AutumnTheme::update(float32 dtSeconds) { + tree.update(dtSeconds); +} + +void AutumnTheme::render(Renderer2d* renderer) { + tree.render(renderer); +} + +void AutumnTheme::unload() { + tree.unload(); +} -- cgit v1.2.1