rayzor

annotate src/vmath.h @ 12:d94a69933a71

lots of stuff, can't remember
author John Tsiombikas <nuclear@member.fsf.org>
date Sat, 12 Apr 2014 23:28:24 +0300
parents a826bf0fb169
children be616b58df99
rev   line source
nuclear@1 1 #ifndef VMATH_H_
nuclear@1 2 #define VMATH_H_
nuclear@1 3
nuclear@1 4 #include <math.h>
nuclear@1 5 #include "vmathmat.h"
nuclear@1 6
nuclear@1 7 class Vector3 {
nuclear@1 8 public:
nuclear@1 9 float x, y, z;
nuclear@1 10
nuclear@1 11 Vector3() : x(0), y(0), z(0) {}
nuclear@1 12 Vector3(float xx, float yy, float zz) : x(xx), y(yy), z(zz) {}
nuclear@1 13
nuclear@1 14 float length_sq() const { return x * x + y * y + z * z; }
nuclear@1 15 float length() const { return sqrt(x * x + y * y + z * z); }
nuclear@1 16
nuclear@1 17 void normalize()
nuclear@1 18 {
nuclear@1 19 float len = length();
nuclear@1 20 if(len != 0.0) {
nuclear@1 21 x /= len;
nuclear@1 22 y /= len;
nuclear@1 23 z /= len;
nuclear@1 24 }
nuclear@1 25 }
nuclear@1 26
nuclear@1 27 float &operator [](int idx) { return idx == 2 ? z : (idx == 1 ? y : x); }
nuclear@1 28 const float &operator [](int idx) const { return idx == 2 ? z : (idx == 1 ? y : x); }
nuclear@1 29 };
nuclear@1 30
nuclear@1 31 inline Vector3 normalize(const Vector3 &v)
nuclear@1 32 {
nuclear@1 33 float len = v.length();
nuclear@1 34 if(len != 0.0) {
nuclear@1 35 return Vector3(v.x / len, v.y / len, v.z / len);
nuclear@1 36 }
nuclear@1 37 return v;
nuclear@1 38 }
nuclear@1 39
nuclear@1 40 inline Vector3 operator +(const Vector3 &a, const Vector3 &b)
nuclear@1 41 {
nuclear@1 42 return Vector3(a.x + b.x, a.y + b.y, a.z + b.z);
nuclear@1 43 }
nuclear@1 44
nuclear@1 45 inline Vector3 operator -(const Vector3 &a, const Vector3 &b)
nuclear@1 46 {
nuclear@1 47 return Vector3(a.x - b.x, a.y - b.y, a.z - b.z);
nuclear@1 48 }
nuclear@1 49
nuclear@12 50 inline Vector3 operator *(const Vector3 &a, const Vector3 &b)
nuclear@12 51 {
nuclear@12 52 return Vector3(a.x * b.x, a.y * b.y, a.z * b.z);
nuclear@12 53 }
nuclear@12 54
nuclear@1 55 inline Vector3 operator *(const Vector3 &v, float s)
nuclear@1 56 {
nuclear@1 57 return Vector3(v.x * s, v.y * s, v.z * s);
nuclear@1 58 }
nuclear@1 59
nuclear@1 60 inline Vector3 operator /(const Vector3 &v, float s)
nuclear@1 61 {
nuclear@1 62 return Vector3(v.x / s, v.y / s, v.z / s);
nuclear@1 63 }
nuclear@1 64
nuclear@1 65 inline float dot(const Vector3 &a, const Vector3 &b)
nuclear@1 66 {
nuclear@1 67 return a.x * b.x + a.y * b.y + a.z * b.z;
nuclear@1 68 }
nuclear@1 69
nuclear@1 70 inline Vector3 cross(const Vector3 &a, const Vector3 &b)
nuclear@1 71 {
nuclear@1 72 return Vector3(a.y * b.z - a.z * b.y,
nuclear@12 73 a.z * b.x - a.x * b.z,
nuclear@1 74 a.x * b.y - a.y * b.x);
nuclear@1 75 }
nuclear@1 76
nuclear@1 77 inline Vector3 transform(const Matrix4x4 &m, const Vector3 &v)
nuclear@1 78 {
nuclear@1 79 float x = m.m[0][0] * v.x + m.m[0][1] * v.y + m.m[0][2] * v.z + m.m[0][3];
nuclear@1 80 float y = m.m[1][0] * v.x + m.m[1][1] * v.y + m.m[1][2] * v.z + m.m[1][3];
nuclear@1 81 float z = m.m[2][0] * v.x + m.m[2][1] * v.y + m.m[2][2] * v.z + m.m[2][3];
nuclear@1 82 return Vector3(x, y, z);
nuclear@1 83 }
nuclear@1 84
nuclear@1 85 // ---- Vector4 ----
nuclear@1 86
nuclear@1 87 class Vector4 {
nuclear@1 88 public:
nuclear@1 89 float x, y, z, w;
nuclear@1 90
nuclear@1 91 Vector4() : x(0), y(0), z(0), w(1.0) {}
nuclear@1 92 Vector4(const Vector3 &v) : x(v.x), y(v.y), z(v.z), w(1.0) {}
nuclear@1 93 Vector4(float xx, float yy, float zz, float ww) : x(xx), y(yy), z(zz), w(ww) {}
nuclear@1 94
nuclear@1 95 float length_sq() const { return x * x + y * y + z * z + w * w; }
nuclear@1 96 float length() const { return sqrt(x * x + y * y + z * z + w * w); }
nuclear@1 97
nuclear@1 98 void normalize()
nuclear@1 99 {
nuclear@1 100 float len = length();
nuclear@1 101 if(len != 0.0) {
nuclear@1 102 x /= len;
nuclear@1 103 y /= len;
nuclear@1 104 z /= len;
nuclear@1 105 w /= len;
nuclear@1 106 }
nuclear@1 107 }
nuclear@1 108
nuclear@1 109 float &operator [](int idx)
nuclear@1 110 {
nuclear@1 111 return idx == 3 ? w : (idx == 2 ? z : (idx == 1 ? y : x));
nuclear@1 112 }
nuclear@1 113 const float &operator [](int idx) const
nuclear@1 114 {
nuclear@1 115 return idx == 3 ? w : (idx == 2 ? z : (idx == 1 ? y : x));
nuclear@1 116 }
nuclear@1 117 };
nuclear@1 118
nuclear@1 119 inline Vector4 operator +(const Vector4 &a, const Vector4 &b)
nuclear@1 120 {
nuclear@1 121 return Vector4(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w);
nuclear@1 122 }
nuclear@1 123
nuclear@1 124 inline Vector4 operator -(const Vector4 &a, const Vector4 &b)
nuclear@1 125 {
nuclear@1 126 return Vector4(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w);
nuclear@1 127 }
nuclear@1 128
nuclear@1 129 inline Vector4 operator *(const Vector4 &v, float s)
nuclear@1 130 {
nuclear@1 131 return Vector4(v.x * s, v.y * s, v.z * s, v.w * s);
nuclear@1 132 }
nuclear@1 133
nuclear@1 134 inline Vector4 operator /(const Vector4 &v, float s)
nuclear@1 135 {
nuclear@1 136 return Vector4(v.x / s, v.y / s, v.z / s, v.w / s);
nuclear@1 137 }
nuclear@1 138
nuclear@1 139 inline float dot(const Vector4 &a, const Vector4 &b)
nuclear@1 140 {
nuclear@1 141 return a.x * b.x + a.y * b.y + a.z * b.z + a.w * b.w;
nuclear@1 142 }
nuclear@1 143
nuclear@1 144 inline Vector4 transform(const Matrix4x4 &m, const Vector4 &v)
nuclear@1 145 {
nuclear@1 146 float x = m.m[0][0] * v.x + m.m[0][1] * v.y + m.m[0][2] * v.z + m.m[0][3] * v.w;
nuclear@1 147 float y = m.m[1][0] * v.x + m.m[1][1] * v.y + m.m[1][2] * v.z + m.m[1][3] * v.w;
nuclear@1 148 float z = m.m[2][0] * v.x + m.m[2][1] * v.y + m.m[2][2] * v.z + m.m[2][3] * v.w;
nuclear@1 149 float w = m.m[3][0] * v.x + m.m[3][1] * v.y + m.m[3][2] * v.z + m.m[3][3] * v.w;
nuclear@1 150 return Vector4(x, y, z, w);
nuclear@1 151 }
nuclear@1 152
nuclear@1 153 #endif // VMATH_H_