|
|
@@ -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());
|
|
|
}
|
|
|
|