diff options
Diffstat (limited to 'gfx/frustum.cpp')
| -rw-r--r-- | gfx/frustum.cpp | 42 |
1 files changed, 23 insertions, 19 deletions
diff --git a/gfx/frustum.cpp b/gfx/frustum.cpp index faa676d..294fe5d 100644 --- a/gfx/frustum.cpp +++ b/gfx/frustum.cpp @@ -21,18 +21,6 @@ Frustum::updateView(const glm::mat4 & newView) bool Frustum::contains(const BoundingBox & aabb) const { - return boundByPlanes(aabb, FACES); -} - -bool -Frustum::shadedBy(const BoundingBox & aabb) const -{ - return boundByPlanes(aabb, FACES - 1); -} - -bool -Frustum::boundByPlanes(const BoundingBox & aabb, size_t nplanes) const -{ static constexpr auto EXTENT_CORNER_IDXS = [] { using Extent = GlobalPosition3D BoundingBox::*; constexpr auto EXTENTS = std::array {&BoundingBox::min, &BoundingBox::max}; @@ -48,9 +36,22 @@ Frustum::boundByPlanes(const BoundingBox & aabb, size_t nplanes) const = EXTENT_CORNER_IDXS * [relativeAabb = aabb - position](auto idxs) -> glm::vec4 { return {(relativeAabb.*(idxs.x)).x, (relativeAabb.*(idxs.y)).y, (relativeAabb.*(idxs.z)).z, 1.F}; }; - return std::ranges::none_of(std::span(planes).subspan(0, nplanes), [&corners](const auto & frustumPlane) { - return (std::ranges::all_of(corners, [&frustumPlane](const auto & corner) { - return glm::dot(frustumPlane, corner) < 0.F; + return contains(corners, 0); +} + +bool +Frustum::contains(GlobalPosition3D point, RelativeDistance size) const +{ + return contains(std::array {RelativePosition4D {(point - position), 1.F}}, size); +} + +bool +Frustum::contains(const std::span<const RelativePosition4D> points, RelativeDistance size) const +{ + return std::ranges::none_of(planes, [&points, size](const auto & frustumPlane) { + return (std::ranges::all_of(points, [&frustumPlane, size](const auto & point) { + const auto distanceFromPlane = glm::dot(frustumPlane, point); + return distanceFromPlane < -size; })); }); } @@ -60,8 +61,11 @@ Frustum::updateCache() { viewProjection = projection * view; inverseViewProjection = glm::inverse(viewProjection); - std::ranges::transform(PLANES, planes.begin(), [vpt = glm::transpose(viewProjection)](const auto & idxs) { - const auto [idx, sgn] = idxs; - return vpt[3] + (vpt[idx] * sgn); - }); + std::ranges::transform(PLANES | std::views::take(planes.size()), planes.begin(), + [vpt = glm::transpose(viewProjection)](const auto & idxs) { + const auto [idx, sgn] = idxs; + const auto plane = vpt[3] + (vpt[idx] * sgn); + const auto mag = glm::length(plane.xyz()); + return plane / mag; + }); } |
