harfang3d/harfang/foundation/obb.cpp
2022-06-05 14:04:47 +02:00

39 lines
971 B
C++

// HARFANG(R) Copyright (C) 2021 Emmanuel Julien, NWNC HARFANG. Released under GPL/LGPL/Commercial Licence, see licence.txt for details.
#include "foundation/obb.h"
#include "foundation/matrix3.h"
#include "foundation/matrix4.h"
#include "foundation/minmax.h"
namespace hg {
OBB OBBFromMinMax(const MinMax &minmax) { return {(minmax.mn + minmax.mx) * 0.5f, minmax.mx - minmax.mn}; }
MinMax MinMaxFromOBB(const OBB &obb) {
Vec3 xtd = obb.scl * 0.5f;
const Vec3 smt[4] = {
{xtd.x, xtd.y, xtd.z},
{-xtd.x, xtd.y, xtd.z},
{xtd.x, -xtd.y, xtd.z},
{xtd.x, xtd.y, -xtd.z}};
MinMax mm;
mm.mx = Abs(obb.rot * smt[0]);
for (int n = 1; n < 4; ++n)
mm.mx = Max(mm.mx, Abs(obb.rot * smt[n]));
mm.mn = Reverse(mm.mx);
mm.mn += obb.pos;
mm.mx += obb.pos;
return mm;
}
OBB TransformOBB(const OBB &obb, const Mat4 &m) {
Vec3 pos, scl;
Mat3 rot;
Decompose(m, &pos, &rot, &scl);
return {rot * obb.pos + pos, scl * obb.scl, rot * obb.rot};
}
} // namespace hg