mirror of
https://github.com/open-goal/jak-project.git
synced 2024-10-20 21:27:52 -04:00
c13934708a
* wip * learning about colors * gltf node stuff working * cleanup * support textures * bvh generation seems reasonable * tree layout * frag packer, untested and doesnt do real stripping yet * temp * working collide frags * handle bad inputs better * clean up * format * include * another include * reorganize for release build use
40 lines
1,019 B
C++
40 lines
1,019 B
C++
#include "geometry.h"
|
|
|
|
namespace math {
|
|
|
|
Vector4f bsphere_of_triangle(const Vector3f* v) {
|
|
Vector4f bsphere;
|
|
auto& p1 = v[0];
|
|
auto& p2 = v[1];
|
|
auto& p3 = v[2];
|
|
float A = (p1 - p2).length();
|
|
float B = (p2 - p3).length();
|
|
float C = (p3 - p1).length();
|
|
|
|
const Vector3f *a = &p3, *b = &p1, *c = &p2;
|
|
if (B < C)
|
|
std::swap(B, C), std::swap(b, c);
|
|
if (A < B)
|
|
std::swap(A, B), std::swap(a, b);
|
|
|
|
float r;
|
|
math::Vector3f origin;
|
|
if ((B * B) + (C * C) <= (A * A)) {
|
|
r = A / 2.f;
|
|
origin = (*b + *c) / 2.f;
|
|
} else {
|
|
float cos_a = (B * B + C * C - A * A) / (B * C * 2);
|
|
r = A / (sqrt(1 - cos_a * cos_a) * 2.f);
|
|
Vector3f alpha = *a - *c, beta = *b - *c;
|
|
origin = (beta * alpha.dot(alpha) - alpha * beta.dot(beta)).cross(alpha.cross(beta)) /
|
|
(alpha.cross(beta).dot(alpha.cross(beta)) * 2.f) +
|
|
*c;
|
|
}
|
|
bsphere.x() = origin.x();
|
|
bsphere.y() = origin.y();
|
|
bsphere.z() = origin.z();
|
|
bsphere.w() = r;
|
|
return bsphere;
|
|
}
|
|
|
|
} // namespace math
|