nuclear@4: #include nuclear@4: nuclear@4: namespace gph { nuclear@4: nuclear@5: #undef GPH_SWIZZLE2 nuclear@5: #undef GPH_SWIZZLE3 nuclear@5: #undef GPH_SWIZZLE4 nuclear@5: #define GPH_SWIZZLE2(T, a, b) inline Vector2 T::a##b() const { return Vector2(a, b); } nuclear@5: #define GPH_SWIZZLE3(T, a, b, c) inline Vector3 T::a##b##c() const { return Vector3(a, b, c); } nuclear@5: #define GPH_SWIZZLE4(T, a, b, c, d) inline Vector4 T::a##b##c##d() const { return Vector4(a, b, c, d); } nuclear@5: nuclear@4: // ---- Vector3 ---- nuclear@4: nuclear@4: inline void Vector3::normalize() nuclear@4: { nuclear@4: float len = (float)sqrt(x * x + y * y + z * z); nuclear@4: if(len != 0.0f) { nuclear@4: x /= len; nuclear@4: y /= len; nuclear@4: z /= len; nuclear@4: } nuclear@4: } nuclear@4: nuclear@4: inline float &Vector3::operator[] (int idx) nuclear@4: { nuclear@4: return idx == 0 ? x : (idx == 1 ? y : z); nuclear@4: } nuclear@4: nuclear@4: inline const float &Vector3::operator[] (int idx) const nuclear@4: { nuclear@4: return idx == 0 ? x : (idx == 1 ? y : z); nuclear@4: } nuclear@4: nuclear@4: inline Vector3 operator +(const Vector3 &a, const Vector3 &b) nuclear@4: { nuclear@4: return Vector3(a.x + b.x, a.y + b.y, a.z + b.z); nuclear@4: } nuclear@4: nuclear@4: inline Vector3 operator -(const Vector3 &a, const Vector3 &b) nuclear@4: { nuclear@4: return Vector3(a.x - b.x, a.y - b.y, a.z - b.z); nuclear@4: } nuclear@4: nuclear@4: inline Vector3 operator *(const Vector3 &a, const Vector3 &b) nuclear@4: { nuclear@4: return Vector3(a.x * b.x, a.y * b.y, a.z * b.z); nuclear@4: } nuclear@4: nuclear@4: inline Vector3 operator /(const Vector3 &a, const Vector3 &b) nuclear@4: { nuclear@4: return Vector3(a.x / b.x, a.y / b.y, a.z / b.z); nuclear@4: } nuclear@4: nuclear@4: inline Vector3 operator *(const Vector3 &v, float s) nuclear@4: { nuclear@4: return Vector3(v.x * s, v.y * s, v.z * s); nuclear@4: } nuclear@4: nuclear@4: inline Vector3 operator *(float s, const Vector3 &v) nuclear@4: { nuclear@4: return Vector3(s * v.x, s * v.y, s * v.z); nuclear@4: } nuclear@4: nuclear@4: inline Vector3 operator /(const Vector3 &v, float s) nuclear@4: { nuclear@4: return Vector3(v.x / s, v.y / s, v.z / s); nuclear@4: } nuclear@4: nuclear@4: inline Vector3 operator /(float s, const Vector3 &v) nuclear@4: { nuclear@4: return Vector3(s / v.x, s / v.y, s / v.z); nuclear@4: } nuclear@4: nuclear@4: inline Vector3 &operator +=(Vector3 &a, const Vector3 &b) nuclear@4: { nuclear@4: a.x += b.x; nuclear@4: a.y += b.y; nuclear@4: a.z += b.z; nuclear@4: return a; nuclear@4: } nuclear@4: nuclear@4: inline Vector3 &operator -=(Vector3 &a, const Vector3 &b) nuclear@4: { nuclear@4: a.x -= b.x; nuclear@4: a.y -= b.y; nuclear@4: a.z -= b.z; nuclear@4: return a; nuclear@4: } nuclear@4: nuclear@4: inline Vector3 &operator *=(Vector3 &a, const Vector3 &b) nuclear@4: { nuclear@4: a.x *= b.x; nuclear@4: a.y *= b.y; nuclear@4: a.z *= b.z; nuclear@4: return a; nuclear@4: } nuclear@4: nuclear@4: inline Vector3 &operator /=(Vector3 &a, const Vector3 &b) nuclear@4: { nuclear@4: a.x /= b.x; nuclear@4: a.y /= b.y; nuclear@4: a.z /= b.z; nuclear@4: return a; nuclear@4: } nuclear@4: nuclear@4: inline Vector3 &operator *=(Vector3 &v, float s) nuclear@4: { nuclear@4: v.x *= s; nuclear@4: v.y *= s; nuclear@4: v.z *= s; nuclear@4: return v; nuclear@4: } nuclear@4: nuclear@4: inline Vector3 &operator /=(Vector3 &v, float s) nuclear@4: { nuclear@4: v.x /= s; nuclear@4: v.y /= s; nuclear@4: v.z /= s; nuclear@4: return v; nuclear@4: } nuclear@4: nuclear@4: inline bool operator ==(const Vector3 &a, const Vector3 &b) nuclear@4: { nuclear@4: return a.x == b.x && a.y == b.y && a.z == b.z; nuclear@4: } nuclear@4: nuclear@4: inline bool operator !=(const Vector3 &a, const Vector3 &b) nuclear@4: { nuclear@4: return !(a == b); nuclear@4: } nuclear@4: nuclear@4: inline float dot(const Vector3 &a, const Vector3 &b) nuclear@4: { nuclear@4: return a.x * b.x + a.y * b.y + a.z * b.z; nuclear@4: } nuclear@4: nuclear@4: inline Vector3 cross(const Vector3 &a, const Vector3 &b) nuclear@4: { nuclear@4: return Vector3(a.y * b.z - a.z * b.y, nuclear@4: a.z * b.x - a.x * b.z, nuclear@4: a.x * b.y - a.y * b.x); nuclear@4: } nuclear@4: nuclear@4: inline float length(const Vector3 &v) nuclear@4: { nuclear@4: return (float)sqrt(v.x * v.x + v.y * v.y + v.z * v.z); nuclear@4: } nuclear@4: nuclear@4: inline float length_sq(const Vector3 &v) nuclear@4: { nuclear@4: return v.x * v.x + v.y * v.y + v.z * v.z; nuclear@4: } nuclear@4: nuclear@4: inline Vector3 normalize(const Vector3 &v) nuclear@4: { nuclear@4: float len = length(v); nuclear@4: if(len == 0.0f) { nuclear@4: return v; nuclear@4: } nuclear@4: nuclear@4: return Vector3(v.x / len, v.y / len, v.z / len); nuclear@4: } nuclear@4: nuclear@4: inline Vector3 reflect(const Vector3 &v, const Vector3 &n) nuclear@4: { nuclear@4: return v - n * dot(n, v) * 2.0; nuclear@4: } nuclear@4: nuclear@4: inline Vector3 refract(const Vector3 &v, const Vector3 &n, float ior) nuclear@4: { nuclear@4: float ndotv = dot(n, v); nuclear@4: float k = 1.0f - ior * ior * (1.0f - ndotv * ndotv); nuclear@4: if(k < 0.0f) { nuclear@4: return Vector3(); nuclear@4: } nuclear@4: return ior * v - (ior * ndotv + sqrt(k)) * n; nuclear@4: } nuclear@4: nuclear@4: inline Vector3 refract(const Vector3 &v, const Vector3 &n, float from_ior, float to_ior) nuclear@4: { nuclear@4: if(to_ior == 0.0f) to_ior = 1.0f; nuclear@4: return refract(v, n, from_ior / to_ior); nuclear@4: } nuclear@4: nuclear@4: inline Vector3 distance(const Vector3 &a, const Vector3 &b) nuclear@4: { nuclear@4: return length(a - b); nuclear@4: } nuclear@4: nuclear@4: inline Vector3 distance_sq(const Vector3 &a, const Vector3 &b) nuclear@4: { nuclear@4: return length_sq(a - b); nuclear@4: } nuclear@4: nuclear@4: inline Vector3 faceforward(const Vector3 &n, const Vector3 &vi, const Vector3 &ng) nuclear@4: { nuclear@4: return dot(ng, i) < 0.0f ? n : -n; nuclear@4: } nuclear@4: nuclear@6: inline Vector3 major(const Vector3 &v) nuclear@6: { nuclear@6: int m = major_idx(v); nuclear@6: Vector3 res; nuclear@6: res[m] = v[m]; nuclear@6: return res; nuclear@6: } nuclear@6: nuclear@6: inline int major_idx(const Vector3 &v) nuclear@6: { nuclear@6: return fabs(v.x) >= fabs(v.y) && fabs(v.x) > fabs(v.z) ? 0 : nuclear@6: (fabs(v.y) >= fabs(v.z) ? 1 : 2); nuclear@6: } nuclear@6: nuclear@6: inline Vector3 proj_axis(const Vector3 &v, const Vector3 &axis) nuclear@6: { nuclear@6: return axis * dot(v, axis); nuclear@6: } nuclear@6: nuclear@6: nuclear@6: inline Vector3 rotate(const Vector3 &v, const Quaternion &q) nuclear@6: { nuclear@6: return v; // TODO nuclear@6: } nuclear@6: nuclear@6: inline Vector3 rotate(const Vector3 &v, const Vector3 &axis, float angle) nuclear@6: { nuclear@6: return v; // TODO nuclear@6: } nuclear@6: nuclear@6: inline Vector3 rotate(const Vector3 &v, const Vector3 &euler) nuclear@6: { nuclear@6: return v; // TODO nuclear@6: } nuclear@6: nuclear@6: nuclear@5: GPH_VEC3_SWIZZLE nuclear@5: nuclear@4: // ---- Vector4 ---- nuclear@4: nuclear@4: nuclear@4: inline void Vector4::normalize() nuclear@4: { nuclear@4: float len = (float)sqrt(x * x + y * y + z * z + w * w); nuclear@4: if(len != 0.0f) { nuclear@4: x /= len; nuclear@4: y /= len; nuclear@4: z /= len; nuclear@4: w /= len; nuclear@4: } nuclear@4: } nuclear@4: nuclear@4: inline float &Vector4::operator[] (int idx) nuclear@4: { nuclear@4: return idx == 0 ? x : (idx == 1 ? y : (idx == 2 ? z : w)); nuclear@4: } nuclear@4: nuclear@4: inline const float &Vector4::operator[] (int idx) const nuclear@4: { nuclear@4: return idx == 0 ? x : (idx == 1 ? y : (idx == 2 ? z : w)); nuclear@4: } nuclear@4: nuclear@5: GPH_VEC4_SWIZZLE nuclear@5: nuclear@5: // ---- Vector2 ---- nuclear@5: nuclear@5: inline void Vector2::normalize() nuclear@5: { nuclear@5: float len = (float)sqrt(x * x + y * y); nuclear@5: if(len != 0.0f) { nuclear@5: x /= len; nuclear@5: y /= len; nuclear@5: } nuclear@5: } nuclear@5: nuclear@5: inline float &Vector2::operator[] (int idx) nuclear@5: { nuclear@5: return idx == 0 ? x : y; nuclear@5: } nuclear@5: nuclear@5: inline const float &Vector2::operator[] (int idx) const nuclear@5: { nuclear@5: return idx == 0 ? x : y; nuclear@5: } nuclear@5: nuclear@5: GPH_VEC2_SWIZZLE nuclear@5: nuclear@4: } // namespace gph