فهرست منبع

Make oob culling cleaner/more extensible.

Sam Jaffe 6 سال پیش
والد
کامیت
b005627ad3
1فایلهای تغییر یافته به همراه15 افزوده شده و 10 حذف شده
  1. 15 10
      src/level.cxx

+ 15 - 10
src/level.cxx

@@ -16,6 +16,7 @@
 #include "danmaku/serial.hpp"
 #include "game/graphics/renderer.hpp"
 #include "game/math/common.hpp"
+#include "game/math/compare.hpp"
 #include "game/util/env.hpp"
 #include "resource_factory/prototype_factory.hpp"
 
@@ -72,21 +73,25 @@ void level::add_bullet(bullet b) {
   collidables[0].emplace_back(bullets_.back().get());
 }
 
+template <typename Iter>
+void remove_collider_references(Iter it, Iter end,
+                                std::vector<engine::collidable *> & vec) {
+  auto remove_collider = [&vec](decltype(*it) & ptr) {
+    vec.erase(std::remove(vec.begin(), vec.end(), ptr.get()), vec.end());
+  };
+  std::for_each(it, end, remove_collider);
+}
+
 template <typename T>
 void level::perform_oob_culling_impl(std::vector<std::unique_ptr<T>> & data) {
   // TODO: Aquire screen size correctly...?
-  math::dim2::rectangle bound{{{0.f, 0.f}}, {{3840.f, 2160.f}}};
-  auto is_oob = [&bound](std::unique_ptr<T> & ptr) {
-    return !math::intersects(ptr->render_info().points, bound);
+  // math::dim2::rectangle bound{{{0.f, 0.f}}, {{3840.f, 2160.f}}};
+  auto is_oob = [this](std::unique_ptr<T> & ptr) {
+    return !in_bounds(ptr.get());
   };
   auto it = std::remove_if(data.begin(), data.end(), is_oob);
-  auto remove_collider = [this](std::unique_ptr<T> & ptr) {
-    // TODO: colliders, use the collision enums.
-    collidables[0].erase(
-        std::remove(collidables[0].begin(), collidables[0].end(), ptr.get()),
-        collidables[0].end());
-  };
-  std::for_each(it, data.end(), remove_collider);
+  // TODO: colliders, use the collision enums.
+  remove_collider_references(it, data.end(), collidables[0]);
   data.erase(it, data.end());
 }