#pragma once #include "Core/Math/Boilerplate.h" #include "Core/Math/Detail/PlaneDecl.inl" #include "Core/Math/SIMD/SIMDIntrinsics.h" #include "Core/Math/SIMD/PhanesSIMDTypes.h" namespace Phanes::Core::Math { template TPlane::TPlane(const TVector3& normal, Real d) { Detail::construct_plane::map(*this, normal, d); } template TPlane::TPlane(const TVector3& normal, const TVector3& base) { Detail::construct_plane::map(*this, normal, base); } template TPlane::TPlane(Real x, Real y, Real z, Real d) { Detail::construct_plane::map(*this, x, y, z, d); } template TPlane::TPlane(const TVector3& p1, const TVector3& p2, const TVector3& p3) { Detail::construct_plane::map(*this, p1, p2, p3); } template TPlane operator+=(TPlane& pl1, const TPlane& pl2) { Detail::compute_plane_add(pl1, pl1, pl2); return pl1; } template TPlane operator+=(TPlane& pl1, T s) { Detail::compute_plane_add(pl1, pl1, s); return pl1; } template TPlane operator+(const TPlane& pl1, const TPlane& pl2) { TPlane r; Detail::compute_plane_add(r, pl1, pl2); return r; } template TPlane operator+(const TPlane& pl1, T s) { TPlane r; Detail::compute_plane_add(r, pl1, s); return r; } template TPlane operator-=(TPlane& pl1, const TPlane& pl2) { Detail::compute_plane_sub(pl1, pl1, pl2); return pl1; } template TPlane operator-=(TPlane& pl1, T s) { Detail::compute_plane_sub(pl1, pl1, s); return pl1; } template TPlane operator-(const TPlane& pl1, const TPlane& pl2) { TPlane r; Detail::compute_plane_sub(r, pl1, pl2); return r; } template TPlane operator-(const TPlane& pl1, T s) { TPlane r; Detail::compute_plane_sub(r, pl1, s); return r; } template TPlane operator*=(TPlane& pl1, const TPlane& pl2) { Detail::compute_plane_mul(pl1, pl1, pl2); return pl1; } template TPlane operator*=(TPlane& pl1, T s) { Detail::compute_plane_mul(pl1, pl1, s); return pl1; } template TPlane operator*(const TPlane& pl1, const TPlane& pl2) { TPlane r; Detail::compute_plane_mul(r, pl1, pl2); return r; } template TPlane operator*(const TPlane& pl1, T s) { TPlane r; Detail::compute_plane_mul(r, pl1, s); return r; } template TPlane operator/=(TPlane& pl1, const TPlane& pl2) { Detail::compute_plane_div(pl1, pl1, pl2); return pl1; } template TPlane operator/=(TPlane& pl1, T s) { Detail::compute_plane_div(pl1, pl1, s); return pl1; } template TPlane operator/(const TPlane& pl1, const TPlane& pl2) { TPlane r; Detail::compute_plane_sub(r, pl1, pl2); return r; } template TPlane operator/(const TPlane& pl1, T s) { TPlane r; Detail::compute_plane_sub(r, pl1, s); return r; } }