public override void OnModuleDisabled() { launchingToInterplanetary = false; launchingToPlane = false; launchingToRendezvous = false; MechJebModuleAscentPathEditor editor = core.GetComputerModule <MechJebModuleAscentPathEditor>(); if (editor != null) { editor.enabled = false; } }
public override void OnModuleDisabled() { if (core.target.NormalTargetExists && (core.target.Name == TARGET_NAME)) { core.target.Unset(); } launchingToPlane = false; launchingToRendezvous = false; MechJebModuleAscentPathEditor editor = core.GetComputerModule <MechJebModuleAscentPathEditor>(); if (editor != null) { editor.enabled = false; } }
protected override void WindowGUI(int windowID) { GUILayout.BeginVertical(); bool showingGuidance = (core.target.Target != null && core.target.Name == TARGET_NAME); if (showingGuidance) { GUILayout.Label("The purple circle on the navball points along the ascent path."); if (GUILayout.Button("Stop showing navball guidance")) { core.target.Unset(); } } else if (GUILayout.Button("Show navball ascent path guidance")) { core.target.SetDirectionTarget(TARGET_NAME); } if (autopilot != null) { if (autopilot.enabled) { if (GUILayout.Button("Disengage autopilot")) { autopilot.users.Remove(this); } } else { if (GUILayout.Button("Engage autopilot")) { autopilot.users.Add(this); } } ascentPath = autopilot.ascentPath; GuiUtils.SimpleTextBox("Orbit altitude", autopilot.desiredOrbitAltitude, "km"); autopilot.desiredInclination = desiredInclination; } GuiUtils.SimpleTextBox("Orbit inclination", desiredInclination, "º"); core.thrust.LimitToPreventOverheatsInfoItem(); core.thrust.LimitToTerminalVelocityInfoItem(); core.thrust.LimitAccelerationInfoItem(); core.thrust.LimitThrottleInfoItem(); GUILayout.BeginHorizontal(); autopilot.forceRoll = GUILayout.Toggle(autopilot.forceRoll, "Force Roll"); if (autopilot.forceRoll) { GuiUtils.SimpleTextBox("climb", autopilot.verticalRoll, "º", 30f); GuiUtils.SimpleTextBox("turn", autopilot.turnRoll, "º", 30f); } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUIStyle s = new GUIStyle(GUI.skin.toggle); if (autopilot.limitingAoA) { s.onHover.textColor = s.onNormal.textColor = Color.green; } autopilot.limitAoA = GUILayout.Toggle(autopilot.limitAoA, "Limit AoA to", s, GUILayout.ExpandWidth(true)); autopilot.maxAoA.text = GUILayout.TextField(autopilot.maxAoA.text, GUILayout.Width(30)); GUILayout.Label("º (" + autopilot.currentMaxAoA.ToString("F1") + "°)", GUILayout.ExpandWidth(true)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Space(25); if (autopilot.limitAoA) { GUIStyle sl = new GUIStyle(GUI.skin.label); if (autopilot.limitingAoA && vesselState.dynamicPressure < autopilot.aoALimitFadeoutPressure) { sl.normal.textColor = sl.hover.textColor = Color.green; } GuiUtils.SimpleTextBox("Dynamic Pressure Fadeout", autopilot.aoALimitFadeoutPressure, "pa", 50, sl); } GUILayout.EndHorizontal(); autopilot.correctiveSteering = GUILayout.Toggle(autopilot.correctiveSteering, "Corrective steering"); autopilot.autostage = GUILayout.Toggle(autopilot.autostage, "Autostage"); if (autopilot.autostage) { core.staging.AutostageSettingsInfoItem(); } autopilot.autodeploySolarPanels = GUILayout.Toggle(autopilot.autodeploySolarPanels, "Auto-deploy solar panels"); core.node.autowarp = GUILayout.Toggle(core.node.autowarp, "Auto-warp"); if (autopilot != null && vessel.LandedOrSplashed) { if (core.target.NormalTargetExists) { if (core.node.autowarp) { GUILayout.BeginHorizontal(); GUILayout.Label("Launch countdown:", GUILayout.ExpandWidth(true)); autopilot.warpCountDown.text = GUILayout.TextField(autopilot.warpCountDown.text, GUILayout.Width(60)); GUILayout.Label("s", GUILayout.ExpandWidth(false)); GUILayout.EndHorizontal(); } if (!launchingToPlane && !launchingToRendezvous && !launchingToInterplanetary) { GUILayout.BeginHorizontal(); if (GUILayout.Button("Launch to rendezvous:", GUILayout.ExpandWidth(false))) { launchingToRendezvous = true; autopilot.StartCountdown(vesselState.time + LaunchTiming.TimeToPhaseAngle(autopilot.launchPhaseAngle, mainBody, vesselState.longitude, core.target.TargetOrbit)); } autopilot.launchPhaseAngle.text = GUILayout.TextField(autopilot.launchPhaseAngle.text, GUILayout.Width(60)); GUILayout.Label("º", GUILayout.ExpandWidth(false)); GUILayout.EndHorizontal(); if (GUILayout.Button("Launch into plane of target")) { launchingToPlane = true; autopilot.StartCountdown(vesselState.time + LaunchTiming.TimeToPlane(mainBody, vesselState.latitude, vesselState.longitude, core.target.TargetOrbit)); } if (core.target.TargetOrbit.referenceBody == orbit.referenceBody.referenceBody) { if (GUILayout.Button("Launch at interplanetary window")) { launchingToInterplanetary = true; //compute the desired launch date OrbitalManeuverCalculator.DeltaVAndTimeForHohmannTransfer(mainBody.orbit, core.target.TargetOrbit, vesselState.time, out interplanetaryWindowUT); double desiredOrbitPeriod = 2 * Math.PI * Math.Sqrt(Math.Pow(mainBody.Radius + autopilot.desiredOrbitAltitude, 3) / mainBody.gravParameter); //launch just before the window, but don't try to launch in the past interplanetaryWindowUT -= 3 * desiredOrbitPeriod; interplanetaryWindowUT = Math.Max(vesselState.time + autopilot.warpCountDown, interplanetaryWindowUT); autopilot.StartCountdown(interplanetaryWindowUT); } } } } else { launchingToInterplanetary = launchingToPlane = launchingToRendezvous = false; GUILayout.Label("Select a target for a timed launch."); } if (launchingToInterplanetary || launchingToPlane || launchingToRendezvous) { string message = ""; if (launchingToInterplanetary) { message = "Launching at interplanetary window"; } else if (launchingToPlane) { desiredInclination = core.target.TargetOrbit.inclination; desiredInclination *= Math.Sign(Vector3d.Dot(core.target.TargetOrbit.SwappedOrbitNormal(), Vector3d.Cross(vesselState.CoM - mainBody.position, mainBody.transform.up))); message = "Launching to target plane"; } else if (launchingToRendezvous) { message = "Launching to rendezvous"; } if (autopilot.tMinus > 3 * vesselState.deltaT) { message += ": T-" + GuiUtils.TimeToDHMS(autopilot.tMinus, 1); } GUILayout.Label(message); if (GUILayout.Button("Abort")) { launchingToInterplanetary = launchingToPlane = launchingToRendezvous = autopilot.timedLaunch = false; } } } if (autopilot != null && autopilot.enabled) { GUILayout.Label("Autopilot status: " + autopilot.status); } if (!vessel.patchedConicsUnlocked()) { GUILayout.Label("Warning: MechJeb is unable to circularize without an upgraded Tracking Station."); } MechJebModuleAscentPathEditor editor = core.GetComputerModule <MechJebModuleAscentPathEditor>(); if (editor != null) { editor.enabled = GUILayout.Toggle(editor.enabled, "Edit ascent path"); } GUILayout.EndVertical(); base.WindowGUI(windowID); }
protected override void WindowGUI(int windowID) { GUILayout.BeginVertical(); bool showingGuidance = (core.target.Target != null && core.target.Name == TARGET_NAME); if (showingGuidance) { GUILayout.Label("The purple circle on the navball points along the ascent path."); if (GUILayout.Button("Stop showing navball guidance")) { core.target.Unset(); } } else if (GUILayout.Button("Show navball ascent path guidance")) { core.target.SetDirectionTarget(TARGET_NAME); } if (autopilot != null) { if (autopilot.enabled) { if (GUILayout.Button("Disengage autopilot")) { autopilot.users.Remove(this); } } else { if (GUILayout.Button("Engage autopilot")) { autopilot.users.Add(this); } } ascentPath = autopilot.ascentPath; GuiUtils.SimpleTextBox("Orbit altitude", autopilot.desiredOrbitAltitude, "km"); autopilot.desiredInclination = desiredInclination; } GuiUtils.SimpleTextBox("Orbit inclination", desiredInclination, "º"); core.thrust.limitToPreventOverheats = GUILayout.Toggle(core.thrust.limitToPreventOverheats, "Prevent overheats"); core.thrust.limitToTerminalVelocity = GUILayout.Toggle(core.thrust.limitToTerminalVelocity, "Limit to terminal velocity"); GUILayout.BeginHorizontal(); core.thrust.limitAcceleration = GUILayout.Toggle(core.thrust.limitAcceleration, "Limit acceleration to", GUILayout.ExpandWidth(false)); core.thrust.maxAcceleration.text = GUILayout.TextField(core.thrust.maxAcceleration.text, GUILayout.ExpandWidth(true)); GUILayout.Label("m/s²", GUILayout.ExpandWidth(false)); GUILayout.EndHorizontal(); autopilot.correctiveSteering = GUILayout.Toggle(autopilot.correctiveSteering, "Corrective steering"); core.staging.AutostageInfoItem(); core.node.autowarp = GUILayout.Toggle(core.node.autowarp, "Auto-warp"); if (autopilot != null && vessel.LandedOrSplashed) { if (core.target.NormalTargetExists) { if (!launchingToPlane && !launchingToRendezvous) { GUILayout.BeginHorizontal(); if (GUILayout.Button("Launch to rendezvous:", GUILayout.ExpandWidth(false))) { launchingToRendezvous = true; } autopilot.launchPhaseAngle.text = GUILayout.TextField(autopilot.launchPhaseAngle.text, GUILayout.Width(60)); GUILayout.Label("º", GUILayout.ExpandWidth(false)); GUILayout.EndHorizontal(); } if (!launchingToPlane && !launchingToRendezvous && GUILayout.Button("Launch into plane of target")) { launchingToPlane = true; } } else { launchingToPlane = launchingToRendezvous = false; GUILayout.Label("Select a target for a timed launch."); } if (launchingToPlane || launchingToRendezvous) { double tMinus; if (launchingToPlane) { tMinus = LaunchTiming.TimeToPlane(mainBody, vesselState.latitude, vesselState.longitude, core.target.Orbit); } else { tMinus = LaunchTiming.TimeToPhaseAngle(autopilot.launchPhaseAngle, mainBody, vesselState.longitude, core.target.Orbit); } double launchTime = vesselState.time + tMinus; core.warp.WarpToUT(launchTime); if (launchingToPlane) { desiredInclination = core.target.Orbit.inclination; desiredInclination *= Math.Sign(Vector3d.Dot(core.target.Orbit.SwappedOrbitNormal(), Vector3d.Cross(vesselState.CoM - mainBody.position, mainBody.transform.up))); } if (autopilot.enabled) { core.warp.WarpToUT(launchTime); } GUILayout.Label("Launching to " + (launchingToPlane ? "target plane" : "rendezvous") + ": T-" + MuUtils.ToSI(tMinus, 0) + "s"); if (tMinus < 3 * vesselState.deltaT) { if (autopilot.enabled) { Staging.ActivateNextStage(); } launchingToPlane = launchingToRendezvous = false; } if (GUILayout.Button("Abort")) { launchingToPlane = launchingToRendezvous = false; } } if (autopilot.enabled) { GUILayout.Label("Autopilot status: " + autopilot.status); } } MechJebModuleAscentPathEditor editor = core.GetComputerModule <MechJebModuleAscentPathEditor>(); if (editor != null) { editor.enabled = GUILayout.Toggle(editor.enabled, "Edit ascent path"); } GUILayout.EndVertical(); base.WindowGUI(windowID); }
protected override void WindowGUI(int windowID) { GUILayout.BeginVertical(); bool showingGuidance = (core.target.Target != null && core.target.Name == TARGET_NAME); if (showingGuidance) { GUILayout.Label("The purple circle on the navball points along the ascent path."); if (GUILayout.Button("Stop showing navball guidance")) { core.target.Unset(); } } else if (GUILayout.Button("Show navball ascent path guidance")) { core.target.SetDirectionTarget(TARGET_NAME); } if (autopilot != null) { if (autopilot.enabled) { if (GUILayout.Button("Disengage autopilot")) { autopilot.users.Remove(this); } } else { if (GUILayout.Button("Engage autopilot")) { autopilot.users.Add(this); } } ascentPath = autopilot.ascentPath; GuiUtils.SimpleTextBox("Orbit altitude", autopilot.desiredOrbitAltitude, "km"); autopilot.desiredInclination = desiredInclination; } GuiUtils.SimpleTextBox("Orbit inclination", desiredInclination, "º"); core.thrust.LimitToPreventOverheatsInfoItem(); core.thrust.LimitToTerminalVelocityInfoItem(); core.thrust.LimitAccelerationInfoItem(); core.thrust.LimitThrottleInfoItem(); autopilot.correctiveSteering = GUILayout.Toggle(autopilot.correctiveSteering, "Corrective steering"); autopilot.autostage = GUILayout.Toggle(autopilot.autostage, "Autostage"); if (autopilot.autostage) { core.staging.AutostageSettingsInfoItem(); } core.node.autowarp = GUILayout.Toggle(core.node.autowarp, "Auto-warp"); if (autopilot != null && vessel.LandedOrSplashed) { if (core.target.NormalTargetExists) { if (core.node.autowarp) { GUILayout.BeginHorizontal(); GUILayout.Label("Launch countdown:", GUILayout.ExpandWidth(true)); autopilot.warpCountDown.text = GUILayout.TextField(autopilot.warpCountDown.text, GUILayout.Width(60)); GUILayout.Label("s", GUILayout.ExpandWidth(false)); GUILayout.EndHorizontal(); } if (!launchingToPlane && !launchingToRendezvous && !launchingToInterplanetary) { GUILayout.BeginHorizontal(); if (GUILayout.Button("Launch to rendezvous:", GUILayout.ExpandWidth(false))) { launchingToRendezvous = true; lastTMinus = 999; } autopilot.launchPhaseAngle.text = GUILayout.TextField(autopilot.launchPhaseAngle.text, GUILayout.Width(60)); GUILayout.Label("º", GUILayout.ExpandWidth(false)); GUILayout.EndHorizontal(); if (GUILayout.Button("Launch into plane of target")) { launchingToPlane = true; lastTMinus = 999; } if (core.target.TargetOrbit.referenceBody == orbit.referenceBody.referenceBody) { if (GUILayout.Button("Launch at interplanetary window")) { launchingToInterplanetary = true; lastTMinus = 999; //compute the desired launch date OrbitalManeuverCalculator.DeltaVAndTimeForHohmannTransfer(mainBody.orbit, core.target.TargetOrbit, vesselState.time, out interplanetaryWindowUT); double desiredOrbitPeriod = 2 * Math.PI * Math.Sqrt(Math.Pow(mainBody.Radius + autopilot.desiredOrbitAltitude, 3) / mainBody.gravParameter); //launch just before the window, but don't try to launch in the past interplanetaryWindowUT -= 3 * desiredOrbitPeriod; interplanetaryWindowUT = Math.Max(vesselState.time + autopilot.warpCountDown, interplanetaryWindowUT); } } } } else { launchingToInterplanetary = launchingToPlane = launchingToRendezvous = false; GUILayout.Label("Select a target for a timed launch."); } if (launchingToInterplanetary || launchingToPlane || launchingToRendezvous) { double tMinus = 0; string message = ""; if (launchingToInterplanetary) { tMinus = interplanetaryWindowUT - vesselState.time; message = "Launching at interplanetary window"; } else if (launchingToPlane) { tMinus = LaunchTiming.TimeToPlane(mainBody, vesselState.latitude, vesselState.longitude, core.target.TargetOrbit); desiredInclination = core.target.TargetOrbit.inclination; desiredInclination *= Math.Sign(Vector3d.Dot(core.target.TargetOrbit.SwappedOrbitNormal(), Vector3d.Cross(vesselState.CoM - mainBody.position, mainBody.transform.up))); message = "Launching to target plane"; } else if (launchingToRendezvous) { tMinus = LaunchTiming.TimeToPhaseAngle(autopilot.launchPhaseAngle, mainBody, vesselState.longitude, core.target.TargetOrbit); message = "Launching to rendezvous"; } double launchTime = vesselState.time + tMinus; if (tMinus < 3 * vesselState.deltaT || (tMinus > 10.0 && lastTMinus < 1.0)) { if (autopilot.enabled) { Staging.ActivateNextStage(); } launchingToInterplanetary = launchingToPlane = launchingToRendezvous = false; } else { message += ": T-" + MuUtils.ToSI(tMinus, 0) + "s"; if (autopilot.enabled && core.node.autowarp) { core.warp.WarpToUT(launchTime - autopilot.warpCountDown); } } GUILayout.Label(message); lastTMinus = tMinus; if (GUILayout.Button("Abort")) { launchingToInterplanetary = launchingToPlane = launchingToRendezvous = false; } } } if (autopilot != null && autopilot.enabled) { GUILayout.Label("Autopilot status: " + autopilot.status); } MechJebModuleAscentPathEditor editor = core.GetComputerModule <MechJebModuleAscentPathEditor>(); if (editor != null) { editor.enabled = GUILayout.Toggle(editor.enabled, "Edit ascent path"); } GUILayout.EndVertical(); base.WindowGUI(windowID); }
protected override void WindowGUI(int windowID) { //DefaultAscentPath path = (DefaultAscentPath)core.GetComputerModule<MechJebModuleAscentAutopilot>().ascentPath; if (oldMainBody != mainBody || lastMaximumAltitude != graphStates[(int)recordType.AltitudeASL].maximum || height != backgroundTexture.height) { UpdateScale(); lastMaximumAltitude = graphStates[(int)recordType.AltitudeASL].maximum; if (height != backgroundTexture.height) { Object.Destroy(backgroundTexture); backgroundTexture = new Texture2D(1, height); } MechJebModuleAscentPathEditor.UpdateAtmoTexture(backgroundTexture, vessel.mainBody, lastMaximumAltitude, realAtmo); oldMainBody = mainBody; } GUILayout.BeginVertical(); GUILayout.BeginHorizontal(); if (GUILayout.Button(paused ? "Resume" : "Pause", GUILayout.ExpandWidth(false))) { paused = !paused; } if (GUILayout.Button(downrange ? "Downrange" : "Time", GUILayout.ExpandWidth(false))) { downrange = !downrange; } if (GUILayout.Button("-", GUILayout.ExpandWidth(false))) { hSize--; } GUILayout.Label(width.ToString(), GUILayout.ExpandWidth(false)); if (GUILayout.Button("+", GUILayout.ExpandWidth(false))) { hSize++; } GUILayout.Label("x", GUILayout.ExpandWidth(false)); if (GUILayout.Button("-", GUILayout.ExpandWidth(false))) { vSize--; } GUILayout.Label(height.ToString(), GUILayout.ExpandWidth(false)); if (GUILayout.Button("+", GUILayout.ExpandWidth(false))) { vSize++; } hSize = Mathf.Clamp(hSize, 1, 20); vSize = Mathf.Clamp(vSize, 1, 10); bool oldRrealAtmo = realAtmo; realAtmo = GUILayout.Toggle(realAtmo, "Real Atmo", GUILayout.ExpandWidth(false)); if (oldRrealAtmo != realAtmo) { MechJebModuleAscentPathEditor.UpdateAtmoTexture(backgroundTexture, vessel.mainBody, lastMaximumAltitude, realAtmo); } GUILayout.Label("Capacity " + (100 * (recorder.historyIdx) / (float)recorder.history.Length).ToString("F1") + "%", GUILayout.ExpandWidth(false)); GUILayout.Label("Size " + (8 * typeCount * recorder.history.Length >> 10).ToString() + "kB", GUILayout.ExpandWidth(false)); GUILayout.Label("AoA " + graphStates[(int)recordType.AoA].minimum.ToString("F2") + " " + graphStates[(int)recordType.AoA].maximum.ToString("F2"), GUILayout.ExpandWidth(false)); GUILayout.Label("Time " + recorder.timeSinceMark.ToString("F0"), GUILayout.ExpandWidth(false)); GUILayout.Label("Downrange " + MuUtils.ToSI(recorder.history[recorder.historyIdx].downRange) + "m", GUILayout.ExpandWidth(false)); GUILayout.Label("", GUILayout.ExpandWidth(true)); if (GUILayout.Button("Mark", GUILayout.ExpandWidth(false))) { ResetScale(); // TODO : should check something else to catch Mark calls from other code recorder.Mark(); } if (GUILayout.Button("Rst", GUILayout.ExpandWidth(false))) { ResetScale(); } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); Color color = GUI.color; //ascentPath = GUILayout.Toggle(ascentPath, "Ascent path", GUILayout.ExpandWidth(false)); stages = GUILayout.Toggle(stages, "Stages", GUILayout.ExpandWidth(false)); GUI.color = Color.white; graphStates[(int)recordType.AltitudeASL].display = GUILayout.Toggle(graphStates[(int)recordType.AltitudeASL].display, "Altitude", GUILayout.ExpandWidth(false)); GUI.color = Color.grey; graphStates[(int)recordType.AltitudeTrue].display = GUILayout.Toggle(graphStates[(int)recordType.AltitudeTrue].display, "True Altitude", GUILayout.ExpandWidth(false)); GUI.color = Color.red; graphStates[(int)recordType.Acceleration].display = GUILayout.Toggle(graphStates[(int)recordType.Acceleration].display, "Acceleration", GUILayout.ExpandWidth(false)); GUI.color = Color.yellow; graphStates[(int)recordType.SpeedSurface].display = GUILayout.Toggle(graphStates[(int)recordType.SpeedSurface].display, "Surface speed", GUILayout.ExpandWidth(false)); GUI.color = Color.magenta; graphStates[(int)recordType.SpeedOrbital].display = GUILayout.Toggle(graphStates[(int)recordType.SpeedOrbital].display, "Orbital speed", GUILayout.ExpandWidth(false)); GUI.color = Color.cyan; graphStates[(int)recordType.Q].display = GUILayout.Toggle(graphStates[(int)recordType.Q].display, "Q", GUILayout.ExpandWidth(false)); GUI.color = Color.green; graphStates[(int)recordType.AoA].display = GUILayout.Toggle(graphStates[(int)recordType.AoA].display, "AoA", GUILayout.ExpandWidth(false)); GUI.color = XKCDColors.GreenTeal; graphStates[(int)recordType.Pitch].display = GUILayout.Toggle(graphStates[(int)recordType.Pitch].display, "Pitch", GUILayout.ExpandWidth(false)); GUI.color = XKCDColors.CandyPink; graphStates[(int)recordType.Mass].display = GUILayout.Toggle(graphStates[(int)recordType.Mass].display, "Mass", GUILayout.ExpandWidth(false)); GUI.color = color; GUILayout.EndHorizontal(); GUILayout.Box(Texture2D.blackTexture, GUILayout.Width(width), GUILayout.Height(height)); if (Event.current.type == EventType.Repaint) { Rect r = GUILayoutUtility.GetLastRect(); UpdateScale(); GUI.DrawTexture(r, backgroundTexture, ScaleMode.StretchToFill); //r.xMin += GUI.skin.box.margin.left; //r.yMin += GUI.skin.box.margin.top; // //r.xMax -= GUI.skin.box.margin.right; //r.yMax -= GUI.skin.box.margin.bottom; double maxDownRange = Math.Max(recorder.maximums[(int)recordType.DownRange], 500); double hScale = downrange ? (maxDownRange - recorder.minimums[(int)recordType.DownRange]) / width : precision; if (stages) { DrawnStages(r, hScale, downrange); } if (graphStates[(int)recordType.AltitudeASL].display) { DrawnPath(r, recordType.AltitudeASL, hScale, downrange, Color.white); } if (graphStates[(int)recordType.AltitudeTrue].display) { DrawnPath(r, recordType.AltitudeTrue, hScale, downrange, Color.grey); } if (graphStates[(int)recordType.Acceleration].display) { DrawnPath(r, recordType.Acceleration, hScale, downrange, Color.red); } if (graphStates[(int)recordType.SpeedSurface].display) { DrawnPath(r, recordType.SpeedSurface, hScale, downrange, Color.yellow); } if (graphStates[(int)recordType.SpeedOrbital].display) { DrawnPath(r, recordType.SpeedOrbital, hScale, downrange, Color.magenta); } if (graphStates[(int)recordType.Q].display) { DrawnPath(r, recordType.Q, hScale, downrange, Color.cyan); } if (graphStates[(int)recordType.AoA].display) { DrawnPath(r, recordType.AoA, hScale, downrange, Color.green); } if (graphStates[(int)recordType.Pitch].display) { DrawnPath(r, recordType.Pitch, hScale, downrange, XKCDColors.GreenTeal); } if (graphStates[(int)recordType.Mass].display) { DrawnPath(r, recordType.Mass, hScale, downrange, XKCDColors.CandyPink); } // Fix : the scales are different so the result is not usefull //if (ascentPath) // MechJebModuleAscentPathEditor.DrawnPath(r, (float)hScale, (float)graphStates[(int)recordType.AltitudeASL].scale, path, Color.gray); width = 128 * hSize; height = 128 * vSize; } GUILayout.EndVertical(); base.WindowGUI(windowID); }
protected override void WindowGUI(int windowID) { //DefaultAscentPath path = (DefaultAscentPath)core.GetComputerModule<MechJebModuleAscentAutopilot>().ascentPath; if (oldMainBody != mainBody || lastMaximumAltitude != graphStates[(int)recordType.AltitudeASL].maximum || height != backgroundTexture.height) { UpdateScale(); lastMaximumAltitude = graphStates[(int)recordType.AltitudeASL].maximum; if (height != backgroundTexture.height) { Object.Destroy(backgroundTexture); backgroundTexture = new Texture2D(1, height); } MechJebModuleAscentPathEditor.UpdateAtmoTexture(backgroundTexture, vessel.mainBody, lastMaximumAltitude, realAtmo); oldMainBody = mainBody; } GUILayout.BeginVertical(); GUILayout.BeginHorizontal(); if (GUILayout.Button(paused ? "Resume" : "Pause", GUILayout.ExpandWidth(false))) { paused = !paused; } if (GUILayout.Button(downrange ? "Downrange" : "Time", GUILayout.ExpandWidth(false))) { downrange = !downrange; } //GUILayout.Label("Size " + (8 * typeCount * recorder.history.Length >> 10).ToString() + "kB", GUILayout.ExpandWidth(false)); GUILayout.Label("Time " + GuiUtils.TimeToDHMS(recorder.timeSinceMark), GUILayout.ExpandWidth(false)); GUILayout.Label("Downrange " + MuUtils.ToSI(recorder.history[recorder.historyIdx].downRange, -2) + "m", GUILayout.ExpandWidth(false)); //GUILayout.Label("", GUILayout.ExpandWidth(true)); GUILayout.FlexibleSpace(); if (GUILayout.Button("Mark", GUILayout.ExpandWidth(false))) { ResetScale(); // TODO : should check something else to catch Mark calls from other code recorder.Mark(); } if (GUILayout.Button("Reset Scale", GUILayout.ExpandWidth(false))) { ResetScale(); } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); autoScale = GUILayout.Toggle(autoScale, "Auto Scale", GUILayout.ExpandWidth(false)); if (!autoScale && GUILayout.Button("-", GUILayout.ExpandWidth(false))) { if (downrange) { downrangeScale--; } else { timeScale--; } } float maxX = (float)(downrange ? recorder.maximums[(int)recordType.DownRange] : recorder.maximums[(int)recordType.TimeSinceMark]); double maxXScaled = (downrange ? maxX : maxX / precision) / width; double autoScaleX = Math.Max(Math.Ceiling(Math.Log(maxXScaled, 2)), 0); double manualScaleX = downrange ? downrangeScale : timeScale; double activeScaleX = autoScale ? autoScaleX : manualScaleX; double scaleX = downrange ? Math.Pow(2, activeScaleX) : precision *Math.Pow(2, activeScaleX); GUILayout.Label((downrange ? MuUtils.ToSI(scaleX, -1, 2) + "m/px" : GuiUtils.TimeToDHMS(scaleX, 1) + "/px"), GUILayout.ExpandWidth(false)); if (!autoScale && GUILayout.Button("+", GUILayout.ExpandWidth(false))) { if (downrange) { downrangeScale++; } else { timeScale++; } } if (GUILayout.Button("-", GUILayout.ExpandWidth(false))) { hSize--; } GUILayout.Label(width.ToString(), GUILayout.ExpandWidth(false)); if (GUILayout.Button("+", GUILayout.ExpandWidth(false))) { hSize++; } GUILayout.Label("x", GUILayout.ExpandWidth(false)); if (GUILayout.Button("-", GUILayout.ExpandWidth(false))) { vSize--; } GUILayout.Label(height.ToString(), GUILayout.ExpandWidth(false)); if (GUILayout.Button("+", GUILayout.ExpandWidth(false))) { vSize++; } timeScale = Mathf.Clamp(timeScale, 0, 20); downrangeScale = Mathf.Clamp(downrangeScale, 0, 20); hSize = Mathf.Clamp(hSize, 1, 20); vSize = Mathf.Clamp(vSize, 1, 10); bool oldRealAtmo = realAtmo; realAtmo = GUILayout.Toggle(realAtmo, "Real Atmo", GUILayout.ExpandWidth(false)); if (oldRealAtmo != realAtmo) { MechJebModuleAscentPathEditor.UpdateAtmoTexture(backgroundTexture, vessel.mainBody, lastMaximumAltitude, realAtmo); } //GUILayout.Label("", GUILayout.ExpandWidth(true)); GUILayout.FlexibleSpace(); if (GUILayout.Button("CSV", GUILayout.ExpandWidth(false))) { recorder.DumpCSV(); } GUILayout.Label("Storage: " + (100 * (recorder.historyIdx) / (float)recorder.history.Length).ToString("F1") + "%", GUILayout.ExpandWidth(false)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); Color color = GUI.color; //ascentPath = GUILayout.Toggle(ascentPath, "Ascent path", GUILayout.ExpandWidth(false)); stages = GUILayout.Toggle(stages, "Stages", GUILayout.ExpandWidth(false)); GUI.color = Color.white; graphStates[(int)recordType.AltitudeASL].display = GUILayout.Toggle(graphStates[(int)recordType.AltitudeASL].display, "Altitude", GUILayout.ExpandWidth(false)); GUI.color = Color.grey; graphStates[(int)recordType.AltitudeTrue].display = GUILayout.Toggle(graphStates[(int)recordType.AltitudeTrue].display, "True Altitude", GUILayout.ExpandWidth(false)); GUI.color = Color.red; graphStates[(int)recordType.Acceleration].display = GUILayout.Toggle(graphStates[(int)recordType.Acceleration].display, "Acceleration", GUILayout.ExpandWidth(false)); GUI.color = Color.yellow; graphStates[(int)recordType.SpeedSurface].display = GUILayout.Toggle(graphStates[(int)recordType.SpeedSurface].display, "Surface speed", GUILayout.ExpandWidth(false)); GUI.color = Color.magenta; graphStates[(int)recordType.SpeedOrbital].display = GUILayout.Toggle(graphStates[(int)recordType.SpeedOrbital].display, "Orbital speed", GUILayout.ExpandWidth(false)); GUI.color = Color.cyan; graphStates[(int)recordType.Q].display = GUILayout.Toggle(graphStates[(int)recordType.Q].display, "Q", GUILayout.ExpandWidth(false)); GUI.color = Color.green; graphStates[(int)recordType.AoA].display = GUILayout.Toggle(graphStates[(int)recordType.AoA].display, "AoA", GUILayout.ExpandWidth(false)); GUI.color = XKCDColors.GreenTeal; graphStates[(int)recordType.Pitch].display = GUILayout.Toggle(graphStates[(int)recordType.Pitch].display, "Pitch", GUILayout.ExpandWidth(false)); GUI.color = XKCDColors.CandyPink; graphStates[(int)recordType.Mass].display = GUILayout.Toggle(graphStates[(int)recordType.Mass].display, "Mass", GUILayout.ExpandWidth(false)); GUI.color = color; GUILayout.EndHorizontal(); GUILayout.Space(10); GUILayout.BeginHorizontal(); GUILayout.Space(50); GUILayout.Box(Texture2D.blackTexture, GUILayout.Width(width), GUILayout.Height(height)); Rect r = GUILayoutUtility.GetLastRect(); DrawScaleLabels(r); GUILayout.BeginVertical(); //GUILayout.Label("X " + MuUtils.ToSI(hPos, -1, 2) + " " + MuUtils.ToSI(hPos + scaleX * width, -1, 2), GUILayout.Width(110)); color = GUI.color; if (!graphStates[scaleIdx].display) { int newIdx = 0; while (newIdx < typeCount && !graphStates[newIdx].display) { newIdx++; } if (newIdx == typeCount) { newIdx = 0; } scaleIdx = newIdx; } if (graphStates[(int)recordType.AltitudeASL].display) { GUI.color = Color.white; //if (GUILayout.Toggle(scaleIdx == (int)recordType.AltitudeASL, "ASL " + MuUtils.ToSI(graphStates[(int)recordType.AltitudeASL].minimum, -1, 3) + " " + MuUtils.ToSI(graphStates[(int)recordType.AltitudeASL].maximum, -1, 3), GUILayout.ExpandWidth(true))) if (GUILayout.Toggle(scaleIdx == (int)recordType.AltitudeASL, "ASL", GUILayout.ExpandWidth(true))) { scaleIdx = (int)recordType.AltitudeASL; } } if (graphStates[(int)recordType.AltitudeTrue].display) { GUI.color = Color.grey; //if (GUILayout.Toggle(scaleIdx == (int)recordType.AltitudeTrue, "AGL " + MuUtils.ToSI(graphStates[(int)recordType.AltitudeTrue].minimum, -1, 3) + " " + MuUtils.ToSI(graphStates[(int)recordType.AltitudeTrue].maximum, -1, 3), GUILayout.ExpandWidth(true))) if (GUILayout.Toggle(scaleIdx == (int)recordType.AltitudeTrue, "AGL", GUILayout.ExpandWidth(true))) { scaleIdx = (int)recordType.AltitudeTrue; } } if (graphStates[(int)recordType.Acceleration].display) { GUI.color = Color.red; //if (GUILayout.Toggle(scaleIdx == (int)recordType.Acceleration, "Acc " + MuUtils.ToSI(graphStates[(int)recordType.Acceleration].minimum, -1, 3) + " " + MuUtils.ToSI(graphStates[(int)recordType.Acceleration].maximum, -1, 3), GUILayout.ExpandWidth(true))) if (GUILayout.Toggle(scaleIdx == (int)recordType.Acceleration, "Acc", GUILayout.ExpandWidth(true))) { scaleIdx = (int)recordType.Acceleration; } } if (graphStates[(int)recordType.SpeedSurface].display) { GUI.color = Color.yellow; //if (GUILayout.Toggle(scaleIdx == (int)recordType.SpeedSurface, "SrfVel " + MuUtils.ToSI(graphStates[(int)recordType.SpeedSurface].minimum, -1, 3) + " " + MuUtils.ToSI(graphStates[(int)recordType.SpeedSurface].maximum, -1, 3), GUILayout.ExpandWidth(true))) if (GUILayout.Toggle(scaleIdx == (int)recordType.SpeedSurface, "SrfVel", GUILayout.ExpandWidth(true))) { scaleIdx = (int)recordType.SpeedSurface; } } if (graphStates[(int)recordType.SpeedOrbital].display) { GUI.color = Color.magenta; //if (GUILayout.Toggle(scaleIdx == (int)recordType.SpeedOrbital, "ObtVel " + MuUtils.ToSI(graphStates[(int)recordType.SpeedOrbital].minimum, -1, 3) + " " + MuUtils.ToSI(graphStates[(int)recordType.SpeedOrbital].maximum, -1, 3), GUILayout.ExpandWidth(true))) if (GUILayout.Toggle(scaleIdx == (int)recordType.SpeedOrbital, "ObtVel", GUILayout.ExpandWidth(true))) { scaleIdx = (int)recordType.SpeedOrbital; } } if (graphStates[(int)recordType.Q].display) { GUI.color = Color.cyan; //if (GUILayout.Toggle(scaleIdx == (int)recordType.Q, "Q " + MuUtils.ToSI(graphStates[(int)recordType.Q].minimum, -1, 3) + " " + MuUtils.ToSI(graphStates[(int)recordType.Q].maximum, -1, 3), GUILayout.ExpandWidth(true))) if (GUILayout.Toggle(scaleIdx == (int)recordType.Q, "Q", GUILayout.ExpandWidth(true))) { scaleIdx = (int)recordType.Q; } } if (graphStates[(int)recordType.AoA].display) { GUI.color = Color.green; //if (GUILayout.Toggle(scaleIdx == (int)recordType.AoA, "AoA " + MuUtils.ToSI(graphStates[(int)recordType.AoA].minimum, -1, 3) + " " + MuUtils.ToSI(graphStates[(int)recordType.AoA].maximum, -1, 3), GUILayout.ExpandWidth(true))) if (GUILayout.Toggle(scaleIdx == (int)recordType.AoA, "AoA", GUILayout.ExpandWidth(true))) { scaleIdx = (int)recordType.AoA; } } if (graphStates[(int)recordType.Pitch].display) { GUI.color = XKCDColors.GreenTeal; //if (GUILayout.Toggle(scaleIdx == (int)recordType.Pitch, "Pitch " + MuUtils.ToSI(graphStates[(int)recordType.Pitch].minimum, -1, 3) + " " + MuUtils.ToSI(graphStates[(int)recordType.Pitch].maximum, -1, 3), GUILayout.ExpandWidth(true))) if (GUILayout.Toggle(scaleIdx == (int)recordType.Pitch, "Pitch", GUILayout.ExpandWidth(true))) { scaleIdx = (int)recordType.Pitch; } } if (graphStates[(int)recordType.Mass].display) { GUI.color = XKCDColors.CandyPink; //if (GUILayout.Toggle(scaleIdx == (int)recordType.Mass, "Mass " + MuUtils.ToSI(graphStates[(int)recordType.Mass].minimum, -1, 3) + " " + MuUtils.ToSI(graphStates[(int)recordType.Mass].maximum, -1, 3), GUILayout.ExpandWidth(true))) if (GUILayout.Toggle(scaleIdx == (int)recordType.Mass, "Mass", GUILayout.ExpandWidth(true))) { scaleIdx = (int)recordType.Mass; } } GUI.color = color; GUILayout.EndVertical(); GUILayout.EndHorizontal(); GUILayout.Space(10); GUILayout.BeginHorizontal(); float visibleX = (float)(width * scaleX); float rightValue = Mathf.Max(visibleX, maxX); if (follow) { hPos = rightValue - visibleX; } hPos = GUILayout.HorizontalScrollbar(hPos, visibleX, 0, rightValue); follow = GUILayout.Toggle(follow, "", GUILayout.ExpandWidth(false)); GUILayout.EndHorizontal(); if (Event.current.type == EventType.Repaint) { UpdateScale(); if (graphStates[(int)recordType.AltitudeASL].display || graphStates[(int)recordType.AltitudeTrue].display) { GUI.DrawTexture(r, backgroundTexture, ScaleMode.StretchToFill); } if (stages) { DrawnStages(r, scaleX, downrange); } if (graphStates[(int)recordType.AltitudeASL].display) { DrawnPath(r, recordType.AltitudeASL, hPos, scaleX, downrange, Color.white); } if (graphStates[(int)recordType.AltitudeTrue].display) { DrawnPath(r, recordType.AltitudeTrue, hPos, scaleX, downrange, Color.grey); } if (graphStates[(int)recordType.Acceleration].display) { DrawnPath(r, recordType.Acceleration, hPos, scaleX, downrange, Color.red); } if (graphStates[(int)recordType.SpeedSurface].display) { DrawnPath(r, recordType.SpeedSurface, hPos, scaleX, downrange, Color.yellow); } if (graphStates[(int)recordType.SpeedOrbital].display) { DrawnPath(r, recordType.SpeedOrbital, hPos, scaleX, downrange, Color.magenta); } if (graphStates[(int)recordType.Q].display) { DrawnPath(r, recordType.Q, hPos, scaleX, downrange, Color.cyan); } if (graphStates[(int)recordType.AoA].display) { DrawnPath(r, recordType.AoA, hPos, scaleX, downrange, Color.green); } if (graphStates[(int)recordType.Pitch].display) { DrawnPath(r, recordType.Pitch, hPos, scaleX, downrange, XKCDColors.GreenTeal); } if (graphStates[(int)recordType.Mass].display) { DrawnPath(r, recordType.Mass, hPos, scaleX, downrange, XKCDColors.CandyPink); } // Fix : the scales are different so the result is not useful //if (ascentPath) // MechJebModuleAscentPathEditor.DrawnPath(r, (float)hScale, (float)graphStates[(int)recordType.AltitudeASL].scale, path, Color.gray); width = 128 * hSize; height = 128 * vSize; } GUILayout.EndVertical(); base.WindowGUI(windowID); }