summaryrefslogtreecommitdiff
path: root/src/helpers/DamageRing.cpp
blob: 093e7ca67bb276fd0a3683c976571a81afeda8dd (plain)
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
#include "DamageRing.hpp"

void CDamageRing::setSize(const Vector2D& size_) {
    if (size_ == size)
        return;

    size = size_;

    damageEntire();
}

bool CDamageRing::damage(const CRegion& rg) {
    CRegion clipped = rg.copy().intersect(CBox{{}, size});
    if (clipped.empty())
        return false;

    current.add(clipped);
    return true;
}

void CDamageRing::damageEntire() {
    damage(CBox{{}, size});
}

void CDamageRing::rotate() {
    previousIdx = (previousIdx + DAMAGE_RING_PREVIOUS_LEN - 1) % DAMAGE_RING_PREVIOUS_LEN;

    previous[previousIdx] = current;
    current.clear();
}

CRegion CDamageRing::getBufferDamage(int age) {
    if (age <= 0 || age > DAMAGE_RING_PREVIOUS_LEN + 1)
        return CBox{{}, size};

    CRegion damage = current;

    for (int i = 0; i < age - 1; ++i) {
        int j = (previousIdx + i) % DAMAGE_RING_PREVIOUS_LEN;
        damage.add(previous.at(j));
    }

    // don't return a ludicrous amount of rects
    if (damage.getRects().size() > 8)
        return damage.getExtents();

    return damage;
}

bool CDamageRing::hasChanged() {
    return !current.empty();
}