Replaced raw radius values of Blob with struct.

This commit is contained in:
23rd 2020-12-03 09:52:54 +03:00
parent 5f44304a30
commit 5b0e499932
5 changed files with 62 additions and 41 deletions

View file

@ -105,9 +105,9 @@ void BlobBezier::generateBlob() {
void BlobBezier::generateBlob(float &radius, float &angle, int i) {
const auto angleDiff = _segmentAngle * 0.05;
const auto radDiff = _maxRadius - _minRadius;
const auto radDiff = _radiuses.max - _radiuses.min;
radius = _minRadius + std::abs(RandomAdditional()) * radDiff;
radius = _radiuses.min + std::abs(RandomAdditional()) * radDiff;
angle = _segmentAngle * i + RandomAdditional() * angleDiff;
_segments[i].speed = 0.017 + 0.003 * std::abs(RandomAdditional());
}
@ -127,12 +127,12 @@ void BlobBezier::update(float level, float speedScale) {
}
}
void BlobBezier::setMinRadius(float value) {
_minRadius = value;
void BlobBezier::setRadiuses(Radiuses values) {
_radiuses = values;
}
void BlobBezier::setMaxRadius(float value) {
_maxRadius = value;
BlobBezier::Radiuses BlobBezier::radiuses() const {
return _radiuses;
}
} // namespace Ui::Paint

View file

@ -12,6 +12,15 @@ namespace Ui::Paint {
class BlobBezier final {
public:
struct Radiuses {
float min = 0.;
float max = 0.;
inline bool operator==(const Radiuses &other) const {
return (min == other.min) && (max == other.max);
}
};
BlobBezier(int n, float minScale, float minSpeed = 0, float maxSpeed = 0);
void paint(Painter &p, const QBrush &brush);
@ -21,6 +30,9 @@ public:
void setMinRadius(float value);
void setMaxRadius(float value);
void setRadiuses(Radiuses values);
Radiuses radiuses() const;
private:
struct Segment {
float radius = 0.;
@ -44,8 +56,7 @@ private:
std::vector<Segment> _segments;
float64 _scale = 0;
float _minRadius = 0.;
float _maxRadius = 0.;
Radiuses _radiuses;
};

View file

@ -23,8 +23,7 @@ Blobs::Blobs(
void Blobs::init() {
for (const auto &data : _blobDatas) {
auto blob = Paint::BlobBezier(data.segmentsCount, data.minScale);
blob.setMinRadius(data.minRadius);
blob.setMaxRadius(data.maxRadius);
blob.setRadiuses({ data.minRadius, data.maxRadius });
blob.generateBlob();
_blobs.push_back(std::move(blob));
}
@ -45,22 +44,22 @@ int Blobs::size() const {
return _blobs.size();
}
void Blobs::setRadiusAt(
rpl::producer<float> &&radius,
int index,
bool isMax) {
void Blobs::setRadiusesAt(
rpl::producer<BlobBezier::Radiuses> &&radiuses,
int index) {
Expects(index >= 0 && index < size());
std::move(
radius
) | rpl::start_with_next([=](float r) {
if (isMax) {
_blobs[index].setMaxRadius(r);
} else {
_blobs[index].setMinRadius(r);
}
radiuses
) | rpl::start_with_next([=](BlobBezier::Radiuses r) {
_blobs[index].setRadiuses(std::move(r));
}, _lifetime);
}
BlobBezier::Radiuses Blobs::radiusesAt(int index) {
Expects(index >= 0 && index < size());
return _blobs[index].radiuses();
}
void Blobs::setLevel(float value) {
const auto to = std::min(_maxLevel, value) / _maxLevel;
_levelValue.start(to);

View file

@ -29,7 +29,11 @@ public:
float levelDuration,
float maxLevel);
void setRadiusAt(rpl::producer<float> &&radius, int index, bool isMax);
void setRadiusesAt(
rpl::producer<BlobBezier::Radiuses> &&radiuses,
int index);
BlobBezier::Radiuses radiusesAt(int index);
void setLevel(float value);
void paint(Painter &p, const QBrush &brush);
void updateLevel(crl::time dt);

View file

@ -20,6 +20,8 @@ namespace Ui {
namespace {
using Radiuses = Paint::BlobBezier::Radiuses;
constexpr auto kMaxLevel = 1.;
constexpr auto kLevelDuration = 100. + 500. * 0.33;
@ -125,12 +127,13 @@ bool IsInactive(CallMuteButtonType type) {
class BlobsWidget final : public RpWidget {
public:
BlobsWidget(not_null<RpWidget*> parent);
BlobsWidget(
not_null<RpWidget*> parent,
rpl::producer<bool> &&hideBlobs);
void setLevel(float level);
void setBlobBrush(QBrush brush);
void setGlowBrush(QBrush brush);
void setMainRadius(rpl::producer<float> &&radius);
[[nodiscard]] QRect innerRect() const;
@ -150,13 +153,27 @@ private:
};
BlobsWidget::BlobsWidget(not_null<RpWidget*> parent)
BlobsWidget::BlobsWidget(
not_null<RpWidget*> parent,
rpl::producer<bool> &&hideBlobs)
: RpWidget(parent)
, _blobs(MuteBlobs() | ranges::to_vector, kLevelDuration, kMaxLevel)
, _blobBrush(Qt::transparent)
, _glowBrush(Qt::transparent)
, _blobsLastTime(crl::now()) {
init();
for (auto i = 0; i < _blobs.size(); i++) {
const auto radiuses = _blobs.radiusesAt(i);
auto radiusesChange = rpl::duplicate(
hideBlobs
) | rpl::map([=](bool hide) -> Radiuses {
return hide
? Radiuses{ radiuses.min, radiuses.min }
: radiuses;
}) | rpl::distinct_until_changed();
_blobs.setRadiusesAt(std::move(radiusesChange), i);
}
}
void BlobsWidget::init() {
@ -244,15 +261,16 @@ void BlobsWidget::setLevel(float level) {
_blobs.setLevel(level);
}
void BlobsWidget::setMainRadius(rpl::producer<float> &&radius) {
_blobs.setRadiusAt(std::move(radius), 0, true);
}
CallMuteButton::CallMuteButton(
not_null<RpWidget*> parent,
CallMuteButtonState initial)
: _state(initial)
, _blobs(base::make_unique_q<BlobsWidget>(parent))
, _blobs(base::make_unique_q<BlobsWidget>(
parent,
_state.value(
) | rpl::map([](const CallMuteButtonState &state) {
return IsConnecting(state.type);
})))
, _content(parent, st::callMuteButtonActive, &st::callMuteButtonMuted)
, _radial(nullptr)
, _colors(Colors())
@ -387,17 +405,6 @@ void CallMuteButton::init() {
icon.height());
}, lifetime());
// Main blob radius.
{
auto radius = _state.value(
) | rpl::map([](const CallMuteButtonState &state) -> float {
return (IsConnecting(state.type)
? st::callMuteMainBlobMinRadius
: st::callMuteMainBlobMaxRadius) * kMainRadiusFactor;
}) | rpl::distinct_until_changed();
_blobs->setMainRadius(std::move(radius));
}
// Paint.
auto filterCallback = [=](not_null<QEvent*> e) {
if (e->type() != QEvent::Paint) {