#ifndef BLACKSHADES_QUATERNIONS_H #define BLACKSHADES_QUATERNIONS_H struct XYZ { float x, y, z; }; const struct XYZ DIRECTIONS[] = { {-130.400f, 0.000f, 120.800f}, {-130.400f, 0.000f, -120.800f}, {-124.800f, 0.000f, -129.600f}, {121.600f, 0.000f, -128.800f}, {127.200f, 0.000f, -120.000f}, {125.600f, 0.000f, 119.200f}, {120.800f, 0.000f, 127.200f}, {-122.400f, 0.000f, 125.600f}, }; #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 float sqrlen(struct XYZ); float len(struct XYZ); struct XYZ crossProduct(struct XYZ, struct XYZ); struct XYZ normalize(struct XYZ); void reflect(struct XYZ*, struct XYZ); bool segCrossSphere(struct XYZ, struct XYZ, struct XYZ, float); bool segCrossTrigon(struct XYZ p1, struct XYZ p2, struct XYZ *pa, struct XYZ *pb, struct XYZ *pc, struct XYZ *n, struct XYZ *p); struct XYZ rotate(struct XYZ, float, float, float); void setFrustum(float (*)[4], float*, float*); int cubeInFrustum(float (*)[4], float, float, float, float); int sphereInFrustum(float (*)[4], float, float, float, float); #ifdef __cplusplus } // extern "C" #endif // __cplusplus #endif // BLACKSHADES_QUATERNIONS_H