/// <summary> /// Overridden function from MonoBehavior /// </summary> internal void Update() { if (!FlightDriver.Pause && canShowNodeEditor) { PatchedConicSolver solver = NodeTools.getSolver(); if (solver.maneuverNodes.Count > 0) { if (!curState.hasNode() || !solver.maneuverNodes.Contains(curState.node)) { // get the first one if we can't find the current or it's null curState = new NodeManager(solver.maneuverNodes[0]); } else if (curState.hasNode()) { curState.updateNode(); curState = curState.nextState(); } } else { if (curState.hasNode()) { curState = new NodeManager(); curState.resizeClockWindow = true; } } processKeyInput(); } intuitiveNodeGizmosManager.OnUpdate(); }
/// <summary> /// Draws the Conics window. /// </summary> /// <param name="id">Identifier.</param> public void drawConicsWindow(int id) { PatchedConicSolver solver = NodeTools.getSolver(); Color defaultColor = GUI.backgroundColor; GUILayout.BeginVertical(); // Conics mode controls GUILayout.BeginHorizontal(); GUILayout.Label("Conics mode: ", GUILayout.Width(100)); GUIParts.drawButton("0", (options.conicsMode == 0?Color.yellow:defaultColor), delegate() { options.setConicsMode(0); }); GUIParts.drawButton("1", (options.conicsMode == 1?Color.yellow:defaultColor), delegate() { options.setConicsMode(1); }); GUIParts.drawButton("2", (options.conicsMode == 2?Color.yellow:defaultColor), delegate() { options.setConicsMode(2); }); GUIParts.drawButton("3", (options.conicsMode == 3?Color.yellow:defaultColor), delegate() { options.setConicsMode(3); }); GUIParts.drawButton("4", (options.conicsMode == 4?Color.yellow:defaultColor), delegate() { options.setConicsMode(4); }); GUILayout.EndHorizontal(); // conics patch limit editor. GUILayout.BeginHorizontal(); GUILayout.Label("Change Conics Samples", GUILayout.Width(200)); GUIParts.drawButton("-", Color.red, delegate() { solver.DecreasePatchLimit(); }); GUIParts.drawButton("+", Color.red, delegate() { solver.IncreasePatchLimit(); }); GUILayout.EndHorizontal(); GUILayout.EndVertical(); GUI.DragWindow(); }
private void drawTripWindow() { PatchedConicSolver solver = NodeTools.getSolver(); GUILayout.BeginVertical(); if (solver.maneuverNodes.Count < 1) { GUILayout.BeginHorizontal(); GUILayout.Label("No nodes to show.", GUILayout.Width(200)); GUILayout.EndHorizontal(); } else { double total = 0.0; double timeNow = Planetarium.GetUniversalTime(); GUILayout.BeginHorizontal(); GUILayout.Label("", GUILayout.Width(60)); GUILayout.Label("Δv", GUILayout.Width(90)); GUILayout.Label("Time Until", GUILayout.Width(200)); GUILayout.Label("", GUILayout.Width(120)); GUILayout.EndHorizontal(); foreach (ManeuverNode curNode in solver.maneuverNodes) { int idx = solver.maneuverNodes.IndexOf(curNode); double timeDiff = curNode.UT - timeNow; GUILayout.BeginHorizontal(); GUILayout.Label("Node " + (idx + 1), GUILayout.Width(60)); GUILayout.Label(curNode.DeltaV.magnitude.ToString("F2") + " m/s", GUILayout.Width(90)); GUILayout.Label(timeDiff.convertUTtoHumanDuration(), GUILayout.Width(200)); if (idx > 0) { GUIParts.drawButton("▲ Merge", Color.white, () => { // schedule for next layout pass to not mess up maneuver nodes while iterating over them scheduledForLayout.Add(() => { solver.maneuverNodes[idx].mergeNodeDown(); }); }); } GUILayout.EndHorizontal(); total += curNode.DeltaV.magnitude; } GUILayout.BeginHorizontal(); GUILayout.Label("Total", GUILayout.Width(60)); GUILayout.Label(total.ToString("F2") + " m/s", GUILayout.Width(90)); GUILayout.Label("", GUILayout.Width(200)); GUILayout.EndHorizontal(); } GUILayout.EndVertical(); GUI.DragWindow(); }
// calculation function for mergeNodeDown private static Orbit findPreviousOrbit(this ManeuverNode n) { PatchedConicSolver p = NodeTools.getSolver(); int idx = p.maneuverNodes.IndexOf(n); if (idx > 0) { return(p.maneuverNodes[idx - 1].patch); } else { return(FlightGlobals.ActiveVessel.orbit); } }
public void drawTripWindow(int id) { PatchedConicSolver solver = NodeTools.getSolver(); GUILayout.BeginVertical(); if (solver.maneuverNodes.Count < 1) { GUILayout.BeginHorizontal(); GUILayout.Label("No nodes to show.", GUILayout.Width(200)); GUILayout.EndHorizontal(); } else { double total = 0.0; double timeNow = Planetarium.GetUniversalTime(); GUILayout.BeginHorizontal(); GUILayout.Label("", GUILayout.Width(60)); GUILayout.Label("Δv", GUILayout.Width(90)); GUILayout.Label("Time Until", GUILayout.Width(200)); GUILayout.Label("", GUILayout.Width(120)); GUILayout.EndHorizontal(); foreach (ManeuverNode curNode in solver.maneuverNodes) { int idx = solver.maneuverNodes.IndexOf(curNode); double timeDiff = curNode.UT - timeNow; GUILayout.BeginHorizontal(); GUILayout.Label("Node " + idx, GUILayout.Width(60)); GUILayout.Label(curNode.DeltaV.magnitude.ToString("F2") + "m/s", GUILayout.Width(90)); GUILayout.Label(NodeTools.convertUTtoHumanDuration(timeDiff), GUILayout.Width(200)); // these will be scheduled for during the next layout pass if (idx > 0) { GUIParts.drawButton("merge ▲", Color.white, delegate() { scheduledForLayout.Add(new Action(() => { NodeTools.mergeNodeDown(solver.maneuverNodes[idx]); })); }); } GUILayout.EndHorizontal(); total += curNode.DeltaV.magnitude; } GUILayout.BeginHorizontal(); GUILayout.Label("Total", GUILayout.Width(60)); GUILayout.Label(total.ToString("F2") + "m/s", GUILayout.Width(90)); GUILayout.Label("", GUILayout.Width(200)); GUILayout.EndHorizontal(); } GUILayout.EndVertical(); GUI.DragWindow(); }
private void drawManeuverPager() { PatchedConicSolver solver = NodeTools.getSolver(); int idx = solver.maneuverNodes.IndexOf(curState.node); int count = solver.maneuverNodes.Count; GUILayout.BeginHorizontal(); GUI.enabled = count > 1; if (GUILayout.Button("◀")) { if (idx > 0) { curState.nextNode = solver.maneuverNodes[idx - 1]; } else { curState.nextNode = solver.maneuverNodes[count - 1]; } curState.clearMemory(); } GUI.enabled = true; if (GUILayout.Button("Node " + (idx + 1))) { MapView.MapCamera.SetTarget(curState.node.scaledSpaceTarget); } GUIParts.drawButton("Del", Color.red, () => { curState.node.RemoveSelf(); //solver.RemoveManeuverNode(curState.node); curState.clearMemory(); }); GUI.enabled = count > 1; if (GUILayout.Button("▶")) { if (idx < (count - 1)) { curState.nextNode = solver.maneuverNodes[idx + 1]; } else { curState.nextNode = solver.maneuverNodes[0]; } curState.clearMemory(); } GUI.enabled = true; GUILayout.EndHorizontal(); }
internal void FixedUpdate() { if (!FlightDriver.Pause) { PatchedConicSolver solver = NodeTools.getSolver(); if (options.removeUsedNodes && solver.maneuverNodes.Count > 0) { ManeuverNode node = solver.maneuverNodes[0]; if (node.GetBurnVector(FlightGlobals.ActiveVessel.orbit).magnitude < options.usedNodeThreshold) { solver.RemoveManeuverNode(node); //TODO: Clean up states after removing the node. } } } }
private void UpdateIntuitiveManeuverHandlersList() { PatchedConicSolver solver = NodeTools.getSolver(); if (solver != null) { List <ManeuverNode> nodes = solver.maneuverNodes; for (int i = 0; i < nodes.Count; i++) { ManeuverNode node = nodes[i]; if ((node.attachedGizmo != null) && !isHandled(node)) { this.maneuverGizmoHandlers.Add(new IntuitiveNodeGizmoHandler(this, node, options)); } } } }
public static void drawManeuverPager(NodeManager curState) { PatchedConicSolver solver = NodeTools.getSolver(); GUILayout.BeginHorizontal(); if (GUILayout.Button("<")) { int count = solver.maneuverNodes.Count; if (count > 1) { // get the previous or last node int idx = solver.maneuverNodes.IndexOf(curState.node); if (idx == 0) { curState.nextNode = solver.maneuverNodes[--count]; } else { curState.nextNode = solver.maneuverNodes[--idx]; } } } if (GUILayout.Button("Editing Node " + (solver.maneuverNodes.IndexOf(curState.node) + 1))) { MapView.MapCamera.SetTarget(curState.node.scaledSpaceTarget); } if (GUILayout.Button(">")) { int count = solver.maneuverNodes.Count; if (count > 1) { // get the previous or last node int idx = solver.maneuverNodes.IndexOf(curState.node); if (idx == count - 1) { curState.nextNode = solver.maneuverNodes[0]; } else { curState.nextNode = solver.maneuverNodes[++idx]; } } } GUILayout.EndHorizontal(); }
/// <summary> /// Merges the given node into the next lowest node (n's index - 1). If there is no lower node, does nothing. /// </summary> /// <param name="n">The ManeuverNode to merge down.</param> internal static void mergeNodeDown(this ManeuverNode n) { PatchedConicSolver p = NodeTools.getSolver(); Orbit o = FlightGlobals.ActiveVessel.orbit; int nodes = p.maneuverNodes.Count; int idx = p.maneuverNodes.IndexOf(n); // if we're the last or only node, don't bother. if (idx == 0 || nodes < 2) { return; } ManeuverNode mergeInto = p.maneuverNodes[idx - 1]; Vector3d deltaV = mergeBurnVectors(mergeInto.UT, mergeInto, n.patch); mergeInto.OnGizmoUpdated(deltaV, mergeInto.UT); p.maneuverNodes.Remove(n); }
internal static void drawConicsControls(PreciseNodeOptions options) { PatchedConicSolver solver = NodeTools.getSolver(); Color defaultColor = GUI.backgroundColor; // Conics mode controls GUILayout.BeginHorizontal(); GUILayout.Label("Conics mode: ", GUILayout.Width(100)); for (int mode = 0; mode <= 4; mode++) { drawButton(mode.ToString(), (options.conicsMode == mode) ? Color.yellow : defaultColor, () => { options.setConicsMode(mode); }); } GUILayout.EndHorizontal(); // conics patch limit editor. GUILayout.BeginHorizontal(); GUILayout.Label("Change conics samples:", GUILayout.Width(200)); drawPlusMinusButtons(solver.IncreasePatchLimit, solver.DecreasePatchLimit); GUILayout.EndHorizontal(); }
/// <summary> /// Draws the Clock window. /// </summary> private void drawClockWindow() { Color defaultColor = GUI.backgroundColor; double timeNow = Planetarium.GetUniversalTime(); String timeUT = timeNow.ToString("F0"); String timeHuman = timeNow.convertUTtoHumanTime(); GUILayout.BeginVertical(); GUIParts.drawDoubleLabel("Time:", 35, timeHuman, 150); GUIParts.drawDoubleLabel("UT:", 35, Math.Floor(timeNow).ToString("F0"), 150); if (showTimeNext) { double next = 0.0; string labelText = ""; if (NodeTools.getSolver().maneuverNodes.Count > 0) { // protection from index out of range errors. // should probably handle this better. next = timeNow - NodeTools.getSolver().maneuverNodes[0].UT; } if (next < 0) { labelText = "T-" + next.convertUTtoHumanDuration(); } else { labelText = "T+" + next.convertUTtoHumanDuration(); } GUIParts.drawDoubleLabel("Next:", 35, labelText, 150); } GUILayout.EndVertical(); GUI.DragWindow(); }
/// <summary> /// Draws the Node Editor window. /// </summary> private void drawMainWindow() { Color defaultColor = GUI.backgroundColor; Color contentColor = GUI.contentColor; Color curColor = defaultColor; PatchedConicSolver solver = NodeTools.getSolver(); // Options button if (showOptions) { GUI.backgroundColor = Color.green; } if (GUI.Button(new Rect(options.mainWindowPos.width - 48, 2, 22, 18), "O")) { showOptions = !showOptions; } GUI.backgroundColor = defaultColor; // Keymapping button if (showKeymapper) { GUI.backgroundColor = Color.green; } if (GUI.Button(new Rect(options.mainWindowPos.width - 24, 2, 22, 18), "K")) { showKeymapper = !showKeymapper; } GUI.backgroundColor = defaultColor; GUILayout.BeginVertical(); if (options.showManeuverPager) { drawManeuverPager(); } // Human-readable time GUIParts.drawDoubleLabel("Time:", 100, curState.currentUT().convertUTtoHumanTime(), 150); // Increment buttons GUILayout.BeginHorizontal(); GUILayout.Label("Increment:", GUILayout.Width(100)); GUIParts.drawButton("0.01", (options.increment == 0.01?Color.yellow:defaultColor), () => { options.increment = 0.01; }); GUIParts.drawButton("0.1", (options.increment == 0.1?Color.yellow:defaultColor), () => { options.increment = 0.1; }); GUIParts.drawButton("1", (options.increment == 1?Color.yellow:defaultColor), () => { options.increment = 1; }); GUIParts.drawButton("10", (options.increment == 10?Color.yellow:defaultColor), () => { options.increment = 10; }); GUIParts.drawButton("100", (options.increment == 100?Color.yellow:defaultColor), () => { options.increment = 100; }); GUILayout.EndHorizontal(); drawTimeControls(contentColor); GUILayout.BeginHorizontal(); GUILayout.BeginVertical(); drawProgradeControls(contentColor); drawNormalControls(contentColor); drawRadialControls(contentColor); GUILayout.EndVertical(); GUILayout.BeginVertical(GUILayout.ExpandHeight(true)); GUIParts.drawButton("MS", defaultColor, () => { curState.memorize(); }, GUILayout.ExpandHeight(true)); GUI.enabled = curState.HasMemorized; GUIParts.drawButton("MR", defaultColor, () => { curState.recallMemory(); }, GUILayout.ExpandHeight(true)); GUI.enabled = true; GUILayout.EndVertical(); GUILayout.EndHorizontal(); // total delta-V display GUIParts.drawDoubleLabel("Total Δv:", 100, curState.currentMagnitude().ToString("0.##") + " m/s", 130); drawEAngle(); drawEncounter(defaultColor); // Conics mode controls if (options.showConics) { GUIParts.drawConicsControls(options); } // trip info button and vessel focus buttons GUILayout.BeginHorizontal(); GUIParts.drawButton("Trip Info", (options.showTrip?Color.yellow:defaultColor), () => { options.showTrip = !options.showTrip; }); GUIParts.drawButton("Focus on Vessel", defaultColor, () => { MapObject mapObject = PlanetariumCamera.fetch.targets.Find(o => (o.vessel != null) && o.vessel.Equals(FlightGlobals.ActiveVessel)); MapView.MapCamera.SetTarget(mapObject); }); GUILayout.EndHorizontal(); GUILayout.EndVertical(); GUI.DragWindow(); }
/// <summary> /// Draws the Node Editor window. /// </summary> /// <param name="id">Identifier.</param> public void drawMainWindow(int id) { Color defaultColor = GUI.backgroundColor; Color contentColor = GUI.contentColor; Color curColor = defaultColor; PatchedConicSolver solver = NodeTools.getSolver(); // Options button if (showOptions) { GUI.backgroundColor = Color.green; } if (GUI.Button(new Rect(options.mainWindowPos.width - 48, 2, 22, 18), "O")) { showOptions = !showOptions; } GUI.backgroundColor = defaultColor; // Keymapping button if (showKeymapper) { GUI.backgroundColor = Color.green; } if (GUI.Button(new Rect(options.mainWindowPos.width - 24, 2, 22, 18), "K")) { showKeymapper = !showKeymapper; } GUI.backgroundColor = defaultColor; GUILayout.BeginVertical(); if (options.showManeuverPager) { GUIParts.drawManeuverPager(curState); } // Human-readable time GUIParts.drawDoubleLabel("Time:", 100, NodeTools.convertUTtoHumanTime(curState.currentUT()), 130); // Increment buttons GUILayout.BeginHorizontal(); GUILayout.Label("Increment:", GUILayout.Width(100)); GUIParts.drawButton("0.01", (options.increment == 0.01?Color.yellow:defaultColor), delegate() { options.increment = 0.01; }); GUIParts.drawButton("0.1", (options.increment == 0.1?Color.yellow:defaultColor), delegate() { options.increment = 0.1; }); GUIParts.drawButton("1", (options.increment == 1?Color.yellow:defaultColor), delegate() { options.increment = 1; }); GUIParts.drawButton("10", (options.increment == 10?Color.yellow:defaultColor), delegate() { options.increment = 10; }); GUIParts.drawButton("100", (options.increment == 100?Color.yellow:defaultColor), delegate() { options.increment = 100; }); GUILayout.EndHorizontal(); drawTimeControls(contentColor); drawProgradeControls(contentColor); drawNormalControls(contentColor); drawRadialControls(contentColor); // total delta-V display GUIParts.drawDoubleLabel("Total delta-V:", 100, curState.currentMagnitude().ToString("0.##") + "m/s", 130); drawEAngle(); drawEncounter(defaultColor); // Conics mode controls GUILayout.BeginHorizontal(); GUILayout.Label("Conics mode: ", GUILayout.Width(100)); GUIParts.drawButton("0", (options.conicsMode == 0?Color.yellow:defaultColor), delegate() { options.setConicsMode(0); }); GUIParts.drawButton("1", (options.conicsMode == 1?Color.yellow:defaultColor), delegate() { options.setConicsMode(1); }); GUIParts.drawButton("2", (options.conicsMode == 2?Color.yellow:defaultColor), delegate() { options.setConicsMode(2); }); GUIParts.drawButton("3", (options.conicsMode == 3?Color.yellow:defaultColor), delegate() { options.setConicsMode(3); }); GUIParts.drawButton("4", (options.conicsMode == 4?Color.yellow:defaultColor), delegate() { options.setConicsMode(4); }); GUILayout.EndHorizontal(); // conics patch limit editor. GUILayout.BeginHorizontal(); GUILayout.Label("Change Conics Samples", GUILayout.Width(200)); GUIParts.drawButton("-", Color.red, delegate() { solver.DecreasePatchLimit(); }); GUIParts.drawButton("+", Color.red, delegate() { solver.IncreasePatchLimit(); }); GUILayout.EndHorizontal(); // trip info button and vessel focus buttons GUILayout.BeginHorizontal(); GUIParts.drawButton("Trip Info", (options.showTrip?Color.yellow:defaultColor), delegate() { options.showTrip = !options.showTrip; }); GUIParts.drawButton("Focus on Vessel", defaultColor, delegate() { MapView.MapCamera.SetTarget(FlightGlobals.ActiveVessel.vesselName); }); GUILayout.EndHorizontal(); GUILayout.EndVertical(); GUI.DragWindow(); }