graphene

annotate gmath/vec.h @ 0:8ab44b19895e

graphene!!!
author John Tsiombikas <nuclear@member.fsf.org>
date Mon, 20 Jul 2015 07:08:25 +0300
parents
children
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@0 6 namespace gmath {
nuclear@0 7
nuclear@0 8 class Vec3 {
nuclear@0 9 public:
nuclear@0 10 float x, y, z;
nuclear@0 11
nuclear@0 12 Vec3() : x(0), y(0), z(0) {}
nuclear@0 13 Vec3(float x_, float y_, float z_) : x(x_), y(y_), z(z_) {}
nuclear@0 14
nuclear@0 15 void normalize()
nuclear@0 16 {
nuclear@0 17 float len = length(*this);
nuclear@0 18 if(len != 0.0f) {
nuclear@0 19 x /= len;
nuclear@0 20 y /= len;
nuclear@0 21 z /= len;
nuclear@0 22 }
nuclear@0 23 }
nuclear@0 24 };
nuclear@0 25
nuclear@0 26 inline Vec3 operator +(const Vec3 &a, const Vec3 &b)
nuclear@0 27 {
nuclear@0 28 return Vec3(a.x + b.x, a.y + b.y, a.z + b.z);
nuclear@0 29 }
nuclear@0 30
nuclear@0 31 inline Vec3 operator -(const Vec3 &a, const Vec3 &b)
nuclear@0 32 {
nuclear@0 33 return Vec3(a.x - b.x, a.y - b.y, a.z - b.z);
nuclear@0 34 }
nuclear@0 35
nuclear@0 36 inline Vec3 operator *(const Vec3 &a, const Vec3 &b)
nuclear@0 37 {
nuclear@0 38 return Vec3(a.x * b.x, a.y * b.y, a.z * b.z);
nuclear@0 39 }
nuclear@0 40
nuclear@0 41 inline Vec3 operator /(const Vec3 &a, const Vec3 &b)
nuclear@0 42 {
nuclear@0 43 return Vec3(a.x / b.x, a.y / b.y, a.z / b.z);
nuclear@0 44 }
nuclear@0 45
nuclear@0 46 inline Vec3 operator *(const Vec3 &v, float s)
nuclear@0 47 {
nuclear@0 48 return Vec3(v.x * s, v.y * s, v.z * s);
nuclear@0 49 }
nuclear@0 50
nuclear@0 51 inline Vec3 operator *(float s, const Vec3 &v)
nuclear@0 52 {
nuclear@0 53 return Vec3(s * v.x, s * v.y, s * v.z);
nuclear@0 54 }
nuclear@0 55
nuclear@0 56 inline Vec3 operator /(const Vec3 &v, float s)
nuclear@0 57 {
nuclear@0 58 return Vec3(v.x / s, v.y / s, v.z / s);
nuclear@0 59 }
nuclear@0 60
nuclear@0 61 inline Vec3 operator /(float s, const Vec3 &v)
nuclear@0 62 {
nuclear@0 63 return Vec3(s / v.x, s / v.y, s / v.z);
nuclear@0 64 }
nuclear@0 65
nuclear@0 66 inline Vec3 &operator +=(Vec3 &a, const Vec3 &b)
nuclear@0 67 {
nuclear@0 68 a.x += b.x;
nuclear@0 69 a.y += b.y;
nuclear@0 70 a.z += b.z;
nuclear@0 71 return *this;
nuclear@0 72 }
nuclear@0 73
nuclear@0 74 inline Vec3 &operator -=(Vec3 &a, const Vec3 &b)
nuclear@0 75 {
nuclear@0 76 a.x -= b.x;
nuclear@0 77 a.y -= b.y;
nuclear@0 78 a.z -= b.z;
nuclear@0 79 return *this;
nuclear@0 80 }
nuclear@0 81
nuclear@0 82 inline Vec3 &operator *=(Vec3 &a, const Vec3 &b)
nuclear@0 83 {
nuclear@0 84 a.x *= b.x;
nuclear@0 85 a.y *= b.y;
nuclear@0 86 a.z *= b.z;
nuclear@0 87 return *this;
nuclear@0 88 }
nuclear@0 89
nuclear@0 90 inline Vec3 &operator /=(Vec3 &a, const Vec3 &b)
nuclear@0 91 {
nuclear@0 92 a.x /= b.x;
nuclear@0 93 a.y /= b.y;
nuclear@0 94 a.z /= b.z;
nuclear@0 95 return *this;
nuclear@0 96 }
nuclear@0 97
nuclear@0 98 inline Vec3 &operator *=(Vec3 &v, float s)
nuclear@0 99 {
nuclear@0 100 v.x *= s;
nuclear@0 101 v.y *= s;
nuclear@0 102 v.z *= s;
nuclear@0 103 return *this;
nuclear@0 104 }
nuclear@0 105
nuclear@0 106 inline Vec3 &operator /=(Vec3 &v, float s)
nuclear@0 107 {
nuclear@0 108 v.x /= s;
nuclear@0 109 v.y /= s;
nuclear@0 110 v.z /= s;
nuclear@0 111 return *this;
nuclear@0 112 }
nuclear@0 113
nuclear@0 114 inline float dot(const Vec3 &a, const Vec3 &b)
nuclear@0 115 {
nuclear@0 116 return a.x * b.x + a.y * b.y + a.z * b.z;
nuclear@0 117 }
nuclear@0 118
nuclear@0 119 inline Vec3 cross(const Vec3 &a, const Vec3 &b)
nuclear@0 120 {
nuclear@0 121 return Vec3(a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x);
nuclear@0 122 }
nuclear@0 123
nuclear@0 124 inline float length(const Vec3 &v)
nuclear@0 125 {
nuclear@0 126 return (float)sqrt(v.x * v.x + v.y * v.y + v.z * v.z);
nuclear@0 127 }
nuclear@0 128
nuclear@0 129 inline float length_sq(const Vec3 &v)
nuclear@0 130 {
nuclear@0 131 return v.x * v.x + v.y * v.y + v.z * v.z;
nuclear@0 132 }
nuclear@0 133
nuclear@0 134 inline Vec3 normalize(const Vec3 &v)
nuclear@0 135 {
nuclear@0 136 float len = length(v);
nuclear@0 137 if(len == 0.0f) {
nuclear@0 138 return v;
nuclear@0 139 }
nuclear@0 140
nuclear@0 141 return Vec3(v.x / len, v.y / len, v.z / len);
nuclear@0 142 }
nuclear@0 143
nuclear@0 144 }
nuclear@0 145
nuclear@0 146 #endif /* GMATH_VEC_H_ */