11#ifndef CUBBYFLOW_BOUNDING_BOX_IMPL_HPP
12#define CUBBYFLOW_BOUNDING_BOX_IMPL_HPP
16template <
typename T,
size_t N>
22template <
typename T,
size_t N>
30template <
typename T,
size_t N>
32 : lowerCorner(
other.lowerCorner), upperCorner(
other.upperCorner)
37template <
typename T,
size_t N>
39 : lowerCorner(std::move(
other.lowerCorner)),
40 upperCorner(std::move(
other.upperCorner))
45template <
typename T,
size_t N>
49template <
typename T,
size_t N>
52 lowerCorner = std::move(
other.lowerCorner);
53 upperCorner = std::move(
other.upperCorner);
58template <
typename T,
size_t N>
61 return upperCorner[0] - lowerCorner[0];
64template <
typename T,
size_t N>
68 return upperCorner[1] - lowerCorner[1];
71template <
typename T,
size_t N>
75 return upperCorner[2] - lowerCorner[2];
78template <
typename T,
size_t N>
81 return upperCorner[
axis] - lowerCorner[
axis];
84template <
typename T,
size_t N>
87 for (
size_t i = 0; i <
N; ++i)
89 if (upperCorner[i] <
other.lowerCorner[i] ||
90 lowerCorner[i] >
other.upperCorner[i])
99template <
typename T,
size_t N>
102 for (
size_t i = 0; i <
N; ++i)
104 if (upperCorner[i] < point[i] || lowerCorner[i] > point[i])
113template <
typename T,
size_t N>
117 T max = std::numeric_limits<T>::max();
120 for (
size_t i = 0; i <
N; ++i)
127 std::swap(near, far);
142template <
typename T,
size_t N>
149 T max = std::numeric_limits<T>::max();
152 for (
size_t i = 0; i <
N; ++i)
159 std::swap(near, far);
174 if (Contains(
ray.origin))
188template <
typename T,
size_t N>
191 return (upperCorner + lowerCorner) /
static_cast<T>(2);
194template <
typename T,
size_t N>
200template <
typename T,
size_t N>
206template <
typename T,
size_t N>
209 lowerCorner = VectorType::MakeConstant(std::numeric_limits<T>::max());
210 upperCorner = VectorType::MakeConstant(-std::numeric_limits<T>::max());
213template <
typename T,
size_t N>
216 lowerCorner =
Min(lowerCorner, point);
217 upperCorner =
Max(upperCorner, point);
220template <
typename T,
size_t N>
223 lowerCorner =
Min(lowerCorner,
other.lowerCorner);
224 upperCorner =
Max(upperCorner,
other.upperCorner);
227template <
typename T,
size_t N>
230 lowerCorner -=
delta;
231 upperCorner +=
delta;
234template <
typename T,
size_t N>
239 for (
size_t i = 0; i <
N; ++i)
242 (upperCorner[i] - lowerCorner[i]);
247template <
typename T,
size_t N>
254template <
typename T,
size_t N>
257 for (
size_t i = 0; i <
N; ++i)
259 if (lowerCorner[i] >= upperCorner[i])
268template <
typename T,
size_t N>
N-D axis-aligned bounding box class.
Definition BoundingBox.hpp:47
T Width() const
Returns width of the box.
Definition BoundingBox-Impl.hpp:59
bool Contains(const VectorType &point) const
Returns true if the input vector is inside of this box.
Definition BoundingBox-Impl.hpp:100
bool Intersects(const RayType &ray) const
Returns true if the input ray is intersecting with this box.
Definition BoundingBox-Impl.hpp:114
BoundingBoxRayIntersection< T > ClosestIntersection(const RayType &ray) const
Definition BoundingBox-Impl.hpp:143
T Length(size_t axis)
Returns length of the box in given axis.
Definition BoundingBox-Impl.hpp:79
VectorType MidPoint() const
Returns the mid-point of this box.
Definition BoundingBox-Impl.hpp:189
VectorType Corner(size_t idx) const
Returns corner position. Index starts from x-first order.
Definition BoundingBox-Impl.hpp:235
T DiagonalLength() const
Returns diagonal length of this box.
Definition BoundingBox-Impl.hpp:195
void Reset()
Resets this box to initial state (min=infinite, max=-infinite).
Definition BoundingBox-Impl.hpp:207
bool IsEmpty() const
Returns true if the box is empty.
Definition BoundingBox-Impl.hpp:255
void Merge(const VectorType &point)
Merges this and other point.
Definition BoundingBox-Impl.hpp:214
BoundingBox & operator=(const BoundingBox &other)
Copy assignment operator.
void Expand(T delta)
Definition BoundingBox-Impl.hpp:228
T DiagonalLengthSquared() const
Returns squared diagonal length of this box.
Definition BoundingBox-Impl.hpp:201
BoundingBox()
Default constructor.
Definition BoundingBox-Impl.hpp:17
bool Overlaps(const BoundingBox &other) const
Returns true of this box and other box overlaps.
Definition BoundingBox-Impl.hpp:85
BoundingBox< U, N > CastTo() const
Returns box with different value type.
Definition BoundingBox-Impl.hpp:270
VectorType Clamp(const VectorType &point) const
Returns the clamped point.
Definition BoundingBox-Impl.hpp:248
ValueType Length() const
Definition MatrixExpression-Impl.hpp:278
ValueType Min() const
Definition MatrixExpression-Impl.hpp:99
ValueType LengthSquared() const
Definition MatrixExpression-Impl.hpp:286
ValueType Max() const
Definition MatrixExpression-Impl.hpp:120
Class for N-D ray.
Definition Ray.hpp:26
Definition pybind11Utils.hpp:22
constexpr size_t ONE_SIZE
One size_t.
Definition Constants.hpp:47
std::enable_if_t< std::is_arithmetic< T >::value, T > Clamp(T val, T low, T high)
Returns the clamped value.
Definition MathUtils-Impl.hpp:166
Matrix< T, Rows, 1 > Vector
Definition Matrix.hpp:719