diff --git a/ext/tangerine b/ext/tangerine index c3d5852..77fd7c6 160000 --- a/ext/tangerine +++ b/ext/tangerine @@ -1 +1 @@ -Subproject commit c3d585201dbd134a833afb6c29d71c8d835a3192 +Subproject commit 77fd7c695789d621ea04471c6f0aaac01fa0e369 diff --git a/src/main.cpp b/src/main.cpp index 00c29fb..b83f886 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4,6 +4,7 @@ #include #include +#include #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