diff options
-rw-r--r-- | editor/app.cpp | 2 | ||||
-rw-r--r-- | floormat/app.hpp | 3 | ||||
-rw-r--r-- | main/main-impl.hpp | 1 | ||||
-rw-r--r-- | src/critter.cpp | 3 | ||||
-rw-r--r-- | src/object.cpp | 10 | ||||
-rw-r--r-- | src/timer-ns.cpp | 25 | ||||
-rw-r--r-- | src/timer.cpp | 7 | ||||
-rw-r--r-- | src/timer.hpp | 7 | ||||
-rw-r--r-- | test/serializer.cpp | 2 |
9 files changed, 44 insertions, 16 deletions
diff --git a/editor/app.cpp b/editor/app.cpp index bda4dc6c..ca4dd853 100644 --- a/editor/app.cpp +++ b/editor/app.cpp @@ -5,7 +5,7 @@ #include "editor.hpp" #include "src/anim-atlas.hpp" #include "src/critter.hpp" -#include "src/timer-fwd.hpp" +#include "src/timer.hpp" #include "src/world.hpp" #include "floormat/main.hpp" #include "floormat/settings.hpp" diff --git a/floormat/app.hpp b/floormat/app.hpp index 01f94b7f..e387c0c4 100644 --- a/floormat/app.hpp +++ b/floormat/app.hpp @@ -4,8 +4,6 @@ namespace Magnum::Math { template<typename T> class Vector2; template<class T> c namespace floormat { -using Ns = Math::Nanoseconds<int64_t>; - struct mouse_move_event; struct mouse_button_event; struct mouse_scroll_event; @@ -17,6 +15,7 @@ union any_event; struct chunk_coords; struct chunk_coords_; class chunk; +struct Ns; struct floormat_app { diff --git a/main/main-impl.hpp b/main/main-impl.hpp index c056dfa9..e9d996bf 100644 --- a/main/main-impl.hpp +++ b/main/main-impl.hpp @@ -2,7 +2,6 @@ #include "floormat/main.hpp" #include "floormat/settings.hpp" #include "src/world.hpp" -#include "src/timer-fwd.hpp" #include "src/timer.hpp" #include "draw/ground.hpp" #include "draw/wall.hpp" diff --git a/src/critter.cpp b/src/critter.cpp index 491d8566..03281ef6 100644 --- a/src/critter.cpp +++ b/src/critter.cpp @@ -179,14 +179,13 @@ void critter::update_movement(size_t i, Ns dt, rotation new_r) auto nframes = allocate_frame_time(dt, speed); if (nframes == 0) { - static unsigned foo; + //static unsigned foo; //Debug{} << ++foo << "stopped"; return; } const auto rotations = rotation_to_similar(new_r); const unsigned nvecs = (int)new_r & 1 ? 3 : 1; - if (r != new_r) //if (is_dynamic()) rotate(i, new_r); diff --git a/src/object.cpp b/src/object.cpp index e834525f..e440ab7a 100644 --- a/src/object.cpp +++ b/src/object.cpp @@ -274,17 +274,17 @@ uint32_t object::allocate_frame_time(Ns dt, uint16_t& accum, uint32_t hz, float fm_assert(hz > 0); fm_assert(dt >= Ns{0}); constexpr auto ns_in_sec = Ns(1e9); - constexpr auto u16_max = uint16_t{65535}; + constexpr auto u16_max = uint64_t{65535}; //const auto count = Ns::Type{ns_in_sec / hz} + accum}; const auto from_accum = uint64_t{accum} * ns_in_sec / u16_max; - const auto from_dt = float{dt} * speed; - fm_assert(from_dt <= float{1 << 24}); + const auto from_dt = Ns(uint64_t(float{dt} * speed)); + fm_assert(from_dt <= Ns{1 << 24}); const auto ticks = from_dt + from_accum; const auto frame_duration = ns_in_sec / hz; const auto frames = (uint32_t)(ticks / frame_duration); const auto rem = (uint32_t)(ticks % frame_duration); - const auto new_accum_ = rem * u16_max / ns_in_sec; - const auto new_accum = (uint16_t)Math::clamp(new_accum_, Ns{0}, u16_max); + const auto new_accum_ = rem * u16_max / uint64_t{ns_in_sec}; + const auto new_accum = (uint16_t)Math::clamp(new_accum_, uint64_t{0}, u16_max); [[maybe_unused]] const auto old_accum = accum; accum = new_accum; #if 0 diff --git a/src/timer-ns.cpp b/src/timer-ns.cpp index a940e1f5..7a2fe087 100644 --- a/src/timer-ns.cpp +++ b/src/timer-ns.cpp @@ -1,11 +1,12 @@ #include "timer.hpp" #include "compat/assert.hpp" +#include <cr/Debug.h> namespace floormat { namespace { -#if 1 +#if 0 constexpr auto MAX = (uint64_t)-1, HALF = MAX/2; static_assert(MAX - (MAX-0) <= 0); @@ -44,7 +45,13 @@ Ns operator*(const Ns& lhs, uint64_t b) auto x = a * b; //fm_assert(!(a != 0 && x / a != b)); fm_assert(a == 0 || x / a == b); - return Ns{a * b}; + return Ns{x}; +} + +Ns operator*(uint64_t a, const Ns& rhs) +{ + auto b = rhs.stamp; + return Ns{a} * b; } uint64_t operator/(const Ns& lhs, const Ns& rhs) @@ -54,6 +61,20 @@ uint64_t operator/(const Ns& lhs, const Ns& rhs) return a / b; } +Ns operator/(const Ns& lhs, uint64_t b) +{ + auto a = lhs.stamp; + fm_assert(b != 0); + return Ns{a / b}; +} + +uint64_t operator%(const Ns& lhs, const Ns& rhs) +{ + auto a = lhs.stamp, b = rhs.stamp; + fm_assert(b != 0); + return a % b; +} + Ns operator%(const Ns& lhs, uint64_t b) { auto a = lhs.stamp; diff --git a/src/timer.cpp b/src/timer.cpp index f663aaf0..8e9ed917 100644 --- a/src/timer.cpp +++ b/src/timer.cpp @@ -65,6 +65,11 @@ const char* format_datetime_to_string(char (&buf)[fm_DATETIME_BUF_SIZE]) return buf; } - +Ns operator-(const Time& lhs, const Time& rhs) noexcept +{ + auto a = lhs.stamp, b = rhs.stamp; + fm_assert(a >= b); + return Ns{a - b}; +} } // namespace floormat diff --git a/src/timer.hpp b/src/timer.hpp index 6972e372..43637b36 100644 --- a/src/timer.hpp +++ b/src/timer.hpp @@ -20,10 +20,13 @@ struct Ns friend Ns operator+(const Ns& lhs, const Ns& rhs); friend Ns operator-(const Ns& lhs, const Ns& rhs); friend Ns operator*(const Ns& lhs, uint64_t rhs); + friend Ns operator*(uint64_t lhs, const Ns& rhs); + friend uint64_t operator/(const Ns& lhs, const Ns& rhs); friend Ns operator/(const Ns& lhs, uint64_t rhs); friend uint64_t operator%(const Ns& lhs, const Ns& rhs); friend Ns operator%(const Ns& lhs, uint64_t rhs); + friend bool operator==(const Ns& lhs, const Ns& rhs); friend std::strong_ordering operator<=>(const Ns& lhs, const Ns& rhs); }; @@ -33,7 +36,7 @@ struct Time final static Time now() noexcept; bool operator==(const Time&) const noexcept; std::strong_ordering operator<=>(const Time&) const noexcept; - friend Ns operator-(const Time& a, const Time& b) noexcept; + friend Ns operator-(const Time& lhs, const Time& rhs) noexcept; [[nodiscard]] Ns update(const Time& ts = now()) & noexcept; static float to_seconds(const Ns& ts) noexcept; @@ -45,6 +48,8 @@ private: static uint64_t init() noexcept; }; +Debug& operator<<(Debug& dbg, Ns box); + constexpr inline size_t fm_DATETIME_BUF_SIZE = 32; const char* format_datetime_to_string(char(&buf)[fm_DATETIME_BUF_SIZE]); diff --git a/test/serializer.cpp b/test/serializer.cpp index cc9405ef..61a5d509 100644 --- a/test/serializer.cpp +++ b/test/serializer.cpp @@ -54,7 +54,7 @@ chunk& test_app::make_test_chunk(world& w, chunk_coords_ ch) const auto index = e.index(); const auto end = e.atlas->info().nframes-1; constexpr auto second = Ns(1e9); - constexpr auto dt = second / 60; + constexpr auto dt = Ns{second.stamp / 60}; fm_assert(e.frame == end); { auto& x = std::get<door_scenery>(e.subtype); fm_assert(!x.active); |