From 6702844314e043f9ecc53e58cfa20cc5454693c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Capello?= Date: Wed, 15 Mar 2023 15:18:01 -0300 Subject: [PATCH 1/3] Minor code simplifications --- src/doc/playback.cpp | 37 +++++++++++++++++++------------------ src/doc/playback.h | 7 +++---- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/doc/playback.cpp b/src/doc/playback.cpp index 96273cf51..6ca94b055 100644 --- a/src/doc/playback.cpp +++ b/src/doc/playback.cpp @@ -119,10 +119,7 @@ frame_t Playback::nextFrame(frame_t frameDelta) handleMoveFrame(step); handleEnterFrame(step, false); - if (frameDelta > 0) - --frameDelta; - else if (frameDelta < 0) - ++frameDelta; + frameDelta -= step; } PLAY_TRACE(" } =", m_frame, @@ -187,7 +184,7 @@ void Playback::handleEnterFrame(const frame_t frameDelta, const bool firstTime) else { addTag(t, false, forward); if (!firstTime) - goToFirstTagFrame(t, frameDelta); + goToFirstTagFrame(t); } } } @@ -220,17 +217,14 @@ bool Playback::handleExitFrame(const frame_t frameDelta) if ((tag->aniDir() == AniDir::FORWARD || tag->aniDir() == AniDir::REVERSE) - && ((forward > 0 && m_frame == tag->toFrame()) - || - (forward < 0 && m_frame == tag->fromFrame()))) { + && (frameDelta > 0 && m_frame == lastTagFrame(tag))) { decrementRepeat(frameDelta); return false; } // Change ping-pong direction else if ((tag->aniDir() == AniDir::PING_PONG || tag->aniDir() == AniDir::PING_PONG_REVERSE) - && ((m_frame == tag->fromFrame() && forward < 0) - || (m_frame == tag->toFrame() && forward > 0))) { + && m_frame == lastTagFrame(tag)) { PLAY_TRACE(" Changing direction frame=", m_frame, " forward=", forward, "->", -forward); @@ -404,7 +398,7 @@ bool Playback::decrementRepeat(const frame_t frameDelta) if (m_playing.back()->repeat > 1) { --m_playing.back()->repeat; - goToFirstTagFrame(tag, frameDelta); + goToFirstTagFrame(tag); PLAY_TRACE(" Repeat tag", tag->name(), " frame=", m_frame, "repeat=", m_playing.back()->repeat, @@ -431,7 +425,7 @@ bool Playback::decrementRepeat(const frame_t frameDelta) // New frame outside the tag frame_t newFrame; if (rewind) { - newFrame = firstTagFrame(m_playing.back()->tag, frameDelta); + newFrame = firstTagFrame(m_playing.back()->tag); } else { newFrame = (frameDelta * forward < 0 ? tag->fromFrame()-1: tag->toFrame()+1); @@ -486,21 +480,28 @@ bool Playback::decrementRepeat(const frame_t frameDelta) } } -frame_t Playback::firstTagFrame(const Tag* tag, - const frame_t frameDelta) +frame_t Playback::firstTagFrame(const Tag* tag) { ASSERT(tag); ASSERT(!m_playing.empty()); int forward = m_playing.back()->forward; - return (frameDelta * forward < 0 ? tag->toFrame(): + return (forward < 0 ? tag->toFrame(): tag->fromFrame()); } -void Playback::goToFirstTagFrame(const Tag* tag, - const frame_t frameDelta) +frame_t Playback::lastTagFrame(const Tag* tag) { ASSERT(tag); - m_frame = firstTagFrame(tag, frameDelta); + ASSERT(!m_playing.empty()); + int forward = m_playing.back()->forward; + return (forward > 0 ? tag->toFrame(): + tag->fromFrame()); +} + +void Playback::goToFirstTagFrame(const Tag* tag) +{ + ASSERT(tag); + m_frame = firstTagFrame(tag); PLAY_TRACE(" Go to first frame of tag", tag->name(), "frame=", m_frame); } diff --git a/src/doc/playback.h b/src/doc/playback.h index eb4529349..0b8084969 100644 --- a/src/doc/playback.h +++ b/src/doc/playback.h @@ -115,10 +115,9 @@ namespace doc { const int forward); void removeLastTagFromPlayed(); bool decrementRepeat(const frame_t frameDelta); - frame_t firstTagFrame(const Tag* tag, - const frame_t frameDelta); - void goToFirstTagFrame(const Tag* tag, - const frame_t frameDelta); + frame_t firstTagFrame(const Tag* tag); + frame_t lastTagFrame(const Tag* tag); + void goToFirstTagFrame(const Tag* tag); int getParentForward() const; const Sprite* m_sprite; From b1335c2c007027ec2237e33544a476222e50b130 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Capello?= Date: Wed, 15 Mar 2023 15:20:53 -0300 Subject: [PATCH 2/3] Fix onion skin rendering (fix #3739) --- src/doc/playback.cpp | 10 +++++++++- src/render/render.cpp | 8 +++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/doc/playback.cpp b/src/doc/playback.cpp index 6ca94b055..8cc8fc916 100644 --- a/src/doc/playback.cpp +++ b/src/doc/playback.cpp @@ -232,6 +232,14 @@ bool Playback::handleExitFrame(const frame_t frameDelta) m_playing.back()->invertForward(); return decrementRepeat(frameDelta); } + else if (m_playMode == PlayInLoop && frameDelta < 0 + && m_frame == firstTagFrame(tag)) { + PLAY_TRACE(" Going to last frame=", lastTagFrame(tag), + " (PlayInLoop) frame=", m_frame, " forward=", forward); + + m_frame = lastTagFrame(tag); + return false; + } } if (frameDelta > 0 && m_frame == m_sprite->lastFrame()) { @@ -486,7 +494,7 @@ frame_t Playback::firstTagFrame(const Tag* tag) ASSERT(!m_playing.empty()); int forward = m_playing.back()->forward; return (forward < 0 ? tag->toFrame(): - tag->fromFrame()); + tag->fromFrame()); } frame_t Playback::lastTagFrame(const Tag* tag) diff --git a/src/render/render.cpp b/src/render/render.cpp index 1db7cdbff..3c9d36ffe 100644 --- a/src/render/render.cpp +++ b/src/render/render.cpp @@ -858,11 +858,13 @@ void Render::renderOnionskin( m_sprite, TagsList(), // TODO add an onionskin option to iterate subtags frame, - Playback::PlayInLoop, + loop ? Playback::PlayInLoop : Playback::PlayAll, loop); - play.nextFrame(-m_onionskin.prevFrames()); + frame_t prevFrames = (loop ? m_onionskin.prevFrames(): + std::min(frame, m_onionskin.prevFrames())); + play.nextFrame(-prevFrames); - for (frame_t frameOut = frame - m_onionskin.prevFrames(); + for (frame_t frameOut = frame - prevFrames; frameOut <= frame + m_onionskin.nextFrames(); ++frameOut, play.nextFrame()) { const frame_t frameIn = play.frame(); From 6a827890ab749dec1f064b0fb2b00e73390e6def Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Capello?= Date: Wed, 15 Mar 2023 17:53:12 -0300 Subject: [PATCH 3/3] Fix to make TwoLoopsInCascadeReverse test work --- src/doc/playback.cpp | 17 ++++++++++------- src/doc/playback_tests.cpp | 2 -- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/doc/playback.cpp b/src/doc/playback.cpp index 8cc8fc916..07ca39374 100644 --- a/src/doc/playback.cpp +++ b/src/doc/playback.cpp @@ -207,7 +207,8 @@ bool Playback::handleExitFrame(const frame_t frameDelta) case PlayAll: case PlayInLoop: { - if (auto tag = this->tag()) { + auto tag = this->tag(); + if (tag && tag->contains(m_frame)) { ASSERT(!m_playing.empty()); int forward = m_playing.back()->forward; @@ -232,13 +233,15 @@ bool Playback::handleExitFrame(const frame_t frameDelta) m_playing.back()->invertForward(); return decrementRepeat(frameDelta); } - else if (m_playMode == PlayInLoop && frameDelta < 0 - && m_frame == firstTagFrame(tag)) { - PLAY_TRACE(" Going to last frame=", lastTagFrame(tag), - " (PlayInLoop) frame=", m_frame, " forward=", forward); + else if (m_playMode == PlayInLoop) { + if (frameDelta < 0 && m_frame == firstTagFrame(tag)) { + PLAY_TRACE(" Going to last frame=", lastTagFrame(tag), + " (PlayInLoop) frame=", m_frame, " forward=", forward); - m_frame = lastTagFrame(tag); - return false; + m_frame = lastTagFrame(tag); + return false; + } + break; } } diff --git a/src/doc/playback_tests.cpp b/src/doc/playback_tests.cpp index f45c2c04b..aa68abfa1 100644 --- a/src/doc/playback_tests.cpp +++ b/src/doc/playback_tests.cpp @@ -477,8 +477,6 @@ TEST(Playback, TwoLoopsInCascade) TEST(Playback, TwoLoopsInCascadeReverse) { - GTEST_SKIP() << "TODO not yet ready"; - // A // <---- // B