summaryrefslogtreecommitdiffhomepage
path: root/StarsEx/Clock.cpp
diff options
context:
space:
mode:
authorAki <please@ignore.pl>2022-04-01 21:23:39 +0200
committerAki <please@ignore.pl>2022-04-01 21:23:39 +0200
commit3c487c5cd69c53d6fea948643c0a76df03516605 (patch)
tree72730c7b8b26a5ef8fc9a987ec4c16129efd5aac /StarsEx/Clock.cpp
parent8f353abd0bfe18baddd8a8250ab7c4f2d1c83a6e (diff)
downloadstarshatter-3c487c5cd69c53d6fea948643c0a76df03516605.zip
starshatter-3c487c5cd69c53d6fea948643c0a76df03516605.tar.gz
starshatter-3c487c5cd69c53d6fea948643c0a76df03516605.tar.bz2
Moved Stars45 to StarsEx
Diffstat (limited to 'StarsEx/Clock.cpp')
-rw-r--r--StarsEx/Clock.cpp143
1 files changed, 143 insertions, 0 deletions
diff --git a/StarsEx/Clock.cpp b/StarsEx/Clock.cpp
new file mode 100644
index 0000000..e5db6c3
--- /dev/null
+++ b/StarsEx/Clock.cpp
@@ -0,0 +1,143 @@
+/* Starshatter: The Open Source Project
+ Copyright (c) 2021-2022, Starshatter: The Open Source Project Contributors
+ Copyright (c) 2011-2012, Starshatter OpenSource Distribution Contributors
+ Copyright (c) 1997-2006, Destroyer Studios LLC.
+*/
+
+#include "Clock.h"
+
+#include <chrono>
+
+static constexpr double NO_COMPRESSION {1.0};
+static constexpr double STARTING_DELTA {1.0 / 60.0};
+
+Clock* Clock::instance = nullptr;
+
+
+Clock*
+Clock::GetInstance()
+{
+ return instance;
+}
+
+
+bool
+Clock::Init()
+{
+ if (instance == nullptr) {
+ instance = new Clock();
+ return instance != nullptr;
+ }
+ return false;
+}
+
+
+void
+Clock::Close()
+{
+ if (instance != nullptr) {
+ delete instance;
+ instance = nullptr;
+ }
+}
+
+
+Clock::Clock() :
+ m_point {inner_clock::now()},
+ m_game_elapsed {inner_clock::duration::zero()},
+ m_real_elapsed {inner_clock::duration::zero()},
+ m_compression {NO_COMPRESSION},
+ m_delta {STARTING_DELTA},
+ m_gui_delta {STARTING_DELTA},
+ m_rate {0.0}
+{
+}
+
+
+void
+Clock::Set()
+{
+ m_point = inner_clock::now();
+ m_delta = STARTING_DELTA;
+ m_gui_delta = STARTING_DELTA;
+}
+
+
+double
+Clock::Step()
+{
+ const auto next = inner_clock::now();
+ const auto delta = next - m_point;
+ m_game_elapsed += std::chrono::duration_cast<inner_clock::duration>(delta * m_compression);
+ m_real_elapsed += delta;
+ const std::chrono::duration<double> seconds = delta;
+ m_delta = seconds.count() * m_compression;
+ m_gui_delta = seconds.count();
+ m_point = next;
+ m_rate = 1 / m_gui_delta;
+ return m_delta;
+}
+
+
+void
+Clock::ResetGameTime()
+{
+ m_game_elapsed = inner_clock::duration::zero();
+}
+
+
+void
+Clock::SkipGameTime(double seconds)
+{
+ const std::chrono::duration<double> skip {seconds};
+ m_game_elapsed += std::chrono::duration_cast<inner_clock::duration>(skip);
+}
+
+
+double
+Clock::Delta() const
+{
+ return m_delta;
+}
+
+
+double
+Clock::GuiDelta() const
+{
+ return m_gui_delta;
+}
+
+
+double
+Clock::Rate() const
+{
+ return m_rate;
+}
+
+
+double
+Clock::TimeCompression() const
+{
+ return m_compression;
+}
+
+
+Clock::count_type
+Clock::GameTime() const
+{
+ return std::chrono::duration_cast<elapsed_duration>(m_game_elapsed).count();
+}
+
+
+Clock::count_type
+Clock::RealTime() const
+{
+ return std::chrono::duration_cast<elapsed_duration>(m_real_elapsed).count();
+}
+
+
+void
+Clock::SetTimeCompression(double compression)
+{
+ m_compression = compression;
+}