diff --git a/animate2.cpp b/animate2.cpp index a310e25..4a02934 100644 --- a/animate2.cpp +++ b/animate2.cpp @@ -78,6 +78,7 @@ namespace animate2 { void Timer::start() { clock.start(); + prev_time = clock.getElapsedTime().asSeconds(); } void Timer::reset() { @@ -86,25 +87,34 @@ namespace animate2 { void Timer::restart() { clock.restart(); + prev_time = clock.getElapsedTime().asSeconds(); } sf::Time Timer::getElapsedTime() { return clock.getElapsedTime(); } - void Timer::begin() { - prev_time = clock.getElapsedTime().asSeconds(); - } - std::pair Timer::commit() { + // determine frame duration based on previous time current_time = clock.getElapsedTime().asSeconds(); frame_duration = current_time - prev_time; + + // update prev_time for the next call + prev_time = current_time; + + // update accumulator, retaining previous errors accumulator += frame_duration; + // find the tick count based on DELTA double tick_count = accumulator / DELTA; + // alpha is then the remainder/fractional part double alpha = modf(tick_count, &tick_count); - accumulator -= tick_count * DELTA; + // reduce accumulator by the number of DELTAS + accumulator -= tick_count * DELTA; + // that leaves the remaining errors for next loop + + // return the number of even DELTA ticks and the alpha return {int(tick_count), alpha}; } diff --git a/animate2.hpp b/animate2.hpp index 548e648..6ee2bf6 100644 --- a/animate2.hpp +++ b/animate2.hpp @@ -26,7 +26,6 @@ namespace animate2 { double alpha = 0.0; sf::Clock clock{}; - void begin(); std::pair commit(); void start(); void reset(); diff --git a/ease2.cpp b/ease2.cpp index 1493487..43e86ce 100644 --- a/ease2.cpp +++ b/ease2.cpp @@ -15,7 +15,7 @@ namespace ease2 { return (std::sin(x) + 1.0) / 2.0; } - double out_circ(double x) { + double out_circle(double x) { return std::sqrt(1.0f - ((x - 1.0f) * (x - 1.0f))); } @@ -46,11 +46,11 @@ namespace ease2 { : (std::pow(2.0 * x - 2.0, 2.0) * ((c2 + 1.0) * (x * 2.0 - 2.0) + c2) + 2.0) / 2.0; } - float random(float tick) { + double random(double tick) { return Random::uniform_real(0.0001f, 1.0f); } - float normal_dist(float tick) { + double normal_dist(double tick) { return Random::normal(0.5f, 0.1f); } @@ -66,7 +66,6 @@ namespace ease2 { scale_out.x = std::lerp(tr.min_x, tr.max_x, tick); scale_out.y = std::lerp(tr.min_y, tr.max_y, tick); pos_out.y = pos_out.y - (pos_out.y * scale_out.y - pos_out.y); - fmt::println("RUSH pos={},{}; scale={},{}; tic={}", pos_out.x, pos_out.y, scale_out.x, scale_out.y, tick); } void scale_squeeze(Transform &tr, sf::Vector2f& pos_out, sf::Vector2f& scale_out, float tick) { @@ -77,7 +76,7 @@ namespace ease2 { scale_out.y *= std::lerp(tr.min_y, tr.max_y, tick); } - void scale_strech(Transform &tr, sf::Vector2f& pos_out, sf::Vector2f& scale_out, float tick) { + void scale_stretch(Transform &tr, sf::Vector2f& pos_out, sf::Vector2f& scale_out, float tick) { scale_out.x = std::lerp(tr.min_x, tr.max_x, tick); } @@ -86,8 +85,8 @@ namespace ease2 { } void move_slide(Transform &tr, sf::Vector2f& pos_out, sf::Vector2f& scale_out, float tick) { - pos_out.x = std::lerp(tr.min_x, tr.max_x, tick); - pos_out.y = std::lerp(tr.min_y, tr.max_y, tick); + pos_out.x += std::lerp(tr.min_x, tr.max_x, tick); + pos_out.y += std::lerp(tr.min_y, tr.max_y, tick); } void move_none(Transform &tr, sf::Vector2f& pos_out, sf::Vector2f& scale_out, float tick) { diff --git a/ease2.hpp b/ease2.hpp index 1ebdc41..4979257 100644 --- a/ease2.hpp +++ b/ease2.hpp @@ -10,7 +10,7 @@ namespace ease2 { using MoveFunc = std::function; double sine(double x); - double out_circ(double x); + double out_circle(double x); double out_bounce(double x); double in_out_back(double x); double random(double tick); @@ -20,9 +20,10 @@ namespace ease2 { void move_rush(animate2::Transform &tr, sf::Vector2f& pos_out, sf::Vector2f& scale_out, float tick); void scale_squeeze(animate2::Transform &tr, sf::Vector2f& pos_out, sf::Vector2f& scale_out, float tick); void scale_squash(animate2::Transform &tr, sf::Vector2f& pos_out, sf::Vector2f& scale_out, float tick); - void scale_strech(animate2::Transform &tr, sf::Vector2f& pos_out, sf::Vector2f& scale_out, float tick); + void scale_stretch(animate2::Transform &tr, sf::Vector2f& pos_out, sf::Vector2f& scale_out, float tick); void scale_grow(animate2::Transform &tr, sf::Vector2f& pos_out, sf::Vector2f& scale_out, float tick); void move_slide(animate2::Transform &tr, sf::Vector2f& pos_out, sf::Vector2f& scale_out, float tick); void move_none(animate2::Transform &tr, sf::Vector2f& pos_out, sf::Vector2f& scale_out, float tick); void scale_only(animate2::Transform &tr, sf::Vector2f& pos_out, sf::Vector2f& scale_out, float tick); + void move_shake(animate2::Transform &tr, sf::Vector2f& pos_out, sf::Vector2f& scale_out, float tick); } diff --git a/tests/animate2.cpp b/tests/animate2.cpp index db9d28f..315a77d 100644 --- a/tests/animate2.cpp +++ b/tests/animate2.cpp @@ -196,9 +196,9 @@ TEST_CASE("confirm transition changes work", "[animation-new]") { TEST_CASE("playing with delta time", "[animation-new]") { animate2::Timer timer; + timer.start(); for(int i = 0; i < 20; i++) { - timer.begin(); FAKE_RENDER(); auto [tick_count, alpha] = timer.commit(); fmt::println("tick: {}, alpha: {}", tick_count, alpha); diff --git a/tools/animator.cpp b/tools/animator.cpp index 7ac0b7e..96afd3b 100644 --- a/tools/animator.cpp +++ b/tools/animator.cpp @@ -55,6 +55,11 @@ namespace animator { bool mouse(float x, float y, guecs::Modifiers mods) { return $ui.mouse(x, y, mods); } + + std::shared_ptr get_sprite() { + auto viewer = $ui.entity("viewer"); + return $ui.get(viewer).sprite; + } }; enum class State { @@ -156,10 +161,10 @@ animate2::Sequence sequence{ }; animate2::Transform transform{ - .min_x{0.6f}, - .min_y{0.6f}, - .max_x{0.8f}, - .max_y{0.8f}, + .min_x{-40.0f}, + .min_y{-40.0f}, + .max_x{40.0f}, + .max_y{40.0f}, .simple{false}, .flipped{false}, .ease_rate{0.5f}, @@ -168,8 +173,8 @@ animate2::Transform transform{ .stationary{true}, .toggled{false}, .looped{true}, - .easing = ease2::in_out_back, - .motion = ease2::move_rush, + .easing = ease2::out_circle, + .motion = ease2::move_bounce, }; int main(int argc, char* argv[]) { @@ -194,13 +199,19 @@ int main(int argc, char* argv[]) { timer.start(); anim.play(); - auto viewer = main.$ui.$ui.entity("viewer"); - auto& sprite = main.$ui.$ui.get(viewer).sprite; + auto sprite = main.$ui.get_sprite(); + sf::Vector2f pos = sprite->getPosition(); + sf::Vector2f scale = sprite->getScale(); while(main.active()) { - timer.begin(); - anim.apply(*sprite); + + sf::Vector2f new_pos = pos; + sf::Vector2f new_scale = scale; + anim.motion(new_pos, new_scale); + sprite->setPosition(new_pos); + sprite->setScale(new_scale); + main.render(); auto [ticks, alpha] = timer.commit(); @@ -211,8 +222,8 @@ int main(int argc, char* argv[]) { anim.update(); } - // do something with alpha.... + main.handle_keyboard_mouse(); }