mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-07-01 11:03:54 -07:00
fix remaining wonkiness with rewind buffering in replays (#5235)
This commit is contained in:
parent
69741d858c
commit
315cbc0925
2 changed files with 15 additions and 10 deletions
|
|
@ -6,7 +6,8 @@
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
|
|
||||||
ReplayTimelineWidget::ReplayTimelineWidget(QWidget *parent)
|
ReplayTimelineWidget::ReplayTimelineWidget(QWidget *parent)
|
||||||
: QWidget(parent), maxBinValue(1), maxTime(1), timeScaleFactor(1.0), currentTime(0), currentEvent(0)
|
: QWidget(parent), maxBinValue(1), maxTime(1), timeScaleFactor(1.0), currentVisualTime(0), currentProcessedTime(0),
|
||||||
|
currentEvent(0)
|
||||||
{
|
{
|
||||||
replayTimer = new QTimer(this);
|
replayTimer = new QTimer(this);
|
||||||
connect(replayTimer, SIGNAL(timeout()), this, SLOT(replayTimerTimeout()));
|
connect(replayTimer, SIGNAL(timeout()), this, SLOT(replayTimerTimeout()));
|
||||||
|
|
@ -58,7 +59,7 @@ void ReplayTimelineWidget::paintEvent(QPaintEvent * /* event */)
|
||||||
painter.fillPath(path, Qt::black);
|
painter.fillPath(path, Qt::black);
|
||||||
|
|
||||||
const QColor barColor = QColor::fromHsv(120, 255, 255, 100);
|
const QColor barColor = QColor::fromHsv(120, 255, 255, 100);
|
||||||
quint64 w = (quint64)(width() - 1) * (quint64)currentTime / maxTime;
|
quint64 w = (quint64)(width() - 1) * (quint64)currentVisualTime / maxTime;
|
||||||
painter.fillRect(0, 0, static_cast<int>(w), height() - 1, barColor);
|
painter.fillRect(0, 0, static_cast<int>(w), height() - 1, barColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -85,8 +86,8 @@ void ReplayTimelineWidget::skipToTime(int newTime, bool doRewindBuffering)
|
||||||
|
|
||||||
newTime -= newTime % TIMER_INTERVAL_MS; // Time should always be a multiple of the interval
|
newTime -= newTime % TIMER_INTERVAL_MS; // Time should always be a multiple of the interval
|
||||||
|
|
||||||
const bool isBackwardsSkip = newTime < currentTime;
|
const bool isBackwardsSkip = newTime < currentProcessedTime;
|
||||||
currentTime = newTime;
|
currentVisualTime = newTime;
|
||||||
|
|
||||||
if (isBackwardsSkip) {
|
if (isBackwardsSkip) {
|
||||||
handleBackwardsSkip(doRewindBuffering);
|
handleBackwardsSkip(doRewindBuffering);
|
||||||
|
|
@ -136,23 +137,25 @@ QSize ReplayTimelineWidget::minimumSizeHint() const
|
||||||
|
|
||||||
void ReplayTimelineWidget::replayTimerTimeout()
|
void ReplayTimelineWidget::replayTimerTimeout()
|
||||||
{
|
{
|
||||||
currentTime += TIMER_INTERVAL_MS;
|
currentVisualTime += TIMER_INTERVAL_MS;
|
||||||
|
|
||||||
processNewEvents(NORMAL_PLAYBACK);
|
processNewEvents(NORMAL_PLAYBACK);
|
||||||
|
|
||||||
if (!(currentTime % 1000))
|
if (!(currentVisualTime % 1000))
|
||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Processes all unprocessed events up to the current time.
|
/// Processes all unprocessed events up to the current time.
|
||||||
void ReplayTimelineWidget::processNewEvents(PlaybackMode playbackMode)
|
void ReplayTimelineWidget::processNewEvents(PlaybackMode playbackMode)
|
||||||
{
|
{
|
||||||
while ((currentEvent < replayTimeline.size()) && (replayTimeline[currentEvent] < currentTime)) {
|
currentProcessedTime = currentVisualTime;
|
||||||
|
|
||||||
|
while ((currentEvent < replayTimeline.size()) && (replayTimeline[currentEvent] < currentProcessedTime)) {
|
||||||
Player::EventProcessingOptions options;
|
Player::EventProcessingOptions options;
|
||||||
|
|
||||||
// backwards skip => always skip reveal windows
|
// backwards skip => always skip reveal windows
|
||||||
// forwards skip => skip reveal windows that don't happen within a big skip of the target
|
// forwards skip => skip reveal windows that don't happen within a big skip of the target
|
||||||
if (playbackMode == BACKWARD_SKIP || currentTime - replayTimeline[currentEvent] > BIG_SKIP_MS)
|
if (playbackMode == BACKWARD_SKIP || currentProcessedTime - replayTimeline[currentEvent] > BIG_SKIP_MS)
|
||||||
options |= Player::EventProcessingOption::SKIP_REVEAL_WINDOW;
|
options |= Player::EventProcessingOption::SKIP_REVEAL_WINDOW;
|
||||||
|
|
||||||
// backwards skip => always skip tap animation
|
// backwards skip => always skip tap animation
|
||||||
|
|
@ -186,5 +189,5 @@ void ReplayTimelineWidget::stopReplay()
|
||||||
|
|
||||||
void ReplayTimelineWidget::skipByAmount(int amount)
|
void ReplayTimelineWidget::skipByAmount(int amount)
|
||||||
{
|
{
|
||||||
skipToTime(currentTime + amount, true);
|
skipToTime(currentVisualTime + amount, amount < 0);
|
||||||
}
|
}
|
||||||
|
|
@ -35,7 +35,9 @@ private:
|
||||||
QList<int> histogram;
|
QList<int> histogram;
|
||||||
int maxBinValue, maxTime;
|
int maxBinValue, maxTime;
|
||||||
qreal timeScaleFactor;
|
qreal timeScaleFactor;
|
||||||
int currentTime;
|
int currentVisualTime; // time currently displayed by the timeline
|
||||||
|
int currentProcessedTime; // time that events are currently processed up to. Could differ from visual time due to
|
||||||
|
// rewind buffering
|
||||||
int currentEvent;
|
int currentEvent;
|
||||||
|
|
||||||
void skipToTime(int newTime, bool doRewindBuffering);
|
void skipToTime(int newTime, bool doRewindBuffering);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue