From fbb2582a66be0b98166e1f6ac21eb218aefd82e1 Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Sat, 11 Feb 2023 17:53:05 +0100 Subject: src/scenery, save: store dt as 16-bit fixed point Bump save proto version. --- serialize/world-impl.hpp | 2 +- serialize/world-reader.cpp | 7 ++++++- src/scenery.cpp | 9 +++++---- src/scenery.hpp | 2 +- 4 files changed, 13 insertions(+), 7 deletions(-) diff --git a/serialize/world-impl.hpp b/serialize/world-impl.hpp index e74ebda2..59c57e78 100644 --- a/serialize/world-impl.hpp +++ b/serialize/world-impl.hpp @@ -33,7 +33,7 @@ template constexpr inline T int_max = std::numeric_limits::max(); constexpr inline std::size_t atlas_name_max = 128; constexpr inline auto null_atlas = (atlasid)-1LL; -constexpr inline proto_t proto_version = 3; +constexpr inline proto_t proto_version = 4; constexpr inline proto_t min_proto_version = 1; constexpr inline auto chunk_magic = (std::uint16_t)~0xc0d3; constexpr inline auto scenery_magic = (std::uint16_t)~0xb00b; diff --git a/serialize/world-reader.cpp b/serialize/world-reader.cpp index f5459203..4d27c27f 100644 --- a/serialize/world-reader.cpp +++ b/serialize/world-reader.cpp @@ -173,7 +173,12 @@ void reader_state::read_chunks(reader_t& s) else sc.frame.frame << s; if (sc.frame.active) - sc.frame.delta << s; + { + if (PROTO >= 4) [[likely]] + sc.frame.delta << s; + else + sc.frame.delta = (std::uint16_t)Math::clamp(int(s.read() * 65535), 0, 65535); + } } t.scenery() = sc; } diff --git a/src/scenery.cpp b/src/scenery.cpp index 89c04eec..848029da 100644 --- a/src/scenery.cpp +++ b/src/scenery.cpp @@ -71,10 +71,11 @@ void scenery::update(float dt, const anim_atlas& anim) const auto nframes = (int)anim.info().nframes; fm_debug_assert(anim.info().fps > 0 && anim.info().fps <= 0xff); - delta += dt; - const float frame_time = 1.f/hz; - const auto n = int(delta / frame_time); - delta -= frame_time * n; + auto delta_ = int(delta) + int(65535u * dt); + delta_ = std::min(65535, delta_); + const auto frame_time = int(1.f/hz * 65535); + const auto n = (std::uint8_t)std::clamp(delta_ / frame_time, 0, 255); + delta = (std::uint16_t)std::clamp(delta_ - frame_time*n, 0, 65535); fm_debug_assert(delta >= 0); const std::int8_t dir = closing ? 1 : -1; const int fr = frame + dir*n; diff --git a/src/scenery.hpp b/src/scenery.hpp index 44d2c6b5..7cdc1f4c 100644 --- a/src/scenery.hpp +++ b/src/scenery.hpp @@ -32,7 +32,7 @@ struct scenery final using frame_t = std::uint16_t; - float delta = 0; + std::uint16_t delta = 0; frame_t frame = 0; rotation r : 3 = rotation::N; scenery_type type : 3 = scenery_type::none; -- cgit v1.2.3