FdkBaseLib 2.1.1
All Classes Namespaces Files Functions Variables Enumerations Enumerator Pages
fdk::Box3< T > Class Template Reference

#include <Box3.h>

Public Types

enum class  Corner : int32_t {
  MinMinMin , MaxMinMin , MaxMaxMin , MinMaxMin ,
  MinMinMax , MaxMinMax , MaxMaxMax , MinMaxMax ,
  NumCorners
}
 XYZ corner identifiers.
 
enum class  Face : int32_t {
  Front , Back , Bottom , Top ,
  Left , Right , NumFaces
}
 Face identifiers.
 

Public Member Functions

 Box3 ()
 Default ctor makes an empty-state bbox where min=<T>max() & max=-<T>max()
 
template<typename S >
 Box3 (const Box3< S > &b)
 Copy constructor supports conversion from another type.
 
 Box3 (const T array[6])
 
 Box3 (T x, T y, T z, T r, T t, T f)
 
template<typename S >
 Box3 (const Vec3< S > &_min, const Vec3< S > &_max)
 
 Box3 (T x, T y, T z)
 
 Box3 (const Vec3< T > &p)
 
template<typename S >
 Box3 (const Vec3< S > *points, size_t nPoints)
 The resulting Box3 is the intersection of all the source points.
 
template<typename S >
 Box3 (const Vec3< S > *points, size_t nPoints, const Mat4< T > &xform)
 The resulting Box3 is the intersection of all the source points transformed by 'xform'.
 
 operator Box3< fdk::half > () const
 Transmogrify as a specific type:
 
 operator Box3< float > () const
 
 operator Box3< double > () const
 
 operator Box3< int32_t > () const
 
Box3< fdk::halfasBox3h () const
 
Box3< float > asBox3f () const
 
Box3< double > asBox3d () const
 
Box3< int > asBox3i () const
 
void set (T x, T y, T z, T r, T t, T f)
 
template<typename S >
void set (const Vec3< S > &_min, const Vec3< S > &_max)
 
void set (const T array[6])
 
void set (T x, T y, T z)
 
template<typename S >
void set (const Vec3< S > &v)
 
void set (const Box3< T > &b)
 
template<typename S >
void set (const Vec3< S > *points, size_t nPoints)
 The resulting Box3 is the intersection of all the source points.
 
template<typename S >
void set (const Vec3< S > *points, size_t nPoints, const Mat4< T > &xform)
 The resulting Box3 is the intersection of all the source points transformed by 'xform'.
 
void setToZero ()
 Set all components to 0 or 1.
 
void setToOne ()
 
void setMin (const Vec3< T > &v)
 
void setMin (T x, T y, T z)
 
void setMax (const Vec3< T > &v)
 
void setMax (T x, T y, T z)
 
void setToEmptyState ()
 Sets box to empty state where min=<T>max() & max=-<T>max().
 
bool isEmpty () const
 Return true if the box is in an empty state (min=<T>max() & max=-<T>max().)
 
void clear ()
 Type-specific clear. Sets box to empty state where min=<T>max() & max=-<T>max().
 
void append (fdk::Hash &hash) const
 Add this to a fdk::Hash object.
 
bool operator== (const Box3 &b) const
 Returns true if min and max are equal. Compares on each element individually.
 
bool operator!= (const Box3 &b) const
 Returns true if any of the min and max values are different. Compares on each element individually.
 
template<typename S >
Box3 operator* (const Mat4< S > &m) const
 
template<typename S >
Box3operator*= (const Mat4< S > &m)
 
T * array ()
 Return a pointer to min.x.
 
const T * array () const
 
x () const
 left - min X
 
y () const
 bottom - min Y
 
z () const
 near - min Z
 
r () const
 right - max X
 
t () const
 top - max Y
 
f () const
 far - max Z
 
w () const
 width
 
h () const
 height
 
d () const
 depth
 
cx () const
 center X
 
cy () const
 center Y
 
cz () const
 center Z
 
Vec3< T > dimensions () const
 Return a Vec3 with width/height/depth in it.
 
Vec3< T > center () const
 Return the xyz coordinate of the bbox center.
 
Vec3< T > corner (Corner corner_index) const
 Return the xyz coordinate of one of the corners.
 
radius () const
 
minDim () const
 
maxDim () const
 
template<typename S >
bool pointIsInside (const Vec3< S > &p) const
 Returns true if point is inside the box.
 
bool pointIsInside (T x, T y, T z) const
 
void pad (T d)
 Expand or contract the box by a set amount.
 
void pad (const Vec3< T > &p)
 
void pad (T x, T y, T z)
 
void shift (const Vec3< T > &p)
 Shift the position of the box.
 
void shift (T x, T y, T z)
 
void shiftMin (T x, T y, T z)
 
void shiftMax (T x, T y, T z)
 
Box3< T > operator+ (const Vec3< T > &v) const
 
Box3< T > & operator+= (const Vec3< T > &v)
 
Box3< T > operator- (const Vec3< T > &v) const
 
Box3< T > & operator-= (const Vec3< T > &v)
 
template<typename S >
void expand (const Box3< S > &b, bool test_empty=true)
 Union the box with another. If this one is empty the other (non-empty) box is copied.
 
template<typename S >
void expand (const Vec3< S > &p, bool test_empty=true)
 Expand the box to contain a point. If empty the box is set to a zero-size at the point.
 
void expand (T x, T y, T z, bool test_empty=true)
 
Box3< T > intersect (const Box3< T > &v) const
 Find the union between the bbox and another.
 
template<typename S >
bool project (const Mat4< T > &m, Box2< S > &box2D_out) const
 
template<typename S >
uint32_t projectCorner (Corner corner_index, const Mat4< T > &m, Box2< S > &box2D_out) const
 
template<typename S >
Box3< T > interpolateTo (const Box3< T > &b, S t) const
 Interpolate between this Box3 and another at t, where t=0..1.
 
template<typename S >
Box3< T > lerpClampedTo (const Box3< T > &b, S t) const
 
bool intersects (const Box3< T > &box) const
 Return true if the box intersects with box.
 
bool intersects (const Vec3< T > &point) const
 Return true if 'a point is inside the box.
 
surface () const
 Return the surface area of the box.
 
unsigned int majorAxis () const
 Return the longest axis.
 
void split (unsigned int axis, bool firstHalf)
 Split the box along axis, keeping the first or second half according to firstHalf.
 
void transform (const Mat4< T > &m)
 Transform each corner with m, and set this box to the axis-aligned bounds of the new corners.
 
template<typename S >
Box3< T > operator* (const Mat4< S > &m) const
 
template<typename S >
Box3< T > & operator*= (const Mat4< S > &m)
 

Static Public Member Functions

static const char * cornerName (Corner corner)
 
static const char * faceName (Face face)
 
template<typename S >
static uint32_t projectCorner (T x, T y, T z, const Mat4< T > &m, Box2< S > &box2D_out)
 Returns 1 if xyz point projects behind origin, ie an 'outside corner'.
 

Public Attributes

Vec3< T > min
 "Lower-left-near"
 
Vec3< T > max
 "Upper-right-far"
 

Static Public Attributes

static constexpr uint8_t kNumElements = 6
 

Detailed Description

template<typename T>
class fdk::Box3< T >

Axis-aligned 3D bounding-box (AABB)

Member Function Documentation

◆ project()

template<typename T >
template<typename S >
bool fdk::Box3< T >::project ( const Mat4< T > &  m,
Box2< S > &  box2D_out 
) const
inline

Project the corners of the bbox by a 4x4 matrix onto a 2D plane. If all corners project behind the origin return false and an empty box.

References fdk::Box2< T >::setToEmptyState(), and fdk::Vec3< T >::z.

◆ projectCorner() [1/2]

template<typename T >
template<typename S >
uint32_t fdk::Box3< T >::projectCorner ( x,
y,
z,
const Mat4< T > &  m,
Box2< S > &  box2D_out 
)
inlinestatic

Returns 1 if xyz point projects behind origin, ie an 'outside corner'.

Returns 1 if point projects behind origin, ie an 'outside corner'. Expands the passed in Box2.

References fdk::Box2< T >::expand(), and fdk::Vec4< T >::w.

◆ projectCorner() [2/2]

template<typename T >
template<typename S >
uint32_t fdk::Box3< T >::projectCorner ( Corner  corner_index,
const Mat4< T > &  m,
Box2< S > &  box2D_out 
) const
inline

Returns 1 if point projects behind origin, ie an 'outside corner'. Expands the passed in Box2.

References fdk::Vec3< T >::z.

◆ interpolateTo()

template<typename T >
template<typename S >
Box3< T > fdk::Box3< T >::interpolateTo ( const Box3< T > &  b,
t 
) const
inline

Interpolate between this Box3 and another at t, where t=0..1.

Interpolate between two bounding-boxes.

References fdk::Box3< T >::max, and fdk::Box3< T >::min.



©2024 The Foundry Visionmongers, Ltd. All Rights Reserved.
www.foundry.com