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_ */
|