2 gph-math - math library for graphics programs
3 Copyright (C) 2016 John Tsiombikas <nuclear@member.fsf.org>
5 This program is free software. Feel free to use, modify, and/or redistribute
6 it under the terms of the MIT/X11 license. See LICENSE for details.
7 If you intend to redistribute parts of the code without the LICENSE file
8 replace this paragraph with the full contents of the LICENSE file.
10 inline void Vector3::normalize()
12 float len = (float)sqrt(x * x + y * y + z * z);
20 inline float &Vector3::operator[] (int idx)
22 return idx == 0 ? x : (idx == 1 ? y : z);
25 inline const float &Vector3::operator[] (int idx) const
27 return idx == 0 ? x : (idx == 1 ? y : z);
30 inline Vector3 operator -(const Vector3 &v)
32 return Vector3(-v.x, -v.y, -v.z);
35 inline Vector3 operator +(const Vector3 &a, const Vector3 &b)
37 return Vector3(a.x + b.x, a.y + b.y, a.z + b.z);
40 inline Vector3 operator -(const Vector3 &a, const Vector3 &b)
42 return Vector3(a.x - b.x, a.y - b.y, a.z - b.z);
45 inline Vector3 operator *(const Vector3 &a, const Vector3 &b)
47 return Vector3(a.x * b.x, a.y * b.y, a.z * b.z);
50 inline Vector3 operator /(const Vector3 &a, const Vector3 &b)
52 return Vector3(a.x / b.x, a.y / b.y, a.z / b.z);
55 inline Vector3 operator *(const Vector3 &v, float s)
57 return Vector3(v.x * s, v.y * s, v.z * s);
60 inline Vector3 operator *(float s, const Vector3 &v)
62 return Vector3(s * v.x, s * v.y, s * v.z);
65 inline Vector3 operator /(const Vector3 &v, float s)
67 return Vector3(v.x / s, v.y / s, v.z / s);
70 inline Vector3 operator /(float s, const Vector3 &v)
72 return Vector3(s / v.x, s / v.y, s / v.z);
75 inline Vector3 &operator +=(Vector3 &a, const Vector3 &b)
83 inline Vector3 &operator -=(Vector3 &a, const Vector3 &b)
91 inline Vector3 &operator *=(Vector3 &a, const Vector3 &b)
99 inline Vector3 &operator /=(Vector3 &a, const Vector3 &b)
107 inline Vector3 &operator *=(Vector3 &v, float s)
115 inline Vector3 &operator /=(Vector3 &v, float s)
123 inline bool operator ==(const Vector3 &a, const Vector3 &b)
125 return a.x == b.x && a.y == b.y && a.z == b.z;
128 inline bool operator !=(const Vector3 &a, const Vector3 &b)
133 inline float dot(const Vector3 &a, const Vector3 &b)
135 return a.x * b.x + a.y * b.y + a.z * b.z;
138 inline Vector3 cross(const Vector3 &a, const Vector3 &b)
140 return Vector3(a.y * b.z - a.z * b.y,
141 a.z * b.x - a.x * b.z,
142 a.x * b.y - a.y * b.x);
145 inline float length(const Vector3 &v)
147 return (float)sqrt(v.x * v.x + v.y * v.y + v.z * v.z);
150 inline float length_sq(const Vector3 &v)
152 return v.x * v.x + v.y * v.y + v.z * v.z;
155 inline Vector3 normalize(const Vector3 &v)
157 float len = length(v);
162 return Vector3(v.x / len, v.y / len, v.z / len);
165 inline Vector3 reflect(const Vector3 &v, const Vector3 &n)
167 return v - n * dot(n, v) * 2.0;
170 inline Vector3 refract(const Vector3 &v, const Vector3 &n, float ior)
172 float ndotv = dot(n, v);
173 float k = 1.0f - ior * ior * (1.0f - ndotv * ndotv);
177 return ior * v - (ior * ndotv + sqrt(k)) * n;
180 inline Vector3 refract(const Vector3 &v, const Vector3 &n, float from_ior, float to_ior)
182 if(to_ior == 0.0f) to_ior = 1.0f;
183 return refract(v, n, from_ior / to_ior);
186 inline float distance(const Vector3 &a, const Vector3 &b)
188 return length(a - b);
191 inline float distance_sq(const Vector3 &a, const Vector3 &b)
193 return length_sq(a - b);
196 inline Vector3 faceforward(const Vector3 &n, const Vector3 &vi, const Vector3 &ng)
198 return dot(ng, vi) < 0.0f ? n : -n;
201 inline Vector3 major(const Vector3 &v)
203 int m = major_idx(v);
209 inline int major_idx(const Vector3 &v)
211 return fabs(v.x) >= fabs(v.y) && fabs(v.x) > fabs(v.z) ? 0 :
212 (fabs(v.y) >= fabs(v.z) ? 1 : 2);
215 inline Vector3 proj_axis(const Vector3 &v, const Vector3 &axis)
217 return axis * dot(v, axis);
221 inline Vector3 rotate(const Vector3 &v, const Quaternion &q)
226 inline Vector3 rotate(const Vector3 &v, const Vector3 &axis, float angle)
231 inline Vector3 rotate(const Vector3 &v, const Vector3 &euler)