@ -38,6 +38,10 @@ struct GameState
bool running ;
MemoryArena * arena ;
u64 game_time_ms ;
u64 sim_time_ms ;
float sim_speed ;
system_2body system ; // FIXME: we're going to need more than 1 system...
Entity * satellite_entity ;
} ;
@ -181,9 +185,11 @@ loadScene(GameState* gs, RenderState* rs)
}
void
updateSatelliteModel ( const system_2body & sys , satellite & sat )
updateSatelliteModel ( const system_2body & sys ,
satellite & sat ,
double time_step )
{
sat . theta = getPropagatedTrueAnomaly ( sys , sat . theta ) ;
sat . theta = getPropagatedTrueAnomaly ( sys , sat . theta , time_step ) ;
sat . gamma = orbitGetFlightPathAngle ( sys . ep . e , sat . theta ) ;
sat . r = orbitGetRadialDistance ( sys . ep . e , sys . ep . p , sat . theta ) ;
sat . v = orbitGetVelocity ( sys . epsilon , sys . body . mu , sat . r ) ;
@ -193,7 +199,6 @@ updateSatelliteModel(const system_2body& sys, satellite& sat)
void
updateSatelliteEntity ( Entity * e , const satellite & sat )
{
// TODO: decouple framerate from time_step
const static mat4 xform =
glm : : rotate ( mat4 ( 1.0 ) , ( float ) M_PI_2 , vec3 ( 1 , 0 , 0 ) ) ;
const vec3 & v = sat . position ;
@ -222,39 +227,50 @@ preFrameCallback(RenderState* rs, void* user_data = nullptr)
bool gooey_wants = false ;
while ( SDL_PollEvent ( & e ) ) {
// FIXME: we should check for escape key here first
gooey_wants = gooProcessEvent ( e ) ;
if ( ! gooey_wants ) inputProcessEvent ( & is , e ) ;
}
if ( is . window_closed | | is . escape )
rs - > running = false ;
}
void
postFrameCallback ( RenderState * rs , void * user_data = nullptr )
{
// TODO: sim time stuff should have dedicated functions, and maybe a test
// since it's pretty important that the simulation is accurate-ish
// TODO: verify time to apoapsis/periapsis are correct
assert ( user_data ! = nullptr ) ;
GameState * gs = ( GameState * ) user_data ;
gooDraw ( rs - > handles . window , gs - > system , gs - > running ) ;
u64 last_sdl_tick = gs - > game_time_ms ;
gs - > game_time_ms = SDL_GetTicks64 ( ) ;
u64 current_tick = gs - > game_time_ms - last_sdl_tick ;
// NOTE: update sim time base on time since last frame * sim_speed
if ( gs - > running ) {
updateSatelliteModel ( gs - > system , gs - > system . sat ) ;
u64 last_game_tick = gs - > sim_time_ms ;
gs - > sim_time_ms = gs - > sim_time_ms + current_tick * gs - > sim_speed ;
u32 diff_ms = gs - > sim_time_ms - last_game_tick ;
double time_step = double ( diff_ms ) / 1000 ;
updateSatelliteModel ( gs - > system , gs - > system . sat , time_step ) ;
gs - > system . ep = ellipseInitAE ( gs - > system . ep . a , gs - > system . ep . e ) ;
updateSatelliteEntity ( gs - > satellite_entity , gs - > system . sat ) ;
//updateOrbit(gs->system, ellipse_entity);
}
}
// FIXME: testing sim time
u64 ticks = SDL_GetTicks64 ( ) ;
static u32 last_T ;
u32 T = ticks / 1000 ;
if ( T ! = last_T ) {
LOGF ( Debug , " seconds since sim start: %d \n " , T ) ;
last_T = T ;
}
void
postFrameCallback ( RenderState * rs , void * user_data = nullptr )
{
assert ( user_data ! = nullptr ) ;
GameState * gs = ( GameState * ) user_data ;
gooDraw ( rs - > handles . window ,
gs - > system ,
gs - > running ,
gs - > sim_time_ms ,
gs - > sim_speed ) ;
}
# define DEFAULT_SIM_SPEED 100
int
main ( )
{
@ -274,6 +290,7 @@ main()
GameState gs = { 0 } ;
gs . arena = arenaInit ( 16 ) ;
gs . sim_speed = DEFAULT_SIM_SPEED ;
loadScene ( & gs , rs ) ;
doRenderLoop ( rs , 60 , preFrameCallback , postFrameCallback , & gs ) ;
gooFree ( ) ;