summaryrefslogtreecommitdiff
path: root/src/helpers/DamageRing.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/helpers/DamageRing.cpp')
-rw-r--r--src/helpers/DamageRing.cpp52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/helpers/DamageRing.cpp b/src/helpers/DamageRing.cpp
new file mode 100644
index 00000000..093e7ca6
--- /dev/null
+++ b/src/helpers/DamageRing.cpp
@@ -0,0 +1,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();
+}