diff options
| author | Mel <einebeere@gmail.com> | 2023-08-14 03:40:10 +0200 |
|---|---|---|
| committer | Mel <einebeere@gmail.com> | 2023-08-14 03:40:10 +0200 |
| commit | 7562a79fa214245544cb379423314c3a0766a7f2 (patch) | |
| tree | 0aaafd06c6026fabc82dbc3454487d009c9043e7 /src/Entities | |
| parent | 5a1b126f1f6d55226c2b5068d0c17c428fd29ba8 (diff) | |
| download | meowcraft-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.cpp | 17 | ||||
| -rw-r--r-- | src/Entities/Player.hpp | 4 |
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); |
