Browse Source

re-implement updating satellite position

main
cinnaboot 4 years ago
parent
commit
38a0294424
  1. 2
      ext/tangerine
  2. 146
      src/main.cpp

2
ext/tangerine

@ -1 +1 @@
Subproject commit c3d585201dbd134a833afb6c29d71c8d835a3192 Subproject commit 77fd7c695789d621ea04471c6f0aaac01fa0e369

146
src/main.cpp

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

Loading…
Cancel
Save