Files
tech5/source/shared/idlib/bv/box.h
T
2026-08-08 19:30:03 -07:00

70 lines
2.1 KiB
C++

#pragma once
#include "bounds.h"
#include <cmath>
class idBox {
public:
idVec3 center;
idVec3 extents;
idMat3 axis;
idBox() : center(0.0f, 0.0f, 0.0f), extents(0.0f, 0.0f, 0.0f), axis(1.0f) {}
explicit idBox(const idBounds& bounds) : axis(1.0f) {
SetFromBounds(bounds);
}
idBox(const idBounds& bounds, const idVec3& origin, const idMat3& newAxis)
: axis(newAxis) {
SetFromBounds(bounds);
const idVec3 localCenter = center;
center.Set(
origin.x + newAxis[0].x * localCenter.x
+ newAxis[1].x * localCenter.y + newAxis[2].x * localCenter.z,
origin.y + newAxis[0].y * localCenter.x
+ newAxis[1].y * localCenter.y + newAxis[2].y * localCenter.z,
origin.z + newAxis[0].z * localCenter.x
+ newAxis[1].z * localCenter.y + newAxis[2].z * localCenter.z);
}
bool ContainsPoint(const idVec3& point) const {
const idVec3 relative = point - center;
return std::fabs(axis[0].Dot(relative)) <= extents.x
&& std::fabs(axis[1].Dot(relative)) <= extents.y
&& std::fabs(axis[2].Dot(relative)) <= extents.z;
}
void AxisProjection(const idMat3& projectionAxis, idBounds& bounds) const {
for (int index = 0; index < 3; ++index) {
const float projectedCenter = projectionAxis[index].Dot(center);
const float projectedRadius =
std::fabs(projectionAxis[index].Dot(axis[0])) * extents.x
+ std::fabs(projectionAxis[index].Dot(axis[1])) * extents.y
+ std::fabs(projectionAxis[index].Dot(axis[2])) * extents.z;
bounds[0][index] = projectedCenter - projectedRadius;
bounds[1][index] = projectedCenter + projectedRadius;
}
}
private:
void SetFromBounds(const idBounds& bounds) {
center = (bounds[0] + bounds[1]) * 0.5f;
extents = bounds[1] - center;
}
};
struct box {
int c0min;
int c0max;
int c1min;
int c1max;
int c2min;
int c2max;
int volume;
int colorcount;
};
static_assert(sizeof(idBox) == 60, "Recovered idBox ABI changed");