From 9ebd51c8f89799d5b6125e34028528d52b0b0b8e Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Sat, 2 Jan 2021 14:35:02 +0300 Subject: [PATCH] Fixed blobs paint with high update rate. --- ui/paint/blob.cpp | 11 ++++++----- ui/paint/blob.h | 4 ++-- ui/paint/blobs.cpp | 18 ++++++++++++++++-- ui/paint/blobs_linear.cpp | 16 +++++++++++++--- 4 files changed, 37 insertions(+), 12 deletions(-) diff --git a/ui/paint/blob.cpp b/ui/paint/blob.cpp index b7f783e..22ccf19 100644 --- a/ui/paint/blob.cpp +++ b/ui/paint/blob.cpp @@ -52,11 +52,12 @@ void Blob::generateSingleValues(int i) { + kSegmentSpeedDiff * std::abs(RandomAdditional()); } -void Blob::update(float level, float speedScale) { +void Blob::update(float level, float speedScale, float64 rate) { for (auto i = 0; i < _segmentsCount; i++) { auto &segment = segmentAt(i); - segment.progress += (segment.speed * _minSpeed) - + level * segment.speed * _maxSpeed * speedScale; + segment.progress += (_minSpeed + level * _maxSpeed * speedScale) + * segment.speed + * rate; if (segment.progress >= 1) { generateSingleValues(i); generateTwoValues(i); @@ -152,9 +153,9 @@ void RadialBlob::generateTwoValues(int i) { radius.setNext(_radiuses.min + std::abs(RandomAdditional()) * radDiff); } -void RadialBlob::update(float level, float speedScale) { +void RadialBlob::update(float level, float speedScale, float64 rate) { _scale = level; - Blob::update(level, speedScale); + Blob::update(level, speedScale, rate); } Blob::Segment &RadialBlob::segmentAt(int i) { diff --git a/ui/paint/blob.h b/ui/paint/blob.h index e48e621..805914b 100644 --- a/ui/paint/blob.h +++ b/ui/paint/blob.h @@ -20,7 +20,7 @@ public: Blob(int n, float minSpeed = 0, float maxSpeed = 0); virtual ~Blob() = default; - void update(float level, float speedScale); + void update(float level, float speedScale, float64 rate); void generateBlob(); void setRadiuses(Radiuses values); @@ -59,7 +59,7 @@ public: RadialBlob(int n, float minScale, float minSpeed = 0, float maxSpeed = 0); void paint(Painter &p, const QBrush &brush, float outerScale = 1.); - void update(float level, float speedScale); + void update(float level, float speedScale, float64 rate); private: struct Segment : Blob::Segment { diff --git a/ui/paint/blobs.cpp b/ui/paint/blobs.cpp index 6bce7f6..903f5d9 100644 --- a/ui/paint/blobs.cpp +++ b/ui/paint/blobs.cpp @@ -10,6 +10,13 @@ namespace Ui::Paint { +namespace { + +constexpr auto kRateLimitF = 1000. / 60.; +constexpr auto kRateLimit = int(kRateLimitF + 0.5); // Round. + +} // namespace + Blobs::Blobs( std::vector blobDatas, float levelDuration, @@ -76,7 +83,6 @@ void Blobs::resetLevel() { void Blobs::paint(Painter &p, const QBrush &brush, float outerScale) { const auto opacity = p.opacity(); for (auto i = 0; i < _blobs.size(); i++) { - _blobs[i].update(_levelValue.current(), _blobDatas[i].speedScale); const auto alpha = _blobDatas[i].alpha; if (alpha != 1.) { p.setOpacity(opacity * alpha); @@ -89,7 +95,15 @@ void Blobs::paint(Painter &p, const QBrush &brush, float outerScale) { } void Blobs::updateLevel(crl::time dt) { - _levelValue.update((dt > 20) ? 17 : dt); + const auto limitedDt = (dt > 20) ? kRateLimit : dt; + _levelValue.update(limitedDt); + + for (auto i = 0; i < _blobs.size(); i++) { + _blobs[i].update( + _levelValue.current(), + _blobDatas[i].speedScale, + limitedDt / kRateLimitF); + } } float64 Blobs::currentLevel() const { diff --git a/ui/paint/blobs_linear.cpp b/ui/paint/blobs_linear.cpp index 37d92ec..1f46e1f 100644 --- a/ui/paint/blobs_linear.cpp +++ b/ui/paint/blobs_linear.cpp @@ -10,6 +10,13 @@ namespace Ui::Paint { +namespace { + +constexpr auto kRateLimitF = 1000. / 60.; +constexpr auto kRateLimit = int(kRateLimitF + 0.5); // Round. + +} // namespace + LinearBlobs::LinearBlobs( std::vector blobDatas, float levelDuration, @@ -75,7 +82,6 @@ void LinearBlobs::paint(Painter &p, const QBrush &brush, int width) { PainterHighQualityEnabler hq(p); const auto opacity = p.opacity(); for (auto i = 0; i < _blobs.size(); i++) { - _blobs[i].update(_levelValue.current(), _blobDatas[i].speedScale); const auto alpha = _blobDatas[i].alpha; if (alpha != 1.) { p.setOpacity(opacity * alpha); @@ -88,8 +94,8 @@ void LinearBlobs::paint(Painter &p, const QBrush &brush, int width) { } void LinearBlobs::updateLevel(crl::time dt) { - const auto d = (dt > 20) ? 17 : dt; - _levelValue.update(d); + const auto limitedDt = (dt > 20) ? kRateLimit : dt; + _levelValue.update(limitedDt); const auto level = (float)currentLevel(); for (auto i = 0; i < _blobs.size(); i++) { @@ -97,6 +103,10 @@ void LinearBlobs::updateLevel(crl::time dt) { _blobs[i].setRadiuses({ data.minRadius, data.idleRadius + (data.maxRadius - data.idleRadius) * level }); + _blobs[i].update( + _levelValue.current(), + data.speedScale, + limitedDt / kRateLimitF); } }