|
|
|
@ -13,8 +13,9 @@ |
|
|
|
#include "orbits.h" |
|
|
|
#include "orbits.h" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const double SCALING = 0.001; |
|
|
|
|
|
|
|
static orbital_elements g_orbit = {}; |
|
|
|
static ellipse_3d g_ellipse; |
|
|
|
static ellipse_3d g_ellipse; |
|
|
|
static uint g_index = 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
simple_mesh* |
|
|
|
simple_mesh* |
|
|
|
@ -35,6 +36,7 @@ constructCircleMesh(float r, uint vert_count, glm::vec3 vertex_color) |
|
|
|
{ |
|
|
|
{ |
|
|
|
simple_mesh* sm = meInitMesh(vert_count); |
|
|
|
simple_mesh* sm = meInitMesh(vert_count); |
|
|
|
float angle = (float) M_PI * 2 / vert_count; |
|
|
|
float angle = (float) M_PI * 2 / vert_count; |
|
|
|
|
|
|
|
r = r / SCALING; |
|
|
|
|
|
|
|
|
|
|
|
for (uint i = 0; i < vert_count; i++) { |
|
|
|
for (uint i = 0; i < vert_count; i++) { |
|
|
|
sm->vertices[i] = glm::vec3(cos(i * angle) * r, sin(i * angle) * r, 0); |
|
|
|
sm->vertices[i] = glm::vec3(cos(i * angle) * r, sin(i * angle) * r, 0); |
|
|
|
@ -44,21 +46,50 @@ constructCircleMesh(float r, uint vert_count, glm::vec3 vertex_color) |
|
|
|
return sm; |
|
|
|
return sm; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
simple_mesh* |
|
|
|
|
|
|
|
createSatelliteMesh() |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
simple_mesh* sm = meInitMesh(3); |
|
|
|
|
|
|
|
glm::vec3 s_color(255, 0, 0); |
|
|
|
|
|
|
|
sm->vertices[0] = glm::vec3(0, 1 / SCALING, 0); |
|
|
|
|
|
|
|
sm->vert_colors[0] = s_color; |
|
|
|
|
|
|
|
sm->vertices[1] = glm::vec3(-1 / SCALING, -1 / SCALING, 0); |
|
|
|
|
|
|
|
sm->vert_colors[1] = s_color; |
|
|
|
|
|
|
|
sm->vertices[2] = glm::vec3(1 / SCALING, -1 / SCALING, 0); |
|
|
|
|
|
|
|
sm->vert_colors[2] = s_color; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return sm; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
orbital_elements |
|
|
|
|
|
|
|
initOrbit() |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
orbital_elements orbit = {}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
double a = 26564.5; // kilometers
|
|
|
|
|
|
|
|
double e = 0.7411; |
|
|
|
|
|
|
|
double b = a * sqrt(1 - pow(e, 2.0)); |
|
|
|
|
|
|
|
orbit.ep = constructEllipse(a, b); |
|
|
|
|
|
|
|
orbit.mu = 398601.68; // NOTE: earth's gravitational parameter in km^3/s^2
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return orbit; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void |
|
|
|
void |
|
|
|
doFrameCallback(render_state* rs) |
|
|
|
doFrameCallback(render_state* rs) |
|
|
|
{ |
|
|
|
{ |
|
|
|
|
|
|
|
const static glm::mat4 xform = |
|
|
|
|
|
|
|
glm::rotate(glm::mat4(1.0), (float) M_PI_2, glm::vec3(1, 0, 0)); |
|
|
|
entity& satellite = rs->render_groups[0].entities[2]; |
|
|
|
entity& satellite = rs->render_groups[0].entities[2]; |
|
|
|
|
|
|
|
|
|
|
|
g_index++; |
|
|
|
// TODO: decouple framerate from time_step
|
|
|
|
if (g_index == g_ellipse.vert_count) g_index = 0; |
|
|
|
unsigned int time_step = 100; // NOTE: seconds
|
|
|
|
static glm::mat4 xform = |
|
|
|
|
|
|
|
glm::rotate(glm::mat4(1.0), (float) M_PI_2, glm::vec3(1, 0, 0)); |
|
|
|
|
|
|
|
glm::vec3 v = g_ellipse.vertices[g_index]; |
|
|
|
|
|
|
|
entSetWorldPosition(satellite, xform * glm::vec4(v.x, v.y, v.z, 1)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if 0 |
|
|
|
g_orbit.nu = getPropagatedTrueAnomaly(g_orbit, g_orbit.nu, time_step); |
|
|
|
LOG(Debug) << "SDL_GetTicks(): " << SDL_GetTicks() << "ms\n"; |
|
|
|
double r2 = getRadialPosition(g_orbit.ep, g_orbit.nu); |
|
|
|
#endif |
|
|
|
glm::vec2 coords = polarToRect(g_orbit.nu, r2); |
|
|
|
|
|
|
|
glm::vec3 v = glm::vec3(coords, 0); |
|
|
|
|
|
|
|
entSetWorldPosition(satellite, xform * glm::vec4(v.x, v.y, v.z, 1)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int |
|
|
|
int |
|
|
|
@ -75,44 +106,40 @@ main() |
|
|
|
|
|
|
|
|
|
|
|
cameraInitPerspective( |
|
|
|
cameraInitPerspective( |
|
|
|
rs->cam, |
|
|
|
rs->cam, |
|
|
|
glm::vec3(0, -100, 0), |
|
|
|
glm::vec3(0, -75 / SCALING, 0), |
|
|
|
glm::vec3(0, 0, 0), |
|
|
|
glm::vec3(0, 0, 0), |
|
|
|
glm::vec3(0,0,1) |
|
|
|
glm::vec3(0,0,1) |
|
|
|
); |
|
|
|
); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
g_orbit = initOrbit(); |
|
|
|
|
|
|
|
ellipse_parameters ep = constructEllipse(g_orbit.ep.a, g_orbit.ep.b); |
|
|
|
|
|
|
|
|
|
|
|
// TODO: (renderer) this needs to be more convenient
|
|
|
|
// TODO: (renderer) this needs to be more convenient
|
|
|
|
shader_wrapper sw = { SIMPLE_SHADER, nullptr, rs->simple_shader }; |
|
|
|
shader_wrapper sw = { SIMPLE_SHADER, nullptr, rs->simple_shader }; |
|
|
|
rs->render_groups = renAllocateGroup(3, sw); |
|
|
|
rs->render_groups = renAllocateGroup(3, sw); |
|
|
|
rs->render_group_count = 1; |
|
|
|
rs->render_group_count = 1; |
|
|
|
|
|
|
|
|
|
|
|
entity& ellipse_entity = rs->render_groups[0].entities[0]; |
|
|
|
entity& ellipse_entity = rs->render_groups[0].entities[0]; |
|
|
|
ellipse_parameters ep = constructEllipse(50, 30); |
|
|
|
|
|
|
|
g_ellipse = constructEllipse3D(ep, 256); |
|
|
|
g_ellipse = constructEllipse3D(ep, 256); |
|
|
|
simple_mesh* sm = constructEllipseMesh(g_ellipse, glm::vec3(255, 0, 255)); |
|
|
|
simple_mesh* sm = constructEllipseMesh(g_ellipse, glm::vec3(255, 0, 255)); |
|
|
|
entInitMesh(ellipse_entity, sm, GL_LINES); |
|
|
|
entInitMesh(ellipse_entity, sm, GL_LINE_LOOP); |
|
|
|
entRotate(ellipse_entity, (float) M_PI_2, glm::vec3(1, 0, 0)); |
|
|
|
entRotate(ellipse_entity, (float) M_PI_2, glm::vec3(1, 0, 0)); |
|
|
|
|
|
|
|
|
|
|
|
entity& planet_entity = rs->render_groups[0].entities[1]; |
|
|
|
entity& planet_entity = rs->render_groups[0].entities[1]; |
|
|
|
sm = constructCircleMesh(3, 24, glm::vec3(255, 255, 0)); |
|
|
|
sm = constructCircleMesh(3, 24, glm::vec3(255, 255, 0)); |
|
|
|
entInitMesh(planet_entity, sm, GL_LINE_LOOP); |
|
|
|
entInitMesh(planet_entity, sm, GL_LINE_LOOP); |
|
|
|
entRotate(planet_entity, (float) M_PI_2, glm::vec3(1, 0, 0)); |
|
|
|
entRotate(planet_entity, (float) M_PI_2, glm::vec3(1, 0, 0)); |
|
|
|
entTranslate(planet_entity, glm::vec3(ep.f2.x, 0, 0)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
entity& satellite_entity = rs->render_groups[0].entities[2]; |
|
|
|
entity& satellite_entity = rs->render_groups[0].entities[2]; |
|
|
|
sm = meInitMesh(3); |
|
|
|
sm = createSatelliteMesh(); |
|
|
|
glm::vec3 s_color(255, 0, 0); |
|
|
|
|
|
|
|
sm->vertices[0] = glm::vec3(0, 1, 0); |
|
|
|
|
|
|
|
sm->vert_colors[0] = s_color; |
|
|
|
|
|
|
|
sm->vertices[1] = glm::vec3(-1, -1, 0); |
|
|
|
|
|
|
|
sm->vert_colors[1] = s_color; |
|
|
|
|
|
|
|
sm->vertices[2] = glm::vec3(1, -1, 0); |
|
|
|
|
|
|
|
sm->vert_colors[2] = s_color; |
|
|
|
|
|
|
|
entInitMesh(satellite_entity, sm, GL_TRIANGLES); |
|
|
|
entInitMesh(satellite_entity, sm, GL_TRIANGLES); |
|
|
|
entRotate(satellite_entity, (float) M_PI_2, glm::vec3(1, 0, 0)); |
|
|
|
entRotate(satellite_entity, (float) M_PI_2, glm::vec3(1, 0, 0)); |
|
|
|
entSetWorldPosition(satellite_entity, g_ellipse.vertices[0]); |
|
|
|
entSetWorldPosition(satellite_entity, g_ellipse.vertices[0]); |
|
|
|
|
|
|
|
|
|
|
|
renDoRenderLoop(rs, 60, doFrameCallback); |
|
|
|
renDoRenderLoop(rs, 60, doFrameCallback); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// TODO: clean up mesh pointers? don't remember if renderer does that
|
|
|
|
|
|
|
|
// automatically
|
|
|
|
renShutdown(rs); |
|
|
|
renShutdown(rs); |
|
|
|
return 0; |
|
|
|
return 0; |
|
|
|
} |
|
|
|
} |
|
|
|
|