From e42926d1c35eca1cd1c5ef6e711646960e5936da Mon Sep 17 00:00:00 2001 From: cinnaboot Date: Mon, 21 Mar 2022 11:29:22 -0400 Subject: [PATCH] use new libTangerine interface functions --- ext/tangerine | 2 +- src/main.cpp | 149 +++++++++++++++++++++++--------------------------- 2 files changed, 68 insertions(+), 83 deletions(-) diff --git a/ext/tangerine b/ext/tangerine index 0821166..c3d5852 160000 --- a/ext/tangerine +++ b/ext/tangerine @@ -1 +1 @@ -Subproject commit 0821166a74a1db9e31d39cadd2eba47953a31a2d +Subproject commit c3d585201dbd134a833afb6c29d71c8d835a3192 diff --git a/src/main.cpp b/src/main.cpp index 06b36e6..00c29fb 100644 --- a/src/main.cpp +++ b/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);