Files
prime/include/Kyoto/Math/CAABox.hpp
2026-03-24 22:00:42 -06:00

112 lines
3.3 KiB
C++

#ifndef _CAABOX
#define _CAABOX
#include "Kyoto/Math/CVector3f.hpp"
class CInputStream;
class CLineSeg;
class CPlane;
class CTransform4f;
class CTri;
class CAABox {
public:
enum EBoxEdgeId {
kE_Z0,
kE_X0,
kE_Z1,
kE_X1,
kE_Z2,
kE_X2,
kE_Z3,
kE_X3,
kE_Y0,
kE_Y1,
kE_Y2,
kE_Y3,
};
enum EBoxFaceId {
kF_YMin,
kF_YMax,
kF_XMin,
kF_XMax,
kF_ZMax,
kF_ZMin,
};
CAABox() {}
CAABox(const CVector3f& min, const CVector3f& max);
CAABox(const float minX, const float minY, const float minZ, const float maxX, const float maxY,
const float maxZ)
: min(minX, minY, minZ), max(maxX, maxY, maxZ) {}
CAABox(CInputStream& in);
// CAABox(const CAABox& other)
// : min(other.min)
// , max(other.max) {}
// CAABox& operator=(const CAABox& other) {
// min = other.min;
// max = other.max;
// return *this;
// }
CLineSeg GetEdge(EBoxEdgeId edge) const;
CTri GetTri(EBoxFaceId face, int windOffset) const;
CVector3f ClosestPointAlongVector(const CVector3f& vec) const;
CVector3f FurthestPointAlongVector(const CVector3f& vec) const;
CVector3f GetCenterPoint() const;
CVector3f CenterPoint() const { return (min + max) * 0.5f; }
CVector3f GetPoint(int) const;
void Include(const CVector3f& vec) { AccumulateBounds(vec); }
void Include(const CAABox& other) {
AccumulateBounds(other.min);
AccumulateBounds(other.max);
}
void AccumulateBounds(const CVector3f&);
bool Invalid() const;
bool PointInside(const CVector3f& vec) const;
bool DoBoundsOverlap(const CAABox&) const;
float GetVolume() const;
CAABox GetBooleanIntersection(const CAABox& other) const;
bool Inside(const CAABox& other) const;
bool InsidePlane(const CPlane& plane) const;
CVector3f ClampToBox(const CVector3f& vec) const;
CAABox GetTransformedAABox(const CTransform4f& xf) const;
inline CVector3f GetHalfExtent() const {
// Name is a guess
return (max - min) * 0.5f;
}
const CVector3f& GetMinPoint() const { return min; }
const CVector3f& GetMaxPoint() const { return max; }
CVector3f GetPointA() const { return CVector3f(min.GetX(), min.GetY(), min.GetZ()); }
CVector3f GetPointB() const { return CVector3f(max.GetX(), min.GetY(), min.GetZ()); }
CVector3f GetPointC() const { return CVector3f(max.GetX(), min.GetY(), max.GetZ()); }
CVector3f GetPointD() const { return CVector3f(min.GetX(), min.GetY(), max.GetZ()); }
CVector3f GetPointE() const { return CVector3f(max.GetX(), max.GetY(), min.GetZ()); }
CVector3f GetPointF() const { return CVector3f(min.GetX(), max.GetY(), max.GetZ()); }
CVector3f GetPointG() const { return CVector3f(max.GetX(), max.GetY(), max.GetZ()); }
CVector3f GetPointH() const { return CVector3f(max.GetX(), max.GetY(), min.GetZ()); }
float GetWidth() const { return max.GetX() - min.GetX(); }
float GetHeight() const { return max.GetY() - min.GetY(); }
float GetDepth() const { return max.GetZ() - min.GetZ(); }
static const CAABox& Identity() { return mskNullBox; }
static const CAABox& MakeMaxInvertedBox() { return mskInvertedBox; }
static const CAABox& MakeNullBox() { return mskNullBox; }
static float DistanceBetween(const CAABox& a, const CAABox& b);
private:
CVector3f min;
CVector3f max;
static CAABox mskInvertedBox;
static CAABox mskNullBox;
};
CHECK_SIZEOF(CAABox, 0x18)
#endif // _CAABOX