summary refs log tree commit diff
path: root/src/Entities
diff options
context:
space:
mode:
authorMel <einebeere@gmail.com>2023-08-14 03:40:10 +0200
committerMel <einebeere@gmail.com>2023-08-14 03:40:10 +0200
commit7562a79fa214245544cb379423314c3a0766a7f2 (patch)
tree0aaafd06c6026fabc82dbc3454487d009c9043e7 /src/Entities
parent5a1b126f1f6d55226c2b5068d0c17c428fd29ba8 (diff)
downloadmeowcraft-7562a79fa214245544cb379423314c3a0766a7f2.tar.zst
meowcraft-7562a79fa214245544cb379423314c3a0766a7f2.zip
Generate AABBs for terrain that collides with Player
Diffstat (limited to 'src/Entities')
-rw-r--r--src/Entities/Player.cpp17
-rw-r--r--src/Entities/Player.hpp4
2 files changed, 15 insertions, 6 deletions
diff --git a/src/Entities/Player.cpp b/src/Entities/Player.cpp
index 175b59e..6c94490 100644
--- a/src/Entities/Player.cpp
+++ b/src/Entities/Player.cpp
@@ -18,7 +18,8 @@ void Player::update(const Time& time, GFX::Window& window, GFX::Camera& camera,
     auto direction = m_transform.right() * x + Vec3(0, y, 0) + m_transform.forward() * z;
     auto position = m_transform.position() + direction * move_speed;
 
-    if (!collides_with_terrain(position, world)) move_to(position);
+    auto collisions = colliding_terrain(position, world);
+    if (collisions.empty()) move_to(position);
     rotate({r.y() * rotation_speed, r.x() * rotation_speed, 0.0f});
 
     update_camera_position(camera);
@@ -53,18 +54,24 @@ void Player::update_camera_position(GFX::Camera& camera) {
     camera.set_angles(m_transform.rotation());
 }
 
-Bool Player::collides_with_terrain(Position::World new_position, World::World& world) {
-    auto corners = bounding_box_for_position(new_position).corners();
+FlexArray<AABB, Player::MaxCollidingTerrain> Player::colliding_terrain(
+    Position::World new_position,
+    World::World& world
+) {
+    FlexArray<AABB, MaxCollidingTerrain> colliding_blocks;
 
+    auto corners = bounding_box_for_position(new_position).corners();
     for (auto corner : corners) {
         auto block_position = Position::World(corner).round_to_block();
         if (block_position.y() < 0 || block_position.y() >= World::Chunk::Height) continue;
 
         auto block = world.block_at(block_position);
-        if (!block.empty()) return true;
+        if (!block.empty()) {
+            colliding_blocks.push_back(World::Chunk::block_bounds(block_position.to_local()));
+        }
     }
 
-    return false;
+    return colliding_blocks;
 }
 
 AABB Player::bounding_box_for_position(Position::World position) {
diff --git a/src/Entities/Player.hpp b/src/Entities/Player.hpp
index 86d8c90..0422509 100644
--- a/src/Entities/Player.hpp
+++ b/src/Entities/Player.hpp
@@ -1,5 +1,6 @@
 #pragma once
 
+#include "../Common/FlexArray.hpp"
 #include "../Time.hpp"
 #include "../Transform.hpp"
 #include "../GFX/Camera.hpp"
@@ -27,7 +28,8 @@ public:
 private:
     void update_camera_position(GFX::Camera& camera);
 
-    static Bool collides_with_terrain(Position::World new_position, World::World& world);
+    static constexpr UInt MaxCollidingTerrain = 34;
+    static FlexArray<AABB, MaxCollidingTerrain> colliding_terrain(Position::World new_position, World::World& world);
 
     // Creates a bounding box where `position` is at the center of the bottom face.
     static AABB bounding_box_for_position(Position::World position);