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