From 5efd583d648db5c3e373f9a5a4a0491319811bd1 Mon Sep 17 00:00:00 2001 From: cinnaboot Date: Fri, 27 May 2022 13:59:12 -0400 Subject: [PATCH] add selectOrbit() game interface --- src/game.cpp | 57 +++++++++++++++++++++++++++++++-------------------- src/game.h | 2 +- src/gooey.cpp | 6 ++---- src/main.cpp | 10 +-------- 4 files changed, 39 insertions(+), 36 deletions(-) diff --git a/src/game.cpp b/src/game.cpp index 9af62a6..a3ab9ec 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -2,6 +2,13 @@ #include "game.h" +// forware declarations + +void changeOrbitColor(GameOrbit* orbit, vec3* color_data); + + +// interface + GameOrbit* getFreeOrbit(GameState* gs) { @@ -60,40 +67,46 @@ ellipse3DUpdate(EllipseParameters ep, Ellipse3D& e3d) } void -changeOrbitColor(GameOrbit* orbit, vec3* color_data) -{ - GLBuffer* color_buf; - GLMesh* gl_mesh = &orbit->ellipse_entity->meshes[0]; - - for (u32 i = 0; i < gl_mesh->num_vertex_attrib_buffers; i ++) { - if (utilCStrMatch(gl_mesh->vertex_attrib_buffers[i].name, "color")) - color_buf = &gl_mesh->vertex_attrib_buffers[i]; - } - - assert(color_buf && color_buf->data_size == orbit->e3d.vert_count * 3 * 4); - updateGLBuffer(color_buf, color_data); -} - -void -updateOrbitColors(GameOrbit* last_selected_orbit, GameOrbit* orbit) +selectOrbit(GameState* gs, GameOrbit* orbit) { assert(orbit && orbit->ellipse_entity); // FIXME: need to allocate these somewhere other than stack static vec3 selected_colors[DEFAULT_ORBIT_VERTICES]; - static vec3 default_colors[DEFAULT_ORBIT_VERTICES]; for (u32 i = 0; i < DEFAULT_ORBIT_VERTICES; i++) selected_colors[i] = SELECTED_ELLIPSE_COLOR; + static vec3 default_colors[DEFAULT_ORBIT_VERTICES]; + + for (u32 i = 0; i < DEFAULT_ORBIT_VERTICES; i++) + default_colors[i] = DEFAULT_ELLIPSE_COLOR; + + if (gs->last_selected_orbit != nullptr) { + changeOrbitColor(gs->last_selected_orbit, default_colors); + gs->last_selected_orbit->selected = false; + } + changeOrbitColor(orbit, selected_colors); + orbit->selected = true; + gs->last_selected_orbit = orbit; +} + - // repeat for last orbit - if (last_selected_orbit != nullptr) { - for (u32 i = 0; i < DEFAULT_ORBIT_VERTICES; i++) - default_colors[i] = DEFAULT_ELLIPSE_COLOR; +// internal + +void +changeOrbitColor(GameOrbit* orbit, vec3* color_data) +{ + GLBuffer* color_buf; + GLMesh* gl_mesh = &orbit->ellipse_entity->meshes[0]; - changeOrbitColor(last_selected_orbit, default_colors); + for (u32 i = 0; i < gl_mesh->num_vertex_attrib_buffers; i ++) { + if (utilCStrMatch(gl_mesh->vertex_attrib_buffers[i].name, "color")) + color_buf = &gl_mesh->vertex_attrib_buffers[i]; } + + assert(color_buf && color_buf->data_size == orbit->e3d.vert_count * 3 * 4); + updateGLBuffer(color_buf, color_data); } diff --git a/src/game.h b/src/game.h index a18a776..953d1a5 100644 --- a/src/game.h +++ b/src/game.h @@ -57,4 +57,4 @@ Ellipse3D ellipse3DInit(EllipseParameters ep, uint vert_count); void ellipse3DUpdate(EllipseParameters ep, Ellipse3D& e3d); -void updateOrbitColors(GameOrbit* last_selected_orbit, GameOrbit* orbit); +void selectOrbit(GameState* gs, GameOrbit* orbit); diff --git a/src/gooey.cpp b/src/gooey.cpp index 3ee0278..fa6b3dc 100644 --- a/src/gooey.cpp +++ b/src/gooey.cpp @@ -119,7 +119,7 @@ void drawOrbitWindow(GameState* gs) Text("Orbit Selection"); BeginChild("orbit selection", ImVec2(G_WIDTH - 20, 100), true); - static u32 selected = 0; + static u32 selected = UINT_MAX; for (u32 i = 0; i < gs->num_orbits; i++) { GameOrbit& orbit = gs->orbits[i]; @@ -131,9 +131,7 @@ void drawOrbitWindow(GameState* gs) if (Selectable(label, selected == i)) { selected = i; - orbit.selected = true; - } else { - orbit.selected = false; + selectOrbit(gs, &orbit); } } } diff --git a/src/main.cpp b/src/main.cpp index 01c06fd..682f02e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -199,10 +199,7 @@ loadScene(GameState* gs, RenderState* rs) double a = 26564.5; // semi-major axis in km double e = 0.7411; // eccentricity - GameOrbit* orbit_1 = loadOrbit(gs, rs, body, orbitInit(a, e), rg, "sat_01"); - // NOTE: set as selected orbit - updateOrbitColors(nullptr, orbit_1); - gs->last_selected_orbit = orbit_1; + loadOrbit(gs, rs, body, orbitInit(a, e), rg, "sat_01"); double a_2 = r + 10000; double e_2 = 0; @@ -294,11 +291,6 @@ preFrameCallback(RenderState* rs, void* user_data = nullptr) // TODO: update EllipseEntity per frame //updateOrbit(gs->system, ellipse_entity); } - - if (orbit.selected && &orbit != gs->last_selected_orbit) { - updateOrbitColors(gs->last_selected_orbit, &orbit); - gs->last_selected_orbit = &orbit; - } } } }