From d370265c833679c446498c3012bc87537b9b2a20 Mon Sep 17 00:00:00 2001 From: cinnaboot Date: Sat, 9 Apr 2022 13:44:50 -0400 Subject: [PATCH] add 'GameState' struct, and use 'user_data' in callbacks --- src/main.cpp | 65 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 38 insertions(+), 27 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 3cb83da..5550c1f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -13,15 +13,20 @@ #include "orbits.h" -static bool g_running = false; -static system_2body g_sys = {0}; -static MemoryArena* g_arena = nullptr; - const double SCALING = 0.001; const vec4 g_light_direction = vec4(-2, 1, 3, 1); const vec4 g_light_color = vec4(0.5, 0.5, 0.5, 1); const uvec4 g_light_intensities = uvec4(1, 0, 0, 0); +struct GameState +{ + bool running; + MemoryArena* arena; + + system_2body system; // FIXME: we're going to need more than 1 system... + Entity* satellite_entity; +}; + void initCamera(RenderState* rs, vec3 cam_pos, vec3 cam_focus, vec3 cam_up) @@ -51,15 +56,15 @@ initLights(RenderState* rs) Entity* initEllipseEntity(RenderState* rs, - const ellipse_parameters& ep, + system_2body* system, u32 num_vertices) { - g_sys.e3d = ellipseInit3D(g_sys.ep, num_vertices); + system->e3d = ellipseInit3D(system->ep, num_vertices); Mesh* m = meshInit(rs->rg_arena, num_vertices, num_vertices, false, true); vec3 vertex_color = vec3(255, 0, 255); - for (uint i = 0; i < g_sys.e3d.vert_count; i++) { - m->vertices[i] = g_sys.e3d.vertices[i]; + for (uint i = 0; i < system->e3d.vert_count; i++) { + m->vertices[i] = system->e3d.vertices[i]; m->colors[i] = vertex_color; m->indices[i] = i; } @@ -130,7 +135,7 @@ initSatelliteEntity(RenderState* rs) } void -loadScene(RenderState* rs) +loadScene(GameState* gs, RenderState* rs) { initCamera(rs, vec3(0, -75 / SCALING, 0), vec3(0, 0, 0), vec3(0,0,1)); initLights(rs); @@ -139,25 +144,25 @@ loadScene(RenderState* rs) double e = 0.7411; // NOTE: eccentricity double mu = 398601.68; // NOTE: gravitational parameter double r = 6378; // NOTE: body radius in km - g_sys = systemInit(gravBodyInit(mu, r), orbitInit(a, e)); - g_running = true; + gs->system = systemInit(gravBodyInit(mu, r), orbitInit(a, e)); + gs->running = true; // TODO: streamline the boilerplate in init_X_Entity functions - g_arena = arenaInit(16); ShaderProgram* shader = getShaderByName("colored_vertices", rs->gl_ctx); initRenderGroup( getFreeRenderGroup(rs), rs->rg_arena, shader, 256, "manual mesh group"); - Entity* ellipse_entity = initEllipseEntity(rs, g_sys.ep, 256); + //Entity* ellipse_entity = initEllipseEntity(rs, g_sys.ep, 256); + Entity* ellipse_entity = initEllipseEntity(rs, &gs->system, 256); setEntityPosition(ellipse_entity, vec3(0, 0, 0)); rotateEntity(ellipse_entity, vec3(1, 0, 0), (float) M_PI / 2); initPlanetEntity(rs, r); - Entity* satellite_entity = initSatelliteEntity(rs); - scaleEntity(satellite_entity, 1 / SCALING); - rotateEntity(satellite_entity, vec3(1, 0, 0), (float) M_PI / 2); - setEntityPosition(satellite_entity, g_sys.e3d.vertices[0]); + gs->satellite_entity = initSatelliteEntity(rs); + scaleEntity(gs->satellite_entity, 1 / SCALING); + rotateEntity(gs->satellite_entity, vec3(1, 0, 0), (float) M_PI / 2); + setEntityPosition(gs->satellite_entity, gs->system.e3d.vertices[0]); } void @@ -195,7 +200,7 @@ updateOrbit(system_2body sys, Entity& ellipse_entity) } void -preFrameCallback(RenderState* rs) +preFrameCallback(RenderState* rs, void* user_data = nullptr) { static InputState is = {}; SDL_Event e; @@ -211,14 +216,18 @@ preFrameCallback(RenderState* rs) } void -postFrameCallback(RenderState* rs) +postFrameCallback(RenderState* rs, void* user_data = nullptr) { - static Entity* satellite = nullptr; - gooDraw(rs->handles.window, g_sys, g_running); - - if (g_running) { - updateSatelliteModel(g_sys, g_sys.sat); - g_sys.ep = ellipseInitAE(g_sys.ep.a, g_sys.ep.e); + assert(user_data != nullptr); + GameState* gs = (GameState*) user_data; + gooDraw(rs->handles.window, gs->system, gs->running); + + if (gs->running) { + updateSatelliteModel(gs->system, gs->system.sat); + gs->system.ep = ellipseInitAE(gs->system.ep.a, gs->system.ep.e); + updateSatelliteEntity(gs->satellite_entity, gs->system.sat); + //updateOrbit(gs->system, ellipse_entity); + } if (satellite == nullptr) { RenderGroup* rg = getRenderGroupByName(rs, "manual mesh group"); @@ -248,8 +257,10 @@ main() return 1; } - loadScene(rs); - doRenderLoop(rs, 60, preFrameCallback, postFrameCallback); + GameState gs = {0}; + gs.arena = arenaInit(16); + loadScene(&gs, rs); + doRenderLoop(rs, 60, preFrameCallback, postFrameCallback, &gs); gooFree(); freeRenderState(rs);