-
Notifications
You must be signed in to change notification settings - Fork 1
/
raindrop_effect.cpp
67 lines (52 loc) · 1.58 KB
/
raindrop_effect.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include "raindrop_effect.hpp"
#include "color_utils.hpp"
#include <cmath>
Raindrop::Raindrop(unsigned int col, double start, Color3 color)
: m_col(col), m_speed(1 + (rand() % 7) ), m_start(start), m_color(color)
{
}
void Raindrop::fill(EffectBuffer& buffer, const EffectState& state)
{
double elapsed = state.time - m_start;
if (0 > elapsed) {
return;
}
double step_time = m_speed / buffer.height();
unsigned int length = buffer.height() / std::min(2.0, m_speed*0.5f);
double offset = elapsed / step_time;
double step = std::floor(offset);
if ((step - length) > buffer.height()) {
reset(state.time);
return;
}
for (int pos = length - 1; pos >= 0; --pos) {
int position = offset - pos;
if (position < 0 || position >= buffer.height()) {
continue;
}
Color3 col = m_color * float(((float(length - pos)) / length) * std::min(1.0f, (float(length) / (1.5f * pos))));
if (pos == 0)
col *= offset - step;
buffer.set(m_col, position, col);
}
return;
}
void Raindrop::reset(const double time)
{
m_start = time;
m_speed = 1 + ((rand() % 1200) / 100.0f);
}
RaindropEffect::RaindropEffect(unsigned int width, double time)
{
srand(0);
for (unsigned int col = 0; col < width; ++col) {
Color3 color = HSVtoRGB(Color3(col / 50.0f, 1.0f, 1.0f));
drops.push_back(Raindrop(col, time + (rand() % 25) / 10.0f, color));
}
}
void RaindropEffect::fill(EffectBuffer& buffer, const EffectState& state)
{
for (auto& drop : drops) {
drop.fill(buffer, state);
}
}