Browse Source

add 'GameState' struct, and use 'user_data' in callbacks

main
cinnaboot 4 years ago
parent
commit
d370265c83
  1. 65
      src/main.cpp

65
src/main.cpp

@ -13,15 +13,20 @@
#include "orbits.h" #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 double SCALING = 0.001;
const vec4 g_light_direction = vec4(-2, 1, 3, 1); const vec4 g_light_direction = vec4(-2, 1, 3, 1);
const vec4 g_light_color = vec4(0.5, 0.5, 0.5, 1); const vec4 g_light_color = vec4(0.5, 0.5, 0.5, 1);
const uvec4 g_light_intensities = uvec4(1, 0, 0, 0); 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 void
initCamera(RenderState* rs, vec3 cam_pos, vec3 cam_focus, vec3 cam_up) initCamera(RenderState* rs, vec3 cam_pos, vec3 cam_focus, vec3 cam_up)
@ -51,15 +56,15 @@ initLights(RenderState* rs)
Entity* Entity*
initEllipseEntity(RenderState* rs, initEllipseEntity(RenderState* rs,
const ellipse_parameters& ep, system_2body* system,
u32 num_vertices) 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); Mesh* m = meshInit(rs->rg_arena, num_vertices, num_vertices, false, true);
vec3 vertex_color = vec3(255, 0, 255); vec3 vertex_color = vec3(255, 0, 255);
for (uint i = 0; i < g_sys.e3d.vert_count; i++) { for (uint i = 0; i < system->e3d.vert_count; i++) {
m->vertices[i] = g_sys.e3d.vertices[i]; m->vertices[i] = system->e3d.vertices[i];
m->colors[i] = vertex_color; m->colors[i] = vertex_color;
m->indices[i] = i; m->indices[i] = i;
} }
@ -130,7 +135,7 @@ initSatelliteEntity(RenderState* rs)
} }
void void
loadScene(RenderState* rs) loadScene(GameState* gs, RenderState* rs)
{ {
initCamera(rs, vec3(0, -75 / SCALING, 0), vec3(0, 0, 0), vec3(0,0,1)); initCamera(rs, vec3(0, -75 / SCALING, 0), vec3(0, 0, 0), vec3(0,0,1));
initLights(rs); initLights(rs);
@ -139,25 +144,25 @@ loadScene(RenderState* rs)
double e = 0.7411; // NOTE: eccentricity double e = 0.7411; // NOTE: eccentricity
double mu = 398601.68; // NOTE: gravitational parameter double mu = 398601.68; // NOTE: gravitational parameter
double r = 6378; // NOTE: body radius in km double r = 6378; // NOTE: body radius in km
g_sys = systemInit(gravBodyInit(mu, r), orbitInit(a, e)); gs->system = systemInit(gravBodyInit(mu, r), orbitInit(a, e));
g_running = true; gs->running = true;
// TODO: streamline the boilerplate in init_X_Entity functions // TODO: streamline the boilerplate in init_X_Entity functions
g_arena = arenaInit(16);
ShaderProgram* shader = getShaderByName("colored_vertices", rs->gl_ctx); ShaderProgram* shader = getShaderByName("colored_vertices", rs->gl_ctx);
initRenderGroup( initRenderGroup(
getFreeRenderGroup(rs), rs->rg_arena, shader, 256, "manual mesh group"); 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)); setEntityPosition(ellipse_entity, vec3(0, 0, 0));
rotateEntity(ellipse_entity, vec3(1, 0, 0), (float) M_PI / 2); rotateEntity(ellipse_entity, vec3(1, 0, 0), (float) M_PI / 2);
initPlanetEntity(rs, r); initPlanetEntity(rs, r);
Entity* satellite_entity = initSatelliteEntity(rs); gs->satellite_entity = initSatelliteEntity(rs);
scaleEntity(satellite_entity, 1 / SCALING); scaleEntity(gs->satellite_entity, 1 / SCALING);
rotateEntity(satellite_entity, vec3(1, 0, 0), (float) M_PI / 2); rotateEntity(gs->satellite_entity, vec3(1, 0, 0), (float) M_PI / 2);
setEntityPosition(satellite_entity, g_sys.e3d.vertices[0]); setEntityPosition(gs->satellite_entity, gs->system.e3d.vertices[0]);
} }
void void
@ -195,7 +200,7 @@ updateOrbit(system_2body sys, Entity& ellipse_entity)
} }
void void
preFrameCallback(RenderState* rs) preFrameCallback(RenderState* rs, void* user_data = nullptr)
{ {
static InputState is = {}; static InputState is = {};
SDL_Event e; SDL_Event e;
@ -211,14 +216,18 @@ preFrameCallback(RenderState* rs)
} }
void void
postFrameCallback(RenderState* rs) postFrameCallback(RenderState* rs, void* user_data = nullptr)
{ {
static Entity* satellite = nullptr; assert(user_data != nullptr);
gooDraw(rs->handles.window, g_sys, g_running); GameState* gs = (GameState*) user_data;
gooDraw(rs->handles.window, gs->system, gs->running);
if (g_running) {
updateSatelliteModel(g_sys, g_sys.sat); if (gs->running) {
g_sys.ep = ellipseInitAE(g_sys.ep.a, g_sys.ep.e); 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) { if (satellite == nullptr) {
RenderGroup* rg = getRenderGroupByName(rs, "manual mesh group"); RenderGroup* rg = getRenderGroupByName(rs, "manual mesh group");
@ -248,8 +257,10 @@ main()
return 1; return 1;
} }
loadScene(rs); GameState gs = {0};
doRenderLoop(rs, 60, preFrameCallback, postFrameCallback); gs.arena = arenaInit(16);
loadScene(&gs, rs);
doRenderLoop(rs, 60, preFrameCallback, postFrameCallback, &gs);
gooFree(); gooFree();
freeRenderState(rs); freeRenderState(rs);

Loading…
Cancel
Save