mirror of https://github.com/AxioDL/zeus.git
68 lines
1.3 KiB
C++
68 lines
1.3 KiB
C++
#ifndef CPLANE_HPP
|
|
#define CPLANE_HPP
|
|
|
|
#include "Global.hpp"
|
|
#include "CVector3f.hpp"
|
|
#include "Math.hpp"
|
|
|
|
namespace Zeus
|
|
{
|
|
class ZE_ALIGN(16) CPlane
|
|
{
|
|
public:
|
|
ZE_DECLARE_ALIGNED_ALLOCATOR();
|
|
|
|
inline CPlane() {}
|
|
CPlane(float a, float b, float c, float d) : a(a), b(b), c(c), d(d) {}
|
|
CPlane(const CVector3f& a, const CVector3f& b, const CVector3f& c)
|
|
{
|
|
CVector3f ab = b - a;
|
|
CVector3f ac = c - a;
|
|
vec = ab.cross(ac).normalized();
|
|
d = -a.dot(vec);
|
|
}
|
|
|
|
CPlane(const CVector3f& point, float displacement)
|
|
{
|
|
#if __SSE__
|
|
mVec128 = point.mVec128;
|
|
#else
|
|
a = point[0]; b = point[1]; c = point[2];
|
|
#endif
|
|
d = displacement;
|
|
}
|
|
|
|
float clipLineSegment(const CVector3f& a, const CVector3f& b)
|
|
{
|
|
float mag = ((b.z - a.z) * (((b.x - a.x) * ((b.y - a.y) * vec.y)) + vec.x)) + vec.z;
|
|
float dis = (-(vec.y - d)) / mag;
|
|
return Math::clamp(0.0f, dis, 1.0f);
|
|
}
|
|
|
|
inline void normalize()
|
|
{
|
|
float nd = d;
|
|
float mag = vec.magnitude();
|
|
assert(mag != 0.0f);
|
|
mag = 1.0 / mag;
|
|
vec *= mag;
|
|
d = nd * mag;
|
|
}
|
|
|
|
union
|
|
{
|
|
struct
|
|
{
|
|
float a, b, c, d;
|
|
};
|
|
float p[4];
|
|
CVector3f vec;
|
|
#ifdef __SSE__
|
|
__m128 mVec128;
|
|
#endif
|
|
};
|
|
};
|
|
}
|
|
|
|
#endif // CPLANE_HPP
|