Browse Source

use new libTangerine interface functions

main
cinnaboot 4 years ago
parent
commit
e42926d1c3
  1. 2
      ext/tangerine
  2. 149
      src/main.cpp

2
ext/tangerine

@ -1 +1 @@
Subproject commit 0821166a74a1db9e31d39cadd2eba47953a31a2d
Subproject commit c3d585201dbd134a833afb6c29d71c8d835a3192

149
src/main.cpp

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

Loading…
Cancel
Save