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