zeus/include/zeus/CPlane.hpp

70 lines
1.9 KiB
C++
Raw Permalink Normal View History

2018-10-06 20:39:40 -07:00
#pragma once
2015-04-19 13:39:16 -07:00
#include <cassert>
2016-03-04 15:03:26 -08:00
#include "zeus/CVector3f.hpp"
#include "zeus/Global.hpp"
2016-03-04 15:03:26 -08:00
#include "zeus/Math.hpp"
2015-04-19 13:39:16 -07:00
2018-12-07 17:16:50 -08:00
namespace zeus {
class CPlane {
2015-04-19 13:39:16 -07:00
public:
2019-02-23 23:15:32 -08:00
constexpr CPlane() : mSimd(1.f, 0.f, 0.f, 0.f) {}
2018-12-07 17:16:50 -08:00
2019-02-23 23:15:32 -08:00
constexpr CPlane(float a, float b, float c, float d) : mSimd(a, b, c, d) {}
2018-12-07 17:16:50 -08:00
CPlane(const CVector3f& a, const CVector3f& b, const CVector3f& c) {
mSimd = (b - a).cross(c - a).normalized().mSimd;
mSimd[3] = a.dot(normal());
}
CPlane(const CVector3f& point, float displacement) {
mSimd = point.mSimd;
mSimd[3] = displacement;
}
[[nodiscard]] float clipLineSegment(const CVector3f& a, const CVector3f& b) {
const float mag = (b - a).dot(normal());
const float dis = (-(y() - d())) / mag;
2018-12-07 17:16:50 -08:00
return clamp(0.0f, dis, 1.0f);
}
void normalize() {
float nd = d();
auto norm = normal();
float mag = norm.magnitude();
mag = 1.f / mag;
mSimd = (norm * mag).mSimd;
mSimd[3] = nd * mag;
}
2022-05-13 23:46:19 -07:00
[[nodiscard]] float pointToPlaneDist(const CVector3f& pos) const { return normal().dot(pos) - d(); }
2018-12-07 17:16:50 -08:00
[[nodiscard]] bool rayPlaneIntersection(const CVector3f& from, const CVector3f& to, CVector3f& point) const;
2018-12-07 17:16:50 -08:00
[[nodiscard]] CVector3f normal() const { return mSimd; }
2018-12-07 17:16:50 -08:00
[[nodiscard]] zeus::simd<float>::reference operator[](size_t idx) {
2018-12-07 17:16:50 -08:00
assert(idx < 4);
return mSimd[idx];
}
[[nodiscard]] float operator[](size_t idx) const {
2018-12-07 17:16:50 -08:00
assert(idx < 4);
return mSimd[idx];
}
[[nodiscard]] float x() const { return mSimd[0]; }
[[nodiscard]] float y() const { return mSimd[1]; }
[[nodiscard]] float z() const { return mSimd[2]; }
[[nodiscard]] float d() const { return mSimd[3]; }
2018-12-07 17:16:50 -08:00
[[nodiscard]] simd<float>::reference x() { return mSimd[0]; }
[[nodiscard]] simd<float>::reference y() { return mSimd[1]; }
[[nodiscard]] simd<float>::reference z() { return mSimd[2]; }
[[nodiscard]] simd<float>::reference d() { return mSimd[3]; }
2018-12-07 17:16:50 -08:00
zeus::simd<float> mSimd;
2015-04-19 13:39:16 -07:00
};
2018-12-07 21:23:50 -08:00
} // namespace zeus