// 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(smt[0] * obb.rot);
	for (int n = 1; n < 4; ++n)
		mm.mx = Max(mm.mx, Abs(smt[n] * obb.rot));
	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 {obb.pos * rot + pos, obb.scl * scl, obb.rot * rot};
}

} // namespace hg
