glide_test1

annotate vmath.h @ 0:f3ddb2bb7024

first 3dfx glide test, initial commit
author John Tsiombikas <nuclear@member.fsf.org>
date Sun, 09 Mar 2014 06:27:58 +0200
parents
children
rev   line source
nuclear@0 1 #ifndef VMATH_H_
nuclear@0 2 #define VMATH_H_
nuclear@0 3
nuclear@0 4 #include <math.h>
nuclear@0 5 #include "matrix.h"
nuclear@0 6
nuclear@0 7 class Vector4;
nuclear@0 8
nuclear@0 9 class Vector3 {
nuclear@0 10 public:
nuclear@0 11 float x, y, z;
nuclear@0 12
nuclear@0 13 Vector3() : x(0), y(0), z(0) {}
nuclear@0 14 Vector3(float xx, float yy, float zz) : x(xx), y(yy), z(zz) {}
nuclear@0 15 explicit inline Vector3(const Vector4 &v);
nuclear@0 16
nuclear@0 17 inline float &operator [](int idx)
nuclear@0 18 {
nuclear@0 19 switch(idx) {
nuclear@0 20 case 0:
nuclear@0 21 return x;
nuclear@0 22 case 1:
nuclear@0 23 return y;
nuclear@0 24 case 2:
nuclear@0 25 default:
nuclear@0 26 return z;
nuclear@0 27 }
nuclear@0 28 }
nuclear@0 29
nuclear@0 30 inline const float &operator [](int idx) const
nuclear@0 31 {
nuclear@0 32 switch(idx) {
nuclear@0 33 case 0:
nuclear@0 34 return x;
nuclear@0 35 case 1:
nuclear@0 36 return y;
nuclear@0 37 case 2:
nuclear@0 38 default:
nuclear@0 39 return z;
nuclear@0 40 }
nuclear@0 41 }
nuclear@0 42
nuclear@0 43 inline float length() const
nuclear@0 44 {
nuclear@0 45 return sqrt(x * x + y * y + z * z);
nuclear@0 46 }
nuclear@0 47
nuclear@0 48 inline void normalize()
nuclear@0 49 {
nuclear@0 50 float len = length();
nuclear@0 51 if(len != 0) {
nuclear@0 52 x /= len;
nuclear@0 53 y /= len;
nuclear@0 54 z /= len;
nuclear@0 55 }
nuclear@0 56 }
nuclear@0 57 };
nuclear@0 58
nuclear@0 59 inline Vector3 operator +(const Vector3 &a, const Vector3 &b)
nuclear@0 60 {
nuclear@0 61 return Vector3(a.x + b.x, a.y + b.y, a.z + b.z);
nuclear@0 62 }
nuclear@0 63
nuclear@0 64 inline Vector3 operator -(const Vector3 &a, const Vector3 &b)
nuclear@0 65 {
nuclear@0 66 return Vector3(a.x - b.x, a.y - b.y, a.z - b.z);
nuclear@0 67 }
nuclear@0 68
nuclear@0 69 inline Vector3 operator *(const Vector3 &a, const Vector3 &b)
nuclear@0 70 {
nuclear@0 71 return Vector3(a.x * b.x, a.y * b.y, a.z * b.z);
nuclear@0 72 }
nuclear@0 73
nuclear@0 74 inline Vector3 operator *(const Vector3 &v, float s)
nuclear@0 75 {
nuclear@0 76 return Vector3(v.x * s, v.y * s, v.z * s);
nuclear@0 77 }
nuclear@0 78
nuclear@0 79 inline Vector3 operator *(float s, const Vector3 &v)
nuclear@0 80 {
nuclear@0 81 return Vector3(v.x * s, v.y * s, v.z * s);
nuclear@0 82 }
nuclear@0 83
nuclear@0 84 inline Vector3 operator /(const Vector3 &a, const Vector3 &b)
nuclear@0 85 {
nuclear@0 86 return Vector3(a.x / b.x, a.y / b.y, a.z / b.z);
nuclear@0 87 }
nuclear@0 88
nuclear@0 89 inline Vector3 operator /(const Vector3 &v, float s)
nuclear@0 90 {
nuclear@0 91 return Vector3(v.x / s, v.y / s, v.z / s);
nuclear@0 92 }
nuclear@0 93
nuclear@0 94 inline float dot(const Vector3 &a, const Vector3 &b)
nuclear@0 95 {
nuclear@0 96 return a.x * b.x + a.y * b.y + a.z * b.z;
nuclear@0 97 }
nuclear@0 98
nuclear@0 99 inline Vector3 cross(const Vector3 &a, const Vector3 &b)
nuclear@0 100 {
nuclear@0 101 return Vector3(a.y * b.z - a.z * b.y,
nuclear@0 102 a.z * b.x - a.x * b.z,
nuclear@0 103 a.x * b.y - a.y * b.z);
nuclear@0 104 }
nuclear@0 105
nuclear@0 106
nuclear@0 107 inline float length(const Vector3 &v)
nuclear@0 108 {
nuclear@0 109 return sqrt(v.x * v.x + v.y * v.y + v.z * v.z);
nuclear@0 110 }
nuclear@0 111
nuclear@0 112 inline float length_sq(const Vector3 &v)
nuclear@0 113 {
nuclear@0 114 return v.x * v.x + v.y * v.y + v.z * v.z;
nuclear@0 115 }
nuclear@0 116
nuclear@0 117 inline Vector3 normalize(const Vector3 &v)
nuclear@0 118 {
nuclear@0 119 float len = length(v);
nuclear@0 120 float s = len == 0 ? 1.0 : 1.0 / len;
nuclear@0 121 return v * s;
nuclear@0 122 }
nuclear@0 123
nuclear@0 124 inline Vector3 transform(const Vector3 &v, const Matrix4x4 &m)
nuclear@0 125 {
nuclear@0 126 return Vector3(
nuclear@0 127 m[0][0] * v.x + m[0][1] * v.y + m[0][2] * v.z + m[0][3],
nuclear@0 128 m[1][0] * v.x + m[1][1] * v.y + m[1][2] * v.z + m[1][3],
nuclear@0 129 m[2][0] * v.x + m[2][1] * v.y + m[2][2] * v.z + m[2][3]);
nuclear@0 130 }
nuclear@0 131
nuclear@0 132
nuclear@0 133 // ---- Vector4 ----
nuclear@0 134 class Vector4 {
nuclear@0 135 public:
nuclear@0 136 float x, y, z, w;
nuclear@0 137
nuclear@0 138 Vector4() : x(0), y(0), z(0), w(1) {}
nuclear@0 139 Vector4(float xx, float yy, float zz, float ww = 1.0f) : x(xx), y(yy), z(zz), w(ww) {}
nuclear@0 140 explicit Vector4(const Vector3 &v) : x(v.x), y(v.y), z(v.z), w(1.0f) {}
nuclear@0 141
nuclear@0 142 inline float &operator [](int idx)
nuclear@0 143 {
nuclear@0 144 switch(idx) {
nuclear@0 145 case 0:
nuclear@0 146 return x;
nuclear@0 147 case 1:
nuclear@0 148 return y;
nuclear@0 149 case 2:
nuclear@0 150 return z;
nuclear@0 151 default:
nuclear@0 152 case 3:
nuclear@0 153 return w;
nuclear@0 154 }
nuclear@0 155 }
nuclear@0 156
nuclear@0 157 inline const float &operator [](int idx) const
nuclear@0 158 {
nuclear@0 159 switch(idx) {
nuclear@0 160 case 0:
nuclear@0 161 return x;
nuclear@0 162 case 1:
nuclear@0 163 return y;
nuclear@0 164 case 2:
nuclear@0 165 return z;
nuclear@0 166 case 3:
nuclear@0 167 default:
nuclear@0 168 return w;
nuclear@0 169 }
nuclear@0 170 }
nuclear@0 171
nuclear@0 172 inline float length() const
nuclear@0 173 {
nuclear@0 174 return sqrt(x * x + y * y + z * z + w * w);
nuclear@0 175 }
nuclear@0 176
nuclear@0 177 inline void normalize()
nuclear@0 178 {
nuclear@0 179 float len = length();
nuclear@0 180 if(len != 0) {
nuclear@0 181 x /= len;
nuclear@0 182 y /= len;
nuclear@0 183 z /= len;
nuclear@0 184 w /= len;
nuclear@0 185 }
nuclear@0 186 }
nuclear@0 187 };
nuclear@0 188
nuclear@0 189 inline Vector4 operator +(const Vector4 &a, const Vector4 &b)
nuclear@0 190 {
nuclear@0 191 return Vector4(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w);
nuclear@0 192 }
nuclear@0 193
nuclear@0 194 inline Vector4 operator -(const Vector4 &a, const Vector4 &b)
nuclear@0 195 {
nuclear@0 196 return Vector4(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w);
nuclear@0 197 }
nuclear@0 198
nuclear@0 199 inline Vector4 operator *(const Vector4 &a, const Vector4 &b)
nuclear@0 200 {
nuclear@0 201 return Vector4(a.x * b.x, a.y * b.y, a.z * b.z, a.w * b.w);
nuclear@0 202 }
nuclear@0 203
nuclear@0 204 inline Vector4 operator *(const Vector4 &v, float s)
nuclear@0 205 {
nuclear@0 206 return Vector4(v.x * s, v.y * s, v.z * s, v.w * s);
nuclear@0 207 }
nuclear@0 208
nuclear@0 209 inline Vector4 operator *(float s, const Vector4 &v)
nuclear@0 210 {
nuclear@0 211 return Vector4(v.x * s, v.y * s, v.z * s, v.w * s);
nuclear@0 212 }
nuclear@0 213
nuclear@0 214 inline Vector4 operator /(const Vector4 &a, const Vector4 &b)
nuclear@0 215 {
nuclear@0 216 return Vector4(a.x / b.x, a.y / b.y, a.z / b.z, a.w / b.w);
nuclear@0 217 }
nuclear@0 218
nuclear@0 219 inline Vector4 operator /(const Vector4 &v, float s)
nuclear@0 220 {
nuclear@0 221 return Vector4(v.x / s, v.y / s, v.z / s, v.w / s);
nuclear@0 222 }
nuclear@0 223
nuclear@0 224 inline float dot(const Vector4 &a, const Vector4 &b)
nuclear@0 225 {
nuclear@0 226 return a.x * b.x + a.y * b.y + a.z * b.z + a.w * b.w;
nuclear@0 227 }
nuclear@0 228
nuclear@0 229 inline float length(const Vector4 &v)
nuclear@0 230 {
nuclear@0 231 return sqrt(v.x * v.x + v.y * v.y + v.z * v.z + v.w * v.w);
nuclear@0 232 }
nuclear@0 233
nuclear@0 234 inline float length_sq(const Vector4 &v)
nuclear@0 235 {
nuclear@0 236 return v.x * v.x + v.y * v.y + v.z * v.z + v.w * v.w;
nuclear@0 237 }
nuclear@0 238
nuclear@0 239 inline Vector4 normalize(const Vector4 &v)
nuclear@0 240 {
nuclear@0 241 float len = length(v);
nuclear@0 242 float s = len == 0 ? 1.0 : 1.0 / len;
nuclear@0 243 return v * s;
nuclear@0 244 }
nuclear@0 245
nuclear@0 246 inline Vector4 transform(const Vector4 &v, const Matrix4x4 &m)
nuclear@0 247 {
nuclear@0 248 return Vector4(
nuclear@0 249 m[0][0] * v.x + m[0][1] * v.y + m[0][2] * v.z + m[0][3] * v.w,
nuclear@0 250 m[1][0] * v.x + m[1][1] * v.y + m[1][2] * v.z + m[1][3] * v.w,
nuclear@0 251 m[2][0] * v.x + m[2][1] * v.y + m[2][2] * v.z + m[2][3] * v.w,
nuclear@0 252 m[3][0] * v.x + m[3][1] * v.y + m[3][2] * v.z + m[3][3] * v.w);
nuclear@0 253 }
nuclear@0 254
nuclear@0 255 inline Vector3::Vector3(const Vector4 &v)
nuclear@0 256 : x(v.x), y(v.y), z(v.z)
nuclear@0 257 {
nuclear@0 258 }
nuclear@0 259
nuclear@0 260
nuclear@0 261 #endif // VMATH_H_