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"
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);

Loading…
Cancel
Save