|
|
|
|
@ -17,27 +17,48 @@ static system_2body g_sys = {0};
|
|
|
|
|
static MemoryArena* g_arena = nullptr; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Mesh* |
|
|
|
|
constructEllipseMesh(MemoryArena* arena, ellipse_3d& e3d, vec3 vertex_color) |
|
|
|
|
void |
|
|
|
|
initCamera(RenderState* rs, vec3 cam_pos, vec3 cam_focus, vec3 cam_up) |
|
|
|
|
{ |
|
|
|
|
float aspect_ratio = (float) rs->window_dims.x / (float) rs->window_dims.y; |
|
|
|
|
cameraInitPerspective(rs->camera, cam_pos, cam_focus, cam_up, aspect_ratio); |
|
|
|
|
GLBuffer* xform_ubo = getUBOByName(rs->gl_ctx, "matrices"); |
|
|
|
|
assert(xform_ubo != nullptr); |
|
|
|
|
updateGLBuffer(xform_ubo, &rs->camera->xforms); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Entity* |
|
|
|
|
initEllipseEntity(RenderState* rs, |
|
|
|
|
const ellipse_parameters& ep, |
|
|
|
|
u32 num_vertices) |
|
|
|
|
{ |
|
|
|
|
// TODO: would be nice to add a helper in libTangerine to init a Mesh/Model
|
|
|
|
|
// from code
|
|
|
|
|
Mesh* m = ARENA_ALLOC(arena, Mesh, 1); |
|
|
|
|
m->num_vertices = e3d.vert_count; |
|
|
|
|
m->num_indices = e3d.vert_count; |
|
|
|
|
m->vertices = ARENA_ALLOC(arena, vec3, e3d.vert_count); |
|
|
|
|
m->colors = ARENA_ALLOC(arena, vec3, e3d.vert_count); |
|
|
|
|
m->indices = ARENA_ALLOC(arena, u16, e3d.vert_count); |
|
|
|
|
m->xform = ARENA_ALLOC(arena, mat4, 1); |
|
|
|
|
*m->xform = mat4(1); |
|
|
|
|
|
|
|
|
|
for (uint i = 0; i < e3d.vert_count; i++) { |
|
|
|
|
m->vertices[i] = e3d.vertices[i]; |
|
|
|
|
ShaderProgram* shader = getShaderByName("colored_vertices", rs->gl_ctx); |
|
|
|
|
RenderGroup* rg = getFreeRenderGroup(rs); |
|
|
|
|
assert(shader && rg); |
|
|
|
|
initRenderGroup(rg, rs->rg_arena, shader, 16, "ellipse_rg"); |
|
|
|
|
|
|
|
|
|
g_sys.e3d = ellipseInit3D(g_sys.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]; |
|
|
|
|
m->colors[i] = vertex_color; |
|
|
|
|
m->indices[i] = i; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return m; |
|
|
|
|
u32 num_meshes = 1; |
|
|
|
|
Model* mdl = modelInitManual(rs->rg_arena, num_meshes, m); |
|
|
|
|
Entity* e = getFreeEntity(rg); |
|
|
|
|
initEntity(e, rs->gl_ctx, |
|
|
|
|
rs->rg_arena, |
|
|
|
|
mdl, |
|
|
|
|
shader->num_vertex_attribs, |
|
|
|
|
shader->attrib_mappings, |
|
|
|
|
"ellipse 01", |
|
|
|
|
GL_LINE_LOOP); |
|
|
|
|
|
|
|
|
|
return e; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Mesh* |
|
|
|
|
@ -76,6 +97,35 @@ createSatelliteMesh()
|
|
|
|
|
return nullptr; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
loadScene(RenderState* rs) |
|
|
|
|
{ |
|
|
|
|
initCamera(rs, vec3(0, -75 / SCALING, 0), vec3(0, 0, 0), vec3(0,0,1)); |
|
|
|
|
|
|
|
|
|
double a = 26564.5; // NOTE: semi-major axis in km
|
|
|
|
|
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_arena = arenaInit(16); |
|
|
|
|
Entity* ellipse_entity = initEllipseEntity(rs, g_sys.ep, 256); |
|
|
|
|
setEntityPosition(ellipse_entity, vec3(0, 0, 0)); |
|
|
|
|
rotateEntity(ellipse_entity, vec3(1, 0, 0), (float) M_PI / 2); |
|
|
|
|
#if 0 |
|
|
|
|
entity& planet_entity = rs->render_groups[0].entities[1]; |
|
|
|
|
sm = constructCircleMesh(3, 24, glm::vec3(255, 255, 0)); |
|
|
|
|
entInitMesh(planet_entity, sm, GL_LINE_LOOP); |
|
|
|
|
entRotate(planet_entity, (float) M_PI_2, glm::vec3(1, 0, 0)); |
|
|
|
|
|
|
|
|
|
entity& satellite_entity = rs->render_groups[0].entities[2]; |
|
|
|
|
sm = createSatelliteMesh(); |
|
|
|
|
entInitMesh(satellite_entity, sm, GL_TRIANGLES); |
|
|
|
|
entRotate(satellite_entity, (float) M_PI_2, glm::vec3(1, 0, 0)); |
|
|
|
|
entSetWorldPosition(satellite_entity, g_sys.e3d.vertices[0]); |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
updateSatelliteModel(const system_2body& sys, satellite& sat) |
|
|
|
|
{ |
|
|
|
|
@ -141,36 +191,6 @@ postFrameCallback(RenderState* rs)
|
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Entity* |
|
|
|
|
initEllipseEntity(RenderState* rs, |
|
|
|
|
const ellipse_parameters& ep, |
|
|
|
|
u32 num_vertices) |
|
|
|
|
{ |
|
|
|
|
ShaderProgram* shader = getShaderByName("colored_vertices", rs->gl_ctx); |
|
|
|
|
RenderGroup* rg = getFreeRenderGroup(rs); |
|
|
|
|
assert(shader && rg); |
|
|
|
|
initRenderGroup(rg, rs->rg_arena, shader, 16, "ellipse_rg"); |
|
|
|
|
Entity* e = getFreeEntity(rg); |
|
|
|
|
assert(e); |
|
|
|
|
|
|
|
|
|
g_sys.e3d = ellipseInit3D(g_sys.ep, num_vertices); |
|
|
|
|
Mesh* m = constructEllipseMesh(rs->assets.arena, |
|
|
|
|
g_sys.e3d, |
|
|
|
|
vec3(255, 0, 255)); |
|
|
|
|
Model* mdl = ARENA_ALLOC(rs->assets.arena, Model, 1); |
|
|
|
|
mdl->num_meshes = 1; |
|
|
|
|
mdl->meshes = m; |
|
|
|
|
initEntity(e, rs->gl_ctx, |
|
|
|
|
rs->rg_arena, |
|
|
|
|
mdl, |
|
|
|
|
shader->num_vertex_attribs, |
|
|
|
|
shader->attrib_mappings, |
|
|
|
|
"ellipse 01", |
|
|
|
|
GL_LINE_LOOP); |
|
|
|
|
|
|
|
|
|
return e; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int |
|
|
|
|
main() |
|
|
|
|
{ |
|
|
|
|
@ -188,43 +208,8 @@ main()
|
|
|
|
|
return 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
vec2 dims = rs->window_dims; |
|
|
|
|
cameraInitPerspective( |
|
|
|
|
rs->camera, |
|
|
|
|
vec3(0, -75 / SCALING, 0), |
|
|
|
|
vec3(0, 0, 0), |
|
|
|
|
vec3(0,0,1), |
|
|
|
|
dims.x / dims.y |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
GLBuffer* xform_ubo = getUBOByName(rs->gl_ctx, "matrices"); |
|
|
|
|
assert(xform_ubo != nullptr); |
|
|
|
|
updateGLBuffer(xform_ubo, &rs->camera->xforms); |
|
|
|
|
|
|
|
|
|
double a = 26564.5; // NOTE: semi-major axis in km
|
|
|
|
|
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_arena = arenaInit(16); |
|
|
|
|
Entity* ellipse_entity = initEllipseEntity(rs, g_sys.ep, 256); |
|
|
|
|
setEntityPosition(ellipse_entity, vec3(0, 0, 0)); |
|
|
|
|
rotateEntity(ellipse_entity, vec3(1, 0, 0), (float) M_PI / 2); |
|
|
|
|
#if 0 |
|
|
|
|
entity& planet_entity = rs->render_groups[0].entities[1]; |
|
|
|
|
sm = constructCircleMesh(3, 24, glm::vec3(255, 255, 0)); |
|
|
|
|
entInitMesh(planet_entity, sm, GL_LINE_LOOP); |
|
|
|
|
entRotate(planet_entity, (float) M_PI_2, glm::vec3(1, 0, 0)); |
|
|
|
|
|
|
|
|
|
entity& satellite_entity = rs->render_groups[0].entities[2]; |
|
|
|
|
sm = createSatelliteMesh(); |
|
|
|
|
entInitMesh(satellite_entity, sm, GL_TRIANGLES); |
|
|
|
|
entRotate(satellite_entity, (float) M_PI_2, glm::vec3(1, 0, 0)); |
|
|
|
|
entSetWorldPosition(satellite_entity, g_sys.e3d.vertices[0]); |
|
|
|
|
#endif |
|
|
|
|
loadScene(rs); |
|
|
|
|
doRenderLoop(rs, 60, preFrameCallback, postFrameCallback); |
|
|
|
|
|
|
|
|
|
gooFree(); |
|
|
|
|
freeRenderState(rs); |
|
|
|
|
|
|
|
|
|
|