18#include <glm/geometric.hpp>
49 float tMax = maxDistance;
50 glm::vec3 hitNormal{0.0f};
52 for (
int axis = 0; axis < 3; ++axis) {
54 if (origin[axis] < box.
min[axis] || origin[axis] > box.
max[axis]) {
60 const float invDir = 1.0f / direction[axis];
61 float t1 = (box.
min[axis] - origin[axis]) * invDir;
62 float t2 = (box.
max[axis] - origin[axis]) * invDir;
63 glm::vec3 axisNormal{0.0f};
64 axisNormal[axis] = (invDir >= 0.0f) ? -1.0f : 1.0f;
68 axisNormal = -axisNormal;
73 hitNormal = axisNormal;
76 tMax = std::min(tMax, t2);
82 if (tMin < 0.0f || tMin > maxDistance) {
87 outNormal = hitNormal;
97 const float denom = glm::dot(plane.normal, direction);
102 const float distance = (plane.distance - glm::dot(plane.normal, origin)) / denom;
103 if (distance < 0.0f || distance >= bestHit.
distance) {
109 bestHit.
point = origin + direction * distance;
110 bestHit.
normal = plane.normal;
116 glm::vec3 normal{0.0f};
123 bestHit.
point = origin + direction * distance;
140 if (entity == shooter) {
150 glm::vec3 normal{0.0f};
157 bestHit.
point = origin + direction * distance;
AABB collision shape component for physics entities.
World-space position component for ECS entities.
Projectile component and weapon/surface type enumerations.
SurfaceType
Surface material hit by a projectile — drives impact effect parameters.
Definition Projectile.hpp:13
Shared ECS registry type alias for the game engine.
entt::registry Registry
Shared ECS registry type alias.
Definition Registry.hpp:11
Swept AABB and sphere collision queries against world geometry.
Shared test world geometry compiled identically on client and server.
Pure physics math — no ECS types, no registry.
Definition Movement.cpp:14
HitscanHit raycastPlayers(Registry ®istry, entt::entity shooter, glm::vec3 origin, glm::vec3 direction, float maxDistance)
Raycast against all player hitboxes (axis-aligned capsule approximation).
Definition Raycast.hpp:133
constexpr float k_hitscanRange
Maximum hitscan distance in world units.
Definition Raycast.hpp:24
const WorldGeometry & testWorld()
The physics test playground.
Definition WorldData.hpp:86
bool raycastAABB(glm::vec3 origin, glm::vec3 direction, const WorldAABB &box, float maxDistance, float &outDistance, glm::vec3 &outNormal)
Ray vs axis-aligned box intersection (slab method).
Definition Raycast.hpp:41
HitscanHit resolveHitscan(Registry ®istry, entt::entity shooter, glm::vec3 origin, glm::vec3 direction)
Full hitscan resolution: world geometry first, then players (closest wins).
Definition Raycast.hpp:167
HitscanHit raycastWorld(glm::vec3 origin, glm::vec3 direction, const WorldGeometry &world)
Raycast against all static world geometry (planes + boxes).
Definition Raycast.hpp:92
constexpr float k_parallelEpsilon
Epsilon for parallel-ray checks.
Definition Raycast.hpp:27
Axis-aligned bounding box defined by half-extents from the entity's Position.
Definition CollisionShape.hpp:16
glm::vec3 halfExtents
AABB half-dimensions (units).
Definition CollisionShape.hpp:17
World-space position of an entity, in game units.
Definition Position.hpp:10
glm::vec3 value
XYZ position (Y-up, Quake units).
Definition Position.hpp:11
Result of a hitscan raycast.
Definition Raycast.hpp:31
SurfaceType surface
Definition Raycast.hpp:36
bool hit
Definition Raycast.hpp:32
float distance
Definition Raycast.hpp:33
glm::vec3 normal
Definition Raycast.hpp:35
glm::vec3 point
Definition Raycast.hpp:34
entt::entity entity
Definition Raycast.hpp:37
An infinite plane dividing free space from solid geometry.
Definition SweptCollision.hpp:23
An axis-aligned box in world space, used as static collision geometry.
Definition SweptCollision.hpp:30
glm::vec3 max
Maximum corner (highest x, y, z).
Definition SweptCollision.hpp:32
glm::vec3 min
Minimum corner (lowest x, y, z).
Definition SweptCollision.hpp:31
All world collision geometry for one tick.
Definition SweptCollision.hpp:48
std::span< const Plane > planes
Definition SweptCollision.hpp:49
std::span< const WorldAABB > boxes
Definition SweptCollision.hpp:50