rev |
line source |
nuclear@3
|
1 #ifndef VMATH_H_
|
nuclear@3
|
2 #define VMATH_H_
|
nuclear@3
|
3
|
nuclear@4
|
4 #include <math.h>
|
nuclear@4
|
5
|
nuclear@3
|
6 class Vector2 {
|
nuclear@3
|
7 public:
|
nuclear@3
|
8 float x, y;
|
nuclear@3
|
9
|
nuclear@3
|
10 Vector2() : x(0), y(0) {}
|
nuclear@3
|
11 Vector2(float xa, float ya) : x(xa), y(ya) {}
|
nuclear@3
|
12
|
nuclear@3
|
13 float &operator [](int idx) { return (&x)[idx]; }
|
nuclear@3
|
14 const float &operator [](int idx) const { return (&x)[idx]; }
|
nuclear@3
|
15 };
|
nuclear@3
|
16
|
nuclear@3
|
17 class Vector3 {
|
nuclear@3
|
18 public:
|
nuclear@3
|
19 float x, y, z;
|
nuclear@3
|
20
|
nuclear@3
|
21 Vector3() : x(0), y(0), z(0) {}
|
nuclear@3
|
22 Vector3(float xa, float ya, float za) : x(xa), y(ya), z(za) {}
|
nuclear@3
|
23
|
nuclear@3
|
24 float &operator [](int idx) { return (&x)[idx]; }
|
nuclear@3
|
25 const float &operator [](int idx) const { return (&x)[idx]; }
|
nuclear@3
|
26 };
|
nuclear@3
|
27
|
nuclear@4
|
28 inline Vector3 operator +(const Vector3 &a, const Vector3 &b)
|
nuclear@4
|
29 {
|
nuclear@4
|
30 return Vector3(a.x + b.x, a.y + b.y, a.z + b.z);
|
nuclear@4
|
31 }
|
nuclear@4
|
32
|
nuclear@4
|
33 inline Vector3 operator -(const Vector3 &a, const Vector3 &b)
|
nuclear@4
|
34 {
|
nuclear@4
|
35 return Vector3(a.x - b.x, a.y - b.y, a.z - b.z);
|
nuclear@4
|
36 }
|
nuclear@4
|
37
|
nuclear@4
|
38 inline Vector3 operator *(const Vector3 &a, float s)
|
nuclear@4
|
39 {
|
nuclear@4
|
40 return Vector3(a.x * s, a.y * s, a.z * s);
|
nuclear@4
|
41 }
|
nuclear@4
|
42
|
nuclear@4
|
43 inline float dot(const Vector3 &a, const Vector3 &b)
|
nuclear@4
|
44 {
|
nuclear@4
|
45 return a.x * b.x + a.y * b.y + a.z * b.z;
|
nuclear@4
|
46 }
|
nuclear@4
|
47
|
nuclear@4
|
48 inline float length(const Vector3 &v)
|
nuclear@4
|
49 {
|
nuclear@4
|
50 return sqrt(dot(v, v));
|
nuclear@4
|
51 }
|
nuclear@4
|
52
|
nuclear@4
|
53 inline Vector3 normalize(const Vector3 &v)
|
nuclear@4
|
54 {
|
nuclear@4
|
55 float len = length(v);
|
nuclear@4
|
56 if(len == 0.0) {
|
nuclear@4
|
57 return v;
|
nuclear@4
|
58 }
|
nuclear@4
|
59 return Vector3(v.x / len, v.y / len, v.z / len);
|
nuclear@4
|
60 }
|
nuclear@4
|
61
|
nuclear@3
|
62 class Vector4 {
|
nuclear@3
|
63 public:
|
nuclear@3
|
64 float x, y, z, w;
|
nuclear@3
|
65
|
nuclear@3
|
66 Vector4() : x(0), y(0), z(0), w(0) {}
|
nuclear@3
|
67 Vector4(float xa, float ya, float za, float wa) : x(xa), y(ya), z(za), w(wa) {}
|
nuclear@3
|
68
|
nuclear@3
|
69 float &operator [](int idx) { return (&x)[idx]; }
|
nuclear@3
|
70 const float &operator [](int idx) const { return (&x)[idx]; }
|
nuclear@3
|
71 };
|
nuclear@3
|
72
|
nuclear@4
|
73 class Ray {
|
nuclear@4
|
74 public:
|
nuclear@4
|
75 Vector3 origin, dir;
|
nuclear@4
|
76
|
nuclear@4
|
77 Ray() : origin(0, 0, 0), dir(0, 0, 1) {}
|
nuclear@4
|
78 Ray(const Vector3 &o, const Vector3 &d) : origin(o), dir(d) {}
|
nuclear@4
|
79 };
|
nuclear@4
|
80
|
nuclear@3
|
81 #endif // VMATH_H_
|