graphene

annotate src/gmath/vector.h @ 3:d71b4e899e08

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