diff --git a/OemLoader/MainWindow.cs b/OemLoader/MainWindow.cs index 9570cb8..31b442b 100644 --- a/OemLoader/MainWindow.cs +++ b/OemLoader/MainWindow.cs @@ -8,7 +8,24 @@ public class MainWindow(string title) { private readonly ImInputString _filename = new(short.MaxValue); private List? _oem; - private string? _errorMessage = null; + private string? _errorMessage; + private long _sliderTicks = 0; + + private void GoToTime(DateTime time) + { + if (Program.ControlledVehicle is null || _oem is null) return; + if (_oem.First().Epoch > time || time > _oem.Last().Epoch) return; + + var l = _oem.TakeWhile(line => line.Epoch < time).Last(); + var orb = l.AsOrbit(Program.ControlledVehicle.Parent, + Program.ControlledVehicle.Orbit.OrbitLineColor); + var dt = (time - OemLoader.KsaEpoch).TotalSeconds - Universe.GetElapsedSeconds(); + Universe.CompleteAndApplyPreviousOrbitSolvers(); + Universe.ResetSimulationSpeed(); + Universe.ExecuteNextOrbitSolvers(dt); + Universe.CompleteAndApplyPreviousOrbitSolvers(); + Program.ControlledVehicle.Teleport(orb, null, null); + } public void Render() { @@ -22,6 +39,7 @@ public class MainWindow(string title) try { _oem = OemDataLine.ReadFile(_filename.ToString()); + _sliderTicks = _oem.First().Epoch.Ticks; _errorMessage = null; } catch (Exception e) @@ -42,18 +60,26 @@ public class MainWindow(string title) if (_oem.First().Epoch <= now && now <= _oem.Last().Epoch) { if (ImGui.Button("Go to now")) + GoToTime(DateTime.UtcNow); + + var minTicks = _oem.First().Epoch.Ticks; + var maxTicks = _oem.Last().Epoch.Ticks; + unsafe { - var l = _oem.TakeWhile(line => line.Epoch < now).Last(); - - var orb = l.AsOrbit(Program.ControlledVehicle.Parent, - Program.ControlledVehicle.Orbit.OrbitLineColor); - var dt = (now - OemLoader.KsaEpoch).TotalSeconds - Universe.GetElapsedSeconds(); - Universe.CompleteAndApplyPreviousOrbitSolvers(); - Universe.ResetSimulationSpeed(); - Universe.ExecuteNextOrbitSolvers(dt); - Universe.CompleteAndApplyPreviousOrbitSolvers(); - Program.ControlledVehicle.Teleport(orb, null, null); + fixed (long* pTicks = &_sliderTicks) ImGui.SliderScalar( + "Time", + ImGuiDataType.U64, + pTicks, + &minTicks, + &maxTicks, + "", + ImGuiSliderFlags.AlwaysClamp | ImGuiSliderFlags.NoRoundToFormat + ); } + + var sliderTime = new DateTime(_sliderTicks); + if (ImGui.Button($"Go to {sliderTime}")) + GoToTime(sliderTime); } } } diff --git a/OemLoader/OemLoader.csproj b/OemLoader/OemLoader.csproj index 945e6b6..2fddee3 100644 --- a/OemLoader/OemLoader.csproj +++ b/OemLoader/OemLoader.csproj @@ -4,6 +4,7 @@ net10.0 enable enable + True