VOID_StageInfo: Added a toggle to use sea level conditions in VesselSimulator calcs.
VOID_StageInfo: Added a toggle to use sea level conditions in VesselSimulator calcs.

// VOID © 2014 toadicus // VOID © 2014 toadicus
// //
// This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License. To view a // This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License. To view a
// copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/3.0/ // copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/3.0/
   
using KerbalEngineer.VesselSimulator; using KerbalEngineer.VesselSimulator;
using KSP; using KSP;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using ToadicusTools; using ToadicusTools;
using UnityEngine; using UnityEngine;
   
namespace VOID namespace VOID
{ {
[VOID_Scenes(GameScenes.EDITOR, GameScenes.FLIGHT)] [VOID_Scenes(GameScenes.EDITOR, GameScenes.FLIGHT)]
public class VOID_StageInfo : VOID_WindowModule public class VOID_StageInfo : VOID_WindowModule
{ {
private Table stageTable; private Table stageTable;
   
private Table.Column<int> stageNumberCol; private Table.Column<int> stageNumberCol;
private Table.Column<double> stageDeltaVCol; private Table.Column<double> stageDeltaVCol;
private Table.Column<double> stageTotalDVCol; private Table.Column<double> stageTotalDVCol;
private Table.Column<double> stageInvertDVCol; private Table.Column<double> stageInvertDVCol;
private Table.Column<double> stageMassCol; private Table.Column<double> stageMassCol;
private Table.Column<double> stageTotalMassCol; private Table.Column<double> stageTotalMassCol;
private Table.Column<double> stageThrustCol; private Table.Column<double> stageThrustCol;
private Table.Column<double> stageTWRCol; private Table.Column<double> stageTWRCol;
private Table.Column<string> stageTimeCol; private Table.Column<string> stageTimeCol;
   
private bool stylesApplied; private bool stylesApplied;
   
private bool showBodyList; private bool showBodyList;
private Rect bodyListPos; private Rect bodyListPos;
   
private bool showColumnSelection; private bool showColumnSelection;
   
private CelestialBody selectedBody; private CelestialBody selectedBody;
[AVOID_SaveValue("bodyIdx")] [AVOID_SaveValue("bodyIdx")]
private VOID_SaveValue<int> bodyIdx; private VOID_SaveValue<int> bodyIdx;
private int lastIdx; private int lastIdx;
   
  private bool showAdvanced;
   
  [AVOID_SaveValue("UseSealLevel")]
  private VOID_SaveValue<bool> useSeaLevel;
  private GUIContent seaLevelToggle;
   
public VOID_StageInfo() : base() public VOID_StageInfo() : base()
{ {
this.Name = "Stage Information"; this.Name = "Stage Information";
this.defWidth = 20f; this.defWidth = 20f;
this.bodyIdx = 4; this.bodyIdx = 4;
   
this.stylesApplied = false; this.stylesApplied = false;
this.showBodyList = false; this.showBodyList = false;
this.showColumnSelection = false; this.showColumnSelection = false;
   
this.bodyListPos = new Rect(); this.bodyListPos = new Rect();
   
this.stageTable = new Table(); this.stageTable = new Table();
   
this.stageNumberCol = new Table.Column<int>("Stage", 20f); this.stageNumberCol = new Table.Column<int>("Stage", 20f);
this.stageTable.Add(this.stageNumberCol); this.stageTable.Add(this.stageNumberCol);
   
this.stageDeltaVCol = new Table.Column<double>("DeltaV [m/s]", 20f); this.stageDeltaVCol = new Table.Column<double>("DeltaV [m/s]", 20f);
this.stageDeltaVCol.Format = "S2"; this.stageDeltaVCol.Format = "S2";
this.stageTable.Add(this.stageDeltaVCol); this.stageTable.Add(this.stageDeltaVCol);
   
this.stageTotalDVCol = new Table.Column<double>("Total ΔV [m/s]", 20f); this.stageTotalDVCol = new Table.Column<double>("Total ΔV [m/s]", 20f);
this.stageTotalDVCol.Format = "S2"; this.stageTotalDVCol.Format = "S2";
this.stageTable.Add(this.stageTotalDVCol); this.stageTable.Add(this.stageTotalDVCol);
   
this.stageInvertDVCol = new Table.Column<double>("Invert ΔV [m/s]", 20f); this.stageInvertDVCol = new Table.Column<double>("Invert ΔV [m/s]", 20f);
this.stageInvertDVCol.Format = "S2"; this.stageInvertDVCol.Format = "S2";
this.stageTable.Add(this.stageInvertDVCol); this.stageTable.Add(this.stageInvertDVCol);
   
this.stageMassCol = new Table.Column<double>("Mass [Mg]", 20f); this.stageMassCol = new Table.Column<double>("Mass [Mg]", 20f);
this.stageMassCol.Format = "#.#"; this.stageMassCol.Format = "#.#";
this.stageTable.Add(this.stageMassCol); this.stageTable.Add(this.stageMassCol);
   
this.stageTotalMassCol = new Table.Column<double>("Total [Mg]", 20f); this.stageTotalMassCol = new Table.Column<double>("Total [Mg]", 20f);
this.stageTotalMassCol.Format = "#.#"; this.stageTotalMassCol.Format = "#.#";
this.stageTable.Add(this.stageTotalMassCol); this.stageTable.Add(this.stageTotalMassCol);
   
this.stageThrustCol = new Table.Column<double>("Thrust [N]", 20f); this.stageThrustCol = new Table.Column<double>("Thrust [N]", 20f);
this.stageThrustCol.Format = "S2"; this.stageThrustCol.Format = "S2";
this.stageTable.Add(this.stageThrustCol); this.stageTable.Add(this.stageThrustCol);
   
this.stageTWRCol = new Table.Column<double>("T/W Ratio", 20f); this.stageTWRCol = new Table.Column<double>("T/W Ratio", 20f);
this.stageTWRCol.Format = "#.#"; this.stageTWRCol.Format = "#.#";
this.stageTable.Add(this.stageTWRCol); this.stageTable.Add(this.stageTWRCol);
   
this.stageTimeCol = new Table.Column<string>("Burn Time", 20f); this.stageTimeCol = new Table.Column<string>("Burn Time", 20f);
this.stageTable.Add(this.stageTimeCol); this.stageTable.Add(this.stageTimeCol);
   
  this.showAdvanced = false;
   
  this.useSeaLevel = false;
   
  seaLevelToggle = new GUIContent(
  "Use Sea Level",
  "Use 'sea' level atmospheric conditions on bodies with atmospheres."
  );
} }
   
public override void DrawGUI() public override void DrawGUI()
{ {
base.DrawGUI(); base.DrawGUI();
   
if (this.showBodyList) if (this.showBodyList)
{ {
GUILayout.Window(core.windowID, this.bodyListPos, this.BodyPickerWindow, string.Empty); GUILayout.Window(core.windowID, this.bodyListPos, this.BodyPickerWindow, string.Empty);
} }
} }
   
public override void ModuleWindow(int _) public override void ModuleWindow(int _)
{ {
  if (this.selectedBody == null)
  {
  this.selectedBody = core.HomeBody;
  }
   
if ( if (
!HighLogic.LoadedSceneIsFlight || !HighLogic.LoadedSceneIsFlight ||
(TimeWarp.WarpMode == TimeWarp.Modes.LOW) || (TimeWarp.WarpMode == TimeWarp.Modes.LOW) ||
(TimeWarp.CurrentRate <= TimeWarp.MaxPhysicsRate) (TimeWarp.CurrentRate <= TimeWarp.MaxPhysicsRate)
) )
{ {
KerbalEngineer.VesselSimulator.SimManager.RequestSimulation(); KerbalEngineer.VesselSimulator.SimManager.RequestSimulation();
} }
   
if (!this.stylesApplied) if (!this.stylesApplied)
{ {
this.stageTable.ApplyCellStyle(VOID_Styles.labelCenter); this.stageTable.ApplyCellStyle(VOID_Styles.labelCenter);
this.stageTable.ApplyHeaderStyle(VOID_Styles.labelCenterBold); this.stageTable.ApplyHeaderStyle(VOID_Styles.labelCenterBold);
} }
   
this.stageTable.ClearColumns(); this.stageTable.ClearColumns();
   
if (core.Stages == null || core.Stages.Length == 0) if (core.Stages == null || core.Stages.Length == 0)
{ {
GUILayout.BeginVertical(); GUILayout.BeginVertical();
   
GUILayout.Label("No stage data!"); GUILayout.Label("No stage data!");
   
GUILayout.EndVertical(); GUILayout.EndVertical();
   
return; return;
} }
   
  if (HighLogic.LoadedSceneIsEditor && this.selectedBody.atmosphere && this.useSeaLevel)
  {
  SimManager.Atmosphere = this.selectedBody.atmosphereMultiplier * 101.325d;
  }
  else
  {
  SimManager.Atmosphere = 0d;
  }
   
foreach (Stage stage in core.Stages) foreach (Stage stage in core.Stages)
{ {
if (stage.deltaV == 0 && stage.mass == 0) if (stage.deltaV == 0 && stage.mass == 0)
{ {
continue; continue;
} }
   
this.stageNumberCol.Add(stage.number); this.stageNumberCol.Add(stage.number);
   
this.stageDeltaVCol.Add(stage.deltaV); this.stageDeltaVCol.Add(stage.deltaV);
this.stageTotalDVCol.Add(stage.totalDeltaV); this.stageTotalDVCol.Add(stage.totalDeltaV);
this.stageInvertDVCol.Add(stage.inverseTotalDeltaV); this.stageInvertDVCol.Add(stage.inverseTotalDeltaV);
   
this.stageMassCol.Add(stage.mass); this.stageMassCol.Add(stage.mass);
this.stageTotalMassCol.Add(stage.totalMass); this.stageTotalMassCol.Add(stage.totalMass);
   
this.stageThrustCol.Add(stage.thrust * 1000f); this.stageThrustCol.Add(stage.thrust * 1000f);
this.stageTWRCol.Add(stage.thrustToWeight / (this.selectedBody ?? core.HomeBody).GeeASL); this.stageTWRCol.Add(stage.thrustToWeight / (this.selectedBody ?? core.HomeBody).GeeASL);
   
this.stageTimeCol.Add(VOID_Tools.FormatInterval(stage.time)); this.stageTimeCol.Add(VOID_Tools.FormatInterval(stage.time));
} }
   
this.stageTable.Render(); this.stageTable.Render();
   
if (core.sortedBodyList != null) if (core.sortedBodyList != null)
{ {
GUILayout.BeginHorizontal(); GUILayout.BeginHorizontal();
   
if (GUILayout.Button("◄")) if (GUILayout.Button("◄"))
{ {
this.bodyIdx--; this.bodyIdx--;
} }
   
this.showBodyList = GUILayout.Toggle( this.showBodyList = GUILayout.Toggle(
this.showBodyList, this.showBodyList,
(this.selectedBody ?? core.HomeBody).bodyName, (this.selectedBody ?? core.HomeBody).bodyName,
GUI.skin.button GUI.skin.button
); );
   
Rect bodyButtonPos = GUILayoutUtility.GetLastRect(); Rect bodyButtonPos = GUILayoutUtility.GetLastRect();
   
if (Event.current.type == EventType.Repaint) if (Event.current.type == EventType.Repaint)
{ {
this.bodyListPos.width = bodyButtonPos.width; this.bodyListPos.width = bodyButtonPos.width;
this.bodyListPos.x = bodyButtonPos.xMin + this.WindowPos.xMin; this.bodyListPos.x = bodyButtonPos.xMin + this.WindowPos.xMin;
this.bodyListPos.y = bodyButtonPos.yMax + this.WindowPos.yMin; this.bodyListPos.y = bodyButtonPos.yMax + this.WindowPos.yMin;
} }
   
if (GUILayout.Button("►")) if (GUILayout.Button("►"))
{ {
this.bodyIdx++; this.bodyIdx++;
} }
   
this.bodyIdx %= core.sortedBodyList.Count; this.bodyIdx %= core.sortedBodyList.Count;
   
if (this.bodyIdx < 0) if (this.bodyIdx < 0)
{ {
this.bodyIdx += core.sortedBodyList.Count; this.bodyIdx += core.sortedBodyList.Count;
} }
   
if (this.lastIdx != this.bodyIdx) if (this.lastIdx != this.bodyIdx)
{ {
this.lastIdx = this.bodyIdx; this.lastIdx = this.bodyIdx;
this.selectedBody = core.sortedBodyList[this.bodyIdx]; this.selectedBody = core.sortedBodyList[this.bodyIdx];
} }
   
  if (HighLogic.LoadedSceneIsEditor)
  {
  if (
  GUILayout.Button(
  this.showAdvanced ? "▲" : "▼",
  GUILayout.ExpandWidth(false)
  )
  )
  {
  this.showAdvanced = !this.showAdvanced;
  }
  }
   
  GUILayout.EndHorizontal();
  }
   
  if (this.showAdvanced && HighLogic.LoadedSceneIsEditor)
  {
  GUILayout.BeginHorizontal();
   
  this.useSeaLevel.value = GUITools.Toggle(this.useSeaLevel, this.seaLevelToggle, false);
   
GUILayout.EndHorizontal(); GUILayout.EndHorizontal();
} }
   
GUILayout.BeginHorizontal(); GUILayout.BeginHorizontal();
   
if ( if (
GUILayout.Button("Engineering data powered by <i>VesselSimulator from KER</i>.", GUILayout.Button("Engineering data powered by <i>VesselSimulator from KER</i>.",
VOID_Styles.labelLink) VOID_Styles.labelLink)
) )
{ {
Application.OpenURL("http://forum.kerbalspaceprogram.com/threads/18230"); Application.OpenURL("http://forum.kerbalspaceprogram.com/threads/18230");
} }
   
GUILayout.EndHorizontal(); GUILayout.EndHorizontal();
   
GUI.DragWindow(); GUI.DragWindow();
} }
   
public override void DrawConfigurables() public override void DrawConfigurables()
{ {
this.showColumnSelection = GUILayout.Toggle( this.showColumnSelection = GUILayout.Toggle(
this.showColumnSelection, this.showColumnSelection,
"Select StageInfo Columns", "Select StageInfo Columns",
GUI.skin.button GUI.skin.button
); );
} }
   
private void BodyPickerWindow(int _) private void BodyPickerWindow(int _)
{ {
foreach (CelestialBody body in core.sortedBodyList) foreach (CelestialBody body in core.sortedBodyList)
{ {
if (GUILayout.Button(body.bodyName, VOID_Styles.labelDefault)) if (GUILayout.Button(body.bodyName, VOID_Styles.labelDefault))
{ {
Debug.Log("Picked new body focus: " + body.bodyName); Debug.Log("Picked new body focus: " + body.bodyName);
this.bodyIdx = core.sortedBodyList.IndexOf(body); this.bodyIdx = core.sortedBodyList.IndexOf(body);
this.showBodyList = false; this.showBodyList = false;
} }
} }
} }
} }
} }