Browse Source

use ImpulseType enum in maneuver functions

main
cinnaboot 4 years ago
parent
commit
5b0f556b19
  1. 43
      src/game.cpp
  2. 15
      src/game.h
  3. 3
      src/gooey.cpp
  4. 3
      src/main.cpp

43
src/game.cpp

@ -126,18 +126,18 @@ selectOrbit(GameState* gs, GameOrbit* orbit)
bool bool
addManeuver(GameOrbit* orbit, addManeuver(GameOrbit* orbit,
double anomaly, ImpulseType impulse_type,
vec3 impulse_vector, double true_anomaly,
double impulse_delta_v) double impulse_delta_v)
{ {
assert(orbit); ManeuverNode& node = orbit->maneuver;
if (anomaly < -M_PI || anomaly > M_PI) { if (true_anomaly < -M_PI || true_anomaly > M_PI) {
LOGF(Error, "invalid true anomaly: %f\n", anomaly); LOGF(Error, "invalid true true_anomaly: %f\n", true_anomaly);
return false; return false;
} }
if (orbit->maneuver.active) { if (node.active) {
LOGF(Warning, "cannot add multiple maneuvers (yet)\n"); LOGF(Warning, "cannot add multiple maneuvers (yet)\n");
return false; return false;
} }
@ -147,21 +147,34 @@ addManeuver(GameOrbit* orbit,
return false; return false;
} }
orbit->maneuver.true_anomaly = anomaly; node.impulse_type = impulse_type;
//orbit->maneuver.impulse_vector = ... // TODO: thrust calculations
orbit->maneuver.impulse_delta_v = impulse_delta_v; //double flight_path_angle = orbit->system.sat.gamma;
orbit->maneuver.active = true; //node.impulse_vector.x = ...
if (node.impulse_type == ImpulseType::PROGRADE) {
LOGF(Debug, "adding prograde maneuver\n");
node.true_anomaly = true_anomaly;
node.impulse_delta_v = impulse_delta_v;
node.active = true;
return true; return true;
} }
LOGF(Warning, "failed to add maneuver\n");
assert(0);
return false;
}
void void
removeManeuver(GameOrbit* orbit) removeManeuver(GameOrbit* orbit)
{ {
assert(orbit);
// TODO: multiple maneuver nodes // TODO: multiple maneuver nodes
// NOTE: implicitly sets orbit->maneuver.active to false ManeuverNode& node = orbit->maneuver;
orbit->maneuver = {0}; node.impulse_type = ImpulseType::NONE;
node.true_anomaly = 0.f;
node.impulse_delta_v = 0.f;
node.active = false;
} }
// NOTE: test if the maneuver node would have occured between 2 orbit positions // NOTE: test if the maneuver node would have occured between 2 orbit positions
@ -194,7 +207,7 @@ applyManeuver(GameOrbit* orbit)
LOGF(Debug, "applying maneuver\n"); LOGF(Debug, "applying maneuver\n");
// FIXME: assuming prograde impulse vector // FIXME: assuming prograde impulse vector
assert(orbit->maneuver.impulse_type == ManeuverType::PROGRADE); assert(orbit->maneuver.impulse_type == ImpulseType::PROGRADE);
// re-calculate state vectors at the maneuver node // re-calculate state vectors at the maneuver node
TwoBodySystem& sys = orbit->system; TwoBodySystem& sys = orbit->system;
@ -223,8 +236,6 @@ applyManeuver(GameOrbit* orbit)
assert(utilCStrMatch(buf->name, "position")); assert(utilCStrMatch(buf->name, "position"));
assert(buf->data_size == orbit->e3d.vert_count * sizeof(vec3)); assert(buf->data_size == orbit->e3d.vert_count * sizeof(vec3));
updateGLBuffer(buf, orbit->e3d.vertices); updateGLBuffer(buf, orbit->e3d.vertices);
removeManeuver(orbit);
} }
// internal // internal

15
src/game.h

@ -19,8 +19,9 @@ struct Ellipse3D
uint vert_count; uint vert_count;
}; };
enum struct ManeuverType enum struct ImpulseType
{ {
NONE,
PROGRADE, PROGRADE,
RETROGRADE, RETROGRADE,
INCLINATION_CHANGE, INCLINATION_CHANGE,
@ -31,13 +32,13 @@ enum struct ManeuverType
struct ManeuverNode struct ManeuverNode
{ {
ImpulseType impulse_type;
double true_anomaly; double true_anomaly;
vec3 impulse_vector;
ManeuverType impulse_type;
double impulse_delta_v; double impulse_delta_v;
// TODO: thrust calculations
bool active; bool active;
// TODO: thrust calculations
//vec3 impulse_vector;
}; };
struct GameOrbit struct GameOrbit
@ -86,7 +87,9 @@ void ellipse3DUpdate(EllipseParameters ep, Ellipse3D& e3d);
void selectOrbit(GameState* gs, GameOrbit* orbit); void selectOrbit(GameState* gs, GameOrbit* orbit);
bool addManeuver(GameOrbit* orbit, double anomaly, vec3 impulse_vector, bool addManeuver(GameOrbit* orbit,
ImpulseType impulse_type,
double true_anomaly,
double impulse_delta_v); double impulse_delta_v);
void removeManeuver(GameOrbit* orbit); void removeManeuver(GameOrbit* orbit);

3
src/gooey.cpp

@ -249,6 +249,7 @@ drawManeuverWindow(GameState* gs)
SliderScalar("maneuver anomaly", ImGuiDataType_Double, &anom, SliderScalar("maneuver anomaly", ImGuiDataType_Double, &anom,
&min_anom, &max_anom, "%.19f"); &min_anom, &max_anom, "%.19f");
// FIXME: map ImpulseType to strings for UI
// select maneuver vector // select maneuver vector
const char* items[] = { const char* items[] = {
"prograde", "prograde",
@ -262,7 +263,7 @@ drawManeuverWindow(GameState* gs)
InputFloat("impulse dv, km/s", &dv, 0.1, 4.0, "%.1f"); InputFloat("impulse dv, km/s", &dv, 0.1, 4.0, "%.1f");
if (Button("apply")) { if (Button("apply")) {
if (!addManeuver(orbit, anom, vec3(), dv)) { if (!addManeuver(orbit, ImpulseType::PROGRADE, anom, dv)) {
// flash a color or something? // flash a color or something?
} }
} }

3
src/main.cpp

@ -205,7 +205,7 @@ loadScene(GameState* gs, RenderState* rs)
double a = 26564.5; // semi-major axis in km double a = 26564.5; // semi-major axis in km
double e = 0.7411; // eccentricity double e = 0.7411; // eccentricity
GameOrbit* go_1 = loadOrbit(gs, rs, body, orbitInit(a, e), rg, "sat_01"); GameOrbit* go_1 = loadOrbit(gs, rs, body, orbitInit(a, e), rg, "sat_01");
addManeuver(go_1, M_PI / 4, vec3(), 0.1); addManeuver(go_1, ImpulseType::PROGRADE, M_PI / 4, 0.2);
double a_2 = r + 10000; double a_2 = r + 10000;
double e_2 = 0; double e_2 = 0;
@ -270,6 +270,7 @@ updateOrbit(GameOrbit* orbit, bool running, double time_step)
orbit->system.sat.theta)) orbit->system.sat.theta))
{ {
applyManeuver(orbit); applyManeuver(orbit);
removeManeuver(orbit);
} }
} }
} }

Loading…
Cancel
Save