#ifndef BLACKSHADES_QUATERNIONS_H #define BLACKSHADES_QUATERNIONS_H struct XYZ { float x, y, z; }; #ifdef __cplusplus constexpr bool operator==(const XYZ& u, const XYZ& v) { return u.x == v.x && u.y == v.y && u.z == v.z; } constexpr XYZ operator+(XYZ u, const XYZ& v) { return {u.x + v.x, u.y + v.y, u.z + v.z}; } constexpr XYZ operator-(XYZ u, const XYZ& v) { return {u.x - v.x, u.y - v.y, u.z - v.z}; } constexpr XYZ operator*(XYZ u, const XYZ& v) { return {u.x * v.x, u.y * v.y, u.z * v.z}; } constexpr XYZ operator*(XYZ u, float k) { return {u.x * k, u.y * k, u.z * k}; } constexpr XYZ operator/(XYZ u, float k) { return {u.x / k, u.y / k, u.z / k}; } constexpr XYZ& operator+=(XYZ& u, const XYZ& v) { return u = u + v; } constexpr XYZ& operator-=(XYZ& u, const XYZ& v) { return u = u - v; } constexpr XYZ& operator*=(XYZ& u, const XYZ& v) { return u = u * v; } constexpr XYZ& operator*=(XYZ& u, float k) { return u = u * k; } constexpr XYZ& operator/=(XYZ& u, float k) { return u = u / k; } #endif // __cplusplus #ifdef __cplusplus extern "C" { #endif // __cplusplus void CrossProduct(struct XYZ P, struct XYZ Q, struct XYZ *V); void Normalise(struct XYZ *vectory); bool PointInTriangle(struct XYZ *p, struct XYZ normal, struct XYZ *p1, struct XYZ *p2, struct XYZ *p3); float LineFacetd(struct XYZ p1, struct XYZ p2, struct XYZ pa, struct XYZ pb, struct XYZ pc, struct XYZ n, struct XYZ *p); void ReflectVector(struct XYZ *vel, struct XYZ *n); struct XYZ DoRotation(struct XYZ thePoint, float xang, float yang, float zang); float findDistance(struct XYZ point1, struct XYZ point2); float findLengthfast(struct XYZ point1); float findDistancefast(struct XYZ point1, struct XYZ point2); float dotproduct(struct XYZ point1, struct XYZ point2); bool sphere_line_intersection(float x1, float y1, float z1, float x2, float y2, float z2, float x3, float y3, float z3, float r); #ifdef __cplusplus } // extern "C" #endif // __cplusplus #endif // BLACKSHADES_QUATERNIONS_H