graphene

annotate src/gmath/vector.inl @ 4:d30e24132b6e

more gmath
author John Tsiombikas <nuclear@member.fsf.org>
date Sat, 25 Jul 2015 07:42:30 +0300
parents
children 2ce58d5309f0
rev   line source
nuclear@4 1 #include <math.h>
nuclear@4 2
nuclear@4 3 namespace gph {
nuclear@4 4
nuclear@4 5 // ---- Vector3 ----
nuclear@4 6
nuclear@4 7 inline void Vector3::normalize()
nuclear@4 8 {
nuclear@4 9 float len = (float)sqrt(x * x + y * y + z * z);
nuclear@4 10 if(len != 0.0f) {
nuclear@4 11 x /= len;
nuclear@4 12 y /= len;
nuclear@4 13 z /= len;
nuclear@4 14 }
nuclear@4 15 }
nuclear@4 16
nuclear@4 17 inline float &Vector3::operator[] (int idx)
nuclear@4 18 {
nuclear@4 19 return idx == 0 ? x : (idx == 1 ? y : z);
nuclear@4 20 }
nuclear@4 21
nuclear@4 22 inline const float &Vector3::operator[] (int idx) const
nuclear@4 23 {
nuclear@4 24 return idx == 0 ? x : (idx == 1 ? y : z);
nuclear@4 25 }
nuclear@4 26
nuclear@4 27 inline Vector3 operator +(const Vector3 &a, const Vector3 &b)
nuclear@4 28 {
nuclear@4 29 return Vector3(a.x + b.x, a.y + b.y, a.z + b.z);
nuclear@4 30 }
nuclear@4 31
nuclear@4 32 inline Vector3 operator -(const Vector3 &a, const Vector3 &b)
nuclear@4 33 {
nuclear@4 34 return Vector3(a.x - b.x, a.y - b.y, a.z - b.z);
nuclear@4 35 }
nuclear@4 36
nuclear@4 37 inline Vector3 operator *(const Vector3 &a, const Vector3 &b)
nuclear@4 38 {
nuclear@4 39 return Vector3(a.x * b.x, a.y * b.y, a.z * b.z);
nuclear@4 40 }
nuclear@4 41
nuclear@4 42 inline Vector3 operator /(const Vector3 &a, const Vector3 &b)
nuclear@4 43 {
nuclear@4 44 return Vector3(a.x / b.x, a.y / b.y, a.z / b.z);
nuclear@4 45 }
nuclear@4 46
nuclear@4 47 inline Vector3 operator *(const Vector3 &v, float s)
nuclear@4 48 {
nuclear@4 49 return Vector3(v.x * s, v.y * s, v.z * s);
nuclear@4 50 }
nuclear@4 51
nuclear@4 52 inline Vector3 operator *(float s, const Vector3 &v)
nuclear@4 53 {
nuclear@4 54 return Vector3(s * v.x, s * v.y, s * v.z);
nuclear@4 55 }
nuclear@4 56
nuclear@4 57 inline Vector3 operator /(const Vector3 &v, float s)
nuclear@4 58 {
nuclear@4 59 return Vector3(v.x / s, v.y / s, v.z / s);
nuclear@4 60 }
nuclear@4 61
nuclear@4 62 inline Vector3 operator /(float s, const Vector3 &v)
nuclear@4 63 {
nuclear@4 64 return Vector3(s / v.x, s / v.y, s / v.z);
nuclear@4 65 }
nuclear@4 66
nuclear@4 67 inline Vector3 &operator +=(Vector3 &a, const Vector3 &b)
nuclear@4 68 {
nuclear@4 69 a.x += b.x;
nuclear@4 70 a.y += b.y;
nuclear@4 71 a.z += b.z;
nuclear@4 72 return a;
nuclear@4 73 }
nuclear@4 74
nuclear@4 75 inline Vector3 &operator -=(Vector3 &a, const Vector3 &b)
nuclear@4 76 {
nuclear@4 77 a.x -= b.x;
nuclear@4 78 a.y -= b.y;
nuclear@4 79 a.z -= b.z;
nuclear@4 80 return a;
nuclear@4 81 }
nuclear@4 82
nuclear@4 83 inline Vector3 &operator *=(Vector3 &a, const Vector3 &b)
nuclear@4 84 {
nuclear@4 85 a.x *= b.x;
nuclear@4 86 a.y *= b.y;
nuclear@4 87 a.z *= b.z;
nuclear@4 88 return a;
nuclear@4 89 }
nuclear@4 90
nuclear@4 91 inline Vector3 &operator /=(Vector3 &a, const Vector3 &b)
nuclear@4 92 {
nuclear@4 93 a.x /= b.x;
nuclear@4 94 a.y /= b.y;
nuclear@4 95 a.z /= b.z;
nuclear@4 96 return a;
nuclear@4 97 }
nuclear@4 98
nuclear@4 99 inline Vector3 &operator *=(Vector3 &v, float s)
nuclear@4 100 {
nuclear@4 101 v.x *= s;
nuclear@4 102 v.y *= s;
nuclear@4 103 v.z *= s;
nuclear@4 104 return v;
nuclear@4 105 }
nuclear@4 106
nuclear@4 107 inline Vector3 &operator /=(Vector3 &v, float s)
nuclear@4 108 {
nuclear@4 109 v.x /= s;
nuclear@4 110 v.y /= s;
nuclear@4 111 v.z /= s;
nuclear@4 112 return v;
nuclear@4 113 }
nuclear@4 114
nuclear@4 115 inline bool operator ==(const Vector3 &a, const Vector3 &b)
nuclear@4 116 {
nuclear@4 117 return a.x == b.x && a.y == b.y && a.z == b.z;
nuclear@4 118 }
nuclear@4 119
nuclear@4 120 inline bool operator !=(const Vector3 &a, const Vector3 &b)
nuclear@4 121 {
nuclear@4 122 return !(a == b);
nuclear@4 123 }
nuclear@4 124
nuclear@4 125 inline float dot(const Vector3 &a, const Vector3 &b)
nuclear@4 126 {
nuclear@4 127 return a.x * b.x + a.y * b.y + a.z * b.z;
nuclear@4 128 }
nuclear@4 129
nuclear@4 130 inline Vector3 cross(const Vector3 &a, const Vector3 &b)
nuclear@4 131 {
nuclear@4 132 return Vector3(a.y * b.z - a.z * b.y,
nuclear@4 133 a.z * b.x - a.x * b.z,
nuclear@4 134 a.x * b.y - a.y * b.x);
nuclear@4 135 }
nuclear@4 136
nuclear@4 137 inline float length(const Vector3 &v)
nuclear@4 138 {
nuclear@4 139 return (float)sqrt(v.x * v.x + v.y * v.y + v.z * v.z);
nuclear@4 140 }
nuclear@4 141
nuclear@4 142 inline float length_sq(const Vector3 &v)
nuclear@4 143 {
nuclear@4 144 return v.x * v.x + v.y * v.y + v.z * v.z;
nuclear@4 145 }
nuclear@4 146
nuclear@4 147 inline Vector3 normalize(const Vector3 &v)
nuclear@4 148 {
nuclear@4 149 float len = length(v);
nuclear@4 150 if(len == 0.0f) {
nuclear@4 151 return v;
nuclear@4 152 }
nuclear@4 153
nuclear@4 154 return Vector3(v.x / len, v.y / len, v.z / len);
nuclear@4 155 }
nuclear@4 156
nuclear@4 157 inline Vector3 reflect(const Vector3 &v, const Vector3 &n)
nuclear@4 158 {
nuclear@4 159 return v - n * dot(n, v) * 2.0;
nuclear@4 160 }
nuclear@4 161
nuclear@4 162 inline Vector3 refract(const Vector3 &v, const Vector3 &n, float ior)
nuclear@4 163 {
nuclear@4 164 float ndotv = dot(n, v);
nuclear@4 165 float k = 1.0f - ior * ior * (1.0f - ndotv * ndotv);
nuclear@4 166 if(k < 0.0f) {
nuclear@4 167 return Vector3();
nuclear@4 168 }
nuclear@4 169 return ior * v - (ior * ndotv + sqrt(k)) * n;
nuclear@4 170 }
nuclear@4 171
nuclear@4 172 inline Vector3 refract(const Vector3 &v, const Vector3 &n, float from_ior, float to_ior)
nuclear@4 173 {
nuclear@4 174 if(to_ior == 0.0f) to_ior = 1.0f;
nuclear@4 175 return refract(v, n, from_ior / to_ior);
nuclear@4 176 }
nuclear@4 177
nuclear@4 178 inline Vector3 distance(const Vector3 &a, const Vector3 &b)
nuclear@4 179 {
nuclear@4 180 return length(a - b);
nuclear@4 181 }
nuclear@4 182
nuclear@4 183 inline Vector3 distance_sq(const Vector3 &a, const Vector3 &b)
nuclear@4 184 {
nuclear@4 185 return length_sq(a - b);
nuclear@4 186 }
nuclear@4 187
nuclear@4 188 inline Vector3 faceforward(const Vector3 &n, const Vector3 &vi, const Vector3 &ng)
nuclear@4 189 {
nuclear@4 190 return dot(ng, i) < 0.0f ? n : -n;
nuclear@4 191 }
nuclear@4 192
nuclear@4 193 // ---- Vector4 ----
nuclear@4 194
nuclear@4 195
nuclear@4 196 inline void Vector4::normalize()
nuclear@4 197 {
nuclear@4 198 float len = (float)sqrt(x * x + y * y + z * z + w * w);
nuclear@4 199 if(len != 0.0f) {
nuclear@4 200 x /= len;
nuclear@4 201 y /= len;
nuclear@4 202 z /= len;
nuclear@4 203 w /= len;
nuclear@4 204 }
nuclear@4 205 }
nuclear@4 206
nuclear@4 207 inline float &Vector4::operator[] (int idx)
nuclear@4 208 {
nuclear@4 209 return idx == 0 ? x : (idx == 1 ? y : (idx == 2 ? z : w));
nuclear@4 210 }
nuclear@4 211
nuclear@4 212 inline const float &Vector4::operator[] (int idx) const
nuclear@4 213 {
nuclear@4 214 return idx == 0 ? x : (idx == 1 ? y : (idx == 2 ? z : w));
nuclear@4 215 }
nuclear@4 216
nuclear@4 217 } // namespace gph