|
|
|
|
@ -4,6 +4,7 @@
|
|
|
|
|
|
|
|
|
|
#include <SDL2/SDL.h> |
|
|
|
|
#include <glm/glm.hpp> |
|
|
|
|
#include <glm/gtc/matrix_transform.hpp> |
|
|
|
|
|
|
|
|
|
#include "input.h" |
|
|
|
|
#include "tangerine.h" |
|
|
|
|
@ -32,11 +33,6 @@ 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"); |
|
|
|
|
|
|
|
|
|
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); |
|
|
|
|
@ -47,54 +43,79 @@ initEllipseEntity(RenderState* rs,
|
|
|
|
|
m->indices[i] = i; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
u32 num_meshes = 1; |
|
|
|
|
Model* mdl = modelInitManual(rs->rg_arena, num_meshes, m); |
|
|
|
|
Model* mdl = modelInitManual(rs->rg_arena, 1, m); |
|
|
|
|
RenderGroup* rg = getRenderGroupByName(rs, "manual mesh group"); |
|
|
|
|
Entity* e = getFreeEntity(rg); |
|
|
|
|
initEntity(e, rs->gl_ctx, |
|
|
|
|
rs->rg_arena, |
|
|
|
|
mdl, |
|
|
|
|
shader->num_vertex_attribs, |
|
|
|
|
shader->attrib_mappings, |
|
|
|
|
rg->shader->num_vertex_attribs, |
|
|
|
|
rg->shader->attrib_mappings, |
|
|
|
|
"ellipse 01", |
|
|
|
|
GL_LINE_LOOP); |
|
|
|
|
|
|
|
|
|
return e; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Mesh* |
|
|
|
|
constructCircleMesh(float r, uint vert_count, glm::vec3 vertex_color) |
|
|
|
|
Entity* |
|
|
|
|
initPlanetEntity(RenderState* rs) |
|
|
|
|
{ |
|
|
|
|
#if 0 |
|
|
|
|
simple_mesh* sm = meInitMesh(vert_count); |
|
|
|
|
float angle = (float) M_PI * 2 / vert_count; |
|
|
|
|
r = r / SCALING; |
|
|
|
|
u32 num_vertices = 24; |
|
|
|
|
vec3 vertex_color = vec3(255, 255, 0); |
|
|
|
|
float radius = 3; |
|
|
|
|
|
|
|
|
|
Mesh* m = meshInit(rs->rg_arena, num_vertices, num_vertices, false, true); |
|
|
|
|
float angle = (float) M_PI * 2 / num_vertices; |
|
|
|
|
float r = radius / SCALING; |
|
|
|
|
|
|
|
|
|
for (uint i = 0; i < vert_count; i++) { |
|
|
|
|
sm->vertices[i] = glm::vec3(cos(i * angle) * r, sin(i * angle) * r, 0); |
|
|
|
|
sm->vert_colors[i] = vertex_color; |
|
|
|
|
for (uint i = 0; i < num_vertices; i++) { |
|
|
|
|
m->vertices[i] = glm::vec3(cos(i * angle) * r, sin(i * angle) * r, 0); |
|
|
|
|
m->colors[i] = vertex_color; |
|
|
|
|
m->indices[i] = i; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return sm; |
|
|
|
|
#endif |
|
|
|
|
return nullptr; |
|
|
|
|
Model* mdl = modelInitManual(rs->rg_arena, 1, m); |
|
|
|
|
RenderGroup* rg = getRenderGroupByName(rs, "manual mesh group"); |
|
|
|
|
Entity* e = getFreeEntity(rg); |
|
|
|
|
initEntity(e, rs->gl_ctx, |
|
|
|
|
rs->rg_arena, |
|
|
|
|
mdl, |
|
|
|
|
rg->shader->num_vertex_attribs, |
|
|
|
|
rg->shader->attrib_mappings, |
|
|
|
|
"planet 01", |
|
|
|
|
GL_LINE_LOOP); |
|
|
|
|
|
|
|
|
|
return e; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Mesh* |
|
|
|
|
createSatelliteMesh() |
|
|
|
|
Entity* |
|
|
|
|
initSatelliteEntity(RenderState* rs) |
|
|
|
|
{ |
|
|
|
|
#if 0 |
|
|
|
|
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; |
|
|
|
|
#endif |
|
|
|
|
return nullptr; |
|
|
|
|
u32 num_vertices = 3; |
|
|
|
|
vec3 vertex_color = vec3(255, 0, 0); |
|
|
|
|
Mesh* m = meshInit(rs->rg_arena, num_vertices, num_vertices, false, true); |
|
|
|
|
m->vertices[0] = vec3(0, 1, 0); |
|
|
|
|
m->colors[0] = vertex_color; |
|
|
|
|
m->indices[0] = 0; |
|
|
|
|
m->vertices[1] = vec3(-1, -1, 0); |
|
|
|
|
m->colors[1] = vertex_color; |
|
|
|
|
m->indices[1] = 1; |
|
|
|
|
m->vertices[2] = vec3(1, -1, 0); |
|
|
|
|
m->colors[2] = vertex_color; |
|
|
|
|
m->indices[2] = 2; |
|
|
|
|
|
|
|
|
|
Model* mdl = modelInitManual(rs->rg_arena, 1, m); |
|
|
|
|
RenderGroup* rg = getRenderGroupByName(rs, "manual mesh group"); |
|
|
|
|
Entity* e = getFreeEntity(rg); |
|
|
|
|
initEntity(e, rs->gl_ctx, |
|
|
|
|
rs->rg_arena, |
|
|
|
|
mdl, |
|
|
|
|
rg->shader->num_vertex_attribs, |
|
|
|
|
rg->shader->attrib_mappings, |
|
|
|
|
"ship 01", |
|
|
|
|
GL_TRIANGLES); |
|
|
|
|
|
|
|
|
|
return e; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
@ -108,22 +129,23 @@ loadScene(RenderState* rs)
|
|
|
|
|
double r = 6378; // NOTE: body radius in km
|
|
|
|
|
g_sys = systemInit(gravBodyInit(mu, r), orbitInit(a, e)); |
|
|
|
|
|
|
|
|
|
// 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); |
|
|
|
|
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 |
|
|
|
|
|
|
|
|
|
Entity* planet_entity = initPlanetEntity(rs); |
|
|
|
|
rotateEntity(planet_entity, vec3(1, 0, 0), (float) M_PI / 2); |
|
|
|
|
|
|
|
|
|
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]); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
@ -137,15 +159,13 @@ updateSatelliteModel(const system_2body& sys, satellite& sat)
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
updateSatelliteEntity(Entity& ent, const satellite& sat) |
|
|
|
|
updateSatelliteEntity(Entity* e, const satellite& sat) |
|
|
|
|
{ |
|
|
|
|
#if 0 |
|
|
|
|
// TODO: decouple framerate from time_step
|
|
|
|
|
const static glm::mat4 xform = |
|
|
|
|
glm::rotate(glm::mat4(1.0), (float) M_PI_2, glm::vec3(1, 0, 0)); |
|
|
|
|
const glm::vec3& v = sat.position; |
|
|
|
|
entSetWorldPosition(ent, xform * glm::vec4(v.x, v.y, v.z, 1)); |
|
|
|
|
#endif |
|
|
|
|
const static mat4 xform = |
|
|
|
|
glm::rotate(mat4(1.0), (float) M_PI_2, vec3(1, 0, 0)); |
|
|
|
|
const vec3& v = sat.position; |
|
|
|
|
setEntityPosition(e, xform * vec4(v.x, v.y, v.z, 1)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// NOTE: use ellipseValidate(ep) before calling to avoid failing assertions
|
|
|
|
|
@ -183,12 +203,18 @@ postFrameCallback(RenderState* rs)
|
|
|
|
|
{ |
|
|
|
|
gooDraw(rs->handles.window, g_sys); |
|
|
|
|
g_sys.ep = ellipseInitAE(g_sys.ep.a, g_sys.ep.e); |
|
|
|
|
#if 0 |
|
|
|
|
entity& ellipse_entity = rs->render_groups[0].entities[0]; |
|
|
|
|
updateOrbit(g_sys, ellipse_entity); |
|
|
|
|
updateSatelliteModel(g_sys, g_sys.sat); |
|
|
|
|
updateSatelliteEntity(rs->render_groups[0].entities[2], g_sys.sat); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
static Entity* satellite = nullptr; |
|
|
|
|
|
|
|
|
|
if (satellite == nullptr) { |
|
|
|
|
RenderGroup* rg = getRenderGroupByName(rs, "manual mesh group"); |
|
|
|
|
satellite = getEntityByName(rg, "ship 01"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
assert(satellite); |
|
|
|
|
updateSatelliteEntity(satellite, g_sys.sat); |
|
|
|
|
//updateOrbit(g_sys, ellipse_entity);
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int |
|
|
|
|
|