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>
48 lowerCorner =
other.lowerCorner;
49 upperCorner =
other.upperCorner;
54template <
typename T,
size_t N>
57 lowerCorner = std::move(
other.lowerCorner);
58 upperCorner = std::move(
other.upperCorner);
63template <
typename T,
size_t N>
66 return upperCorner[0] - lowerCorner[0];
69template <
typename T,
size_t N>
73 return upperCorner[1] - lowerCorner[1];
76template <
typename T,
size_t N>
80 return upperCorner[2] - lowerCorner[2];
83template <
typename T,
size_t N>
86 return upperCorner[
axis] - lowerCorner[
axis];
89template <
typename T,
size_t N>
92 for (
size_t i = 0; i <
N; ++i)
94 if (upperCorner[i] <
other.lowerCorner[i] ||
95 lowerCorner[i] >
other.upperCorner[i])
104template <
typename T,
size_t N>
107 for (
size_t i = 0; i <
N; ++i)
109 if (upperCorner[i] < point[i] || lowerCorner[i] > point[i])
118template <
typename T,
size_t N>
122 T max = std::numeric_limits<T>::max();
125 for (
size_t i = 0; i <
N; ++i)
132 std::swap(near, far);
147template <
typename T,
size_t N>
154 T max = std::numeric_limits<T>::max();
157 for (
size_t i = 0; i <
N; ++i)
164 std::swap(near, far);
179 if (Contains(
ray.origin))
193template <
typename T,
size_t N>
196 return (upperCorner + lowerCorner) /
static_cast<T>(2);
199template <
typename T,
size_t N>
205template <
typename T,
size_t N>
211template <
typename T,
size_t N>
214 lowerCorner = VectorType::MakeConstant(std::numeric_limits<T>::max());
215 upperCorner = VectorType::MakeConstant(-std::numeric_limits<T>::max());
218template <
typename T,
size_t N>
221 lowerCorner =
Min(lowerCorner, point);
222 upperCorner =
Max(upperCorner, point);
225template <
typename T,
size_t N>
228 lowerCorner =
Min(lowerCorner,
other.lowerCorner);
229 upperCorner =
Max(upperCorner,
other.upperCorner);
232template <
typename T,
size_t N>
235 lowerCorner -=
delta;
236 upperCorner +=
delta;
239template <
typename T,
size_t N>
244 for (
size_t i = 0; i <
N; ++i)
247 (upperCorner[i] - lowerCorner[i]);
252template <
typename T,
size_t N>
259template <
typename T,
size_t N>
262 for (
size_t i = 0; i <
N; ++i)
264 if (lowerCorner[i] >= upperCorner[i])
273template <
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:64
bool Contains(const VectorType &point) const
Returns true if the input vector is inside of this box.
Definition BoundingBox-Impl.hpp:105
bool Intersects(const RayType &ray) const
Returns true if the input ray is intersecting with this box.
Definition BoundingBox-Impl.hpp:119
BoundingBoxRayIntersection< T > ClosestIntersection(const RayType &ray) const
Definition BoundingBox-Impl.hpp:148
T Length(size_t axis)
Returns length of the box in given axis.
Definition BoundingBox-Impl.hpp:84
VectorType MidPoint() const
Returns the mid-point of this box.
Definition BoundingBox-Impl.hpp:194
VectorType Corner(size_t idx) const
Returns corner position. Index starts from x-first order.
Definition BoundingBox-Impl.hpp:240
T DiagonalLength() const
Returns diagonal length of this box.
Definition BoundingBox-Impl.hpp:200
void Reset()
Resets this box to initial state (min=infinite, max=-infinite).
Definition BoundingBox-Impl.hpp:212
bool IsEmpty() const
Returns true if the box is empty.
Definition BoundingBox-Impl.hpp:260
void Merge(const VectorType &point)
Merges this and other point.
Definition BoundingBox-Impl.hpp:219
BoundingBox & operator=(const BoundingBox &other)
Copy assignment operator.
Definition BoundingBox-Impl.hpp:46
void Expand(T delta)
Definition BoundingBox-Impl.hpp:233
T DiagonalLengthSquared() const
Returns squared diagonal length of this box.
Definition BoundingBox-Impl.hpp:206
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:90
BoundingBox< U, N > CastTo() const
Returns box with different value type.
Definition BoundingBox-Impl.hpp:275
VectorType Clamp(const VectorType &point) const
Returns the clamped point.
Definition BoundingBox-Impl.hpp:253
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:21
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:738