rev |
line source |
nuclear@0
|
1 #ifndef VEC3_H_
|
nuclear@0
|
2 #define VEC3_H_
|
nuclear@0
|
3
|
nuclear@0
|
4 #include <math.h>
|
nuclear@0
|
5
|
nuclear@0
|
6 class Vector3 {
|
nuclear@0
|
7 public:
|
nuclear@0
|
8 float x, y, z;
|
nuclear@0
|
9
|
nuclear@0
|
10 Vector3() : x(0), y(0), z(0) {}
|
nuclear@0
|
11 Vector3(float x_, float y_, float z_) : x(x_), y(y_), z(z_) {}
|
nuclear@0
|
12 };
|
nuclear@0
|
13
|
nuclear@0
|
14 inline Vector3 operator +(const Vector3 &a, const Vector3 &b)
|
nuclear@0
|
15 {
|
nuclear@0
|
16 return Vector3(a.x + b.x, a.y + b.y, a.z + b.z);
|
nuclear@0
|
17 }
|
nuclear@0
|
18
|
nuclear@0
|
19 inline Vector3 operator -(const Vector3 &a, const Vector3 &b)
|
nuclear@0
|
20 {
|
nuclear@0
|
21 return Vector3(a.x - b.x, a.y - b.y, a.z - b.z);
|
nuclear@0
|
22 }
|
nuclear@0
|
23
|
nuclear@0
|
24 inline Vector3 operator *(const Vector3 &a, const Vector3 &b)
|
nuclear@0
|
25 {
|
nuclear@0
|
26 return Vector3(a.x * b.x, a.y * b.y, a.z * b.z);
|
nuclear@0
|
27 }
|
nuclear@0
|
28
|
nuclear@0
|
29 inline Vector3 operator /(const Vector3 &a, const Vector3 &b)
|
nuclear@0
|
30 {
|
nuclear@0
|
31 return Vector3(a.x / b.x, a.y / b.y, a.z / b.z);
|
nuclear@0
|
32 }
|
nuclear@0
|
33
|
nuclear@0
|
34 inline Vector3 &operator +=(Vector3 &a, const Vector3 &b)
|
nuclear@0
|
35 {
|
nuclear@0
|
36 a.x += b.x;
|
nuclear@0
|
37 a.y += b.y;
|
nuclear@0
|
38 a.z += b.z;
|
nuclear@0
|
39 return a;
|
nuclear@0
|
40 }
|
nuclear@0
|
41
|
nuclear@0
|
42 inline Vector3 &operator -=(Vector3 &a, const Vector3 &b)
|
nuclear@0
|
43 {
|
nuclear@0
|
44 a.x -= b.x;
|
nuclear@0
|
45 a.y -= b.y;
|
nuclear@0
|
46 a.z -= b.z;
|
nuclear@0
|
47 return a;
|
nuclear@0
|
48 }
|
nuclear@0
|
49
|
nuclear@0
|
50 inline Vector3 operator *(const Vector3 &v, float s)
|
nuclear@0
|
51 {
|
nuclear@0
|
52 return Vector3(v.x * s, v.y * s, v.z * s);
|
nuclear@0
|
53 }
|
nuclear@0
|
54
|
nuclear@0
|
55 inline Vector3 operator *(float s, const Vector3 &v)
|
nuclear@0
|
56 {
|
nuclear@0
|
57 return Vector3(v.x * s, v.y * s, v.z * s);
|
nuclear@0
|
58 }
|
nuclear@0
|
59
|
nuclear@0
|
60 inline float dot(const Vector3 &a, const Vector3 &b)
|
nuclear@0
|
61 {
|
nuclear@0
|
62 return a.x * b.x + a.y * b.y + a.z * b.z;
|
nuclear@0
|
63 }
|
nuclear@0
|
64
|
nuclear@0
|
65 inline float length(const Vector3 &v)
|
nuclear@0
|
66 {
|
nuclear@0
|
67 return sqrt(v.x * v.x + v.y * v.y + v.z * v.z);
|
nuclear@0
|
68 }
|
nuclear@0
|
69
|
nuclear@0
|
70 inline float length_sq(const Vector3 &v)
|
nuclear@0
|
71 {
|
nuclear@0
|
72 return v.x * v.x + v.y * v.y + v.z * v.z;
|
nuclear@0
|
73 }
|
nuclear@0
|
74
|
nuclear@0
|
75 inline Vector3 normalize(const Vector3 &v)
|
nuclear@0
|
76 {
|
nuclear@0
|
77 float len = length(v);
|
nuclear@0
|
78 if(len == 0.0f) {
|
nuclear@0
|
79 return v;
|
nuclear@0
|
80 }
|
nuclear@0
|
81 return Vector3(v.x / len, v.y / len, v.z / len);
|
nuclear@0
|
82 }
|
nuclear@0
|
83
|
nuclear@0
|
84 inline float lerp(float a, float b, float t)
|
nuclear@0
|
85 {
|
nuclear@0
|
86 return a + (b - a) * t;
|
nuclear@0
|
87 }
|
nuclear@0
|
88
|
nuclear@0
|
89 inline Vector3 lerp(const Vector3 &a, const Vector3 &b, float t)
|
nuclear@0
|
90 {
|
nuclear@0
|
91 return Vector3(lerp(a.x, b.x, t), lerp(a.y, b.y, t), lerp(a.z, b.z, t));
|
nuclear@0
|
92 }
|
nuclear@0
|
93
|
nuclear@0
|
94 #endif // VEC3_H_
|