Vector4 inline definitions, and rearrangement into multiple inl files
[gph-math] / src / vector.h
1 #ifndef GMATH_VEC_H_
2 #define GMATH_VEC_H_
3
4 #include <math.h>
5 #include "swizzle.h"
6
7 namespace gph {
8
9 // define the swizzle macros to emit function prototypes
10 #define GPH_SWIZZLE2(T, a, b)           inline Vector2 a##b() const;
11 #define GPH_SWIZZLE3(T, a, b, c)        inline Vector3 a##b##c() const;
12 #define GPH_SWIZZLE4(T, a, b, c, d)     inline Vector4 a##b##c##d() const;
13
14 class Vector3;
15 class Vector4;
16 class Matrix4x4;
17 class Quaternion;
18
19 class Vector2 {
20 public:
21         float x, y;
22
23         Vector2() : x(0), y(0) {}
24         Vector2(float x_, float y_) : x(x_), y(y_) {}
25         explicit Vector2(const Vector3 &v);
26
27         inline void normalize();
28         inline float &operator[] (int idx);
29         inline const float &operator[] (int idx) const;
30
31         GPH_VEC2_SWIZZLE
32 };
33
34 class Vector3 {
35 public:
36         float x, y, z;
37
38         Vector3() : x(0), y(0), z(0) {}
39         Vector3(float x_, float y_, float z_) : x(x_), y(y_), z(z_) {}
40         explicit Vector3(const Vector4 &v);
41
42         inline void normalize();
43         inline float &operator[] (int idx);
44         inline const float &operator[] (int idx) const;
45
46         GPH_VEC3_SWIZZLE
47 };
48
49
50 class Vector4 {
51 public:
52         float x, y, z, w;
53
54         Vector4() : x(0), y(0), z(0), w(0) {}
55         Vector4(float x_, float y_, float z_, float w_ = 1.0f) : x(x_), y(y_), z(z_), w(w_) {}
56         explicit Vector4(const Vector3 &v);
57
58         inline void normalize();
59         inline float &operator[] (int idx);
60         inline const float &operator[] (int idx) const;
61
62         GPH_VEC4_SWIZZLE
63 };
64
65 // ---- Vector3 functions ----
66 inline Vector3 operator -(const Vector3 &v);
67 inline Vector3 operator +(const Vector3 &a, const Vector3 &b);
68 inline Vector3 operator -(const Vector3 &a, const Vector3 &b);
69 inline Vector3 operator *(const Vector3 &a, const Vector3 &b);
70 inline Vector3 operator /(const Vector3 &a, const Vector3 &b);
71 inline Vector3 operator *(const Vector3 &v, float s);
72 inline Vector3 operator *(float s, const Vector3 &v);
73 inline Vector3 operator /(const Vector3 &v, float s);
74 inline Vector3 operator /(float s, const Vector3 &v);
75 inline Vector3 &operator +=(Vector3 &a, const Vector3 &b);
76 inline Vector3 &operator -=(Vector3 &a, const Vector3 &b);
77 inline Vector3 &operator *=(Vector3 &a, const Vector3 &b);
78 inline Vector3 &operator /=(Vector3 &a, const Vector3 &b);
79 inline Vector3 &operator *=(Vector3 &v, float s);
80 inline Vector3 &operator /=(Vector3 &v, float s);
81
82 Vector3 operator *(const Vector3 &v, const Matrix4x4 &m);
83 Vector3 operator *(const Matrix4x4 &m, const Vector3 &v);
84
85 inline bool operator ==(const Vector3 &a, const Vector3 &b);
86 inline bool operator !=(const Vector3 &a, const Vector3 &b);
87
88 inline float dot(const Vector3 &a, const Vector3 &b);
89 inline Vector3 cross(const Vector3 &a, const Vector3 &b);
90 inline float length(const Vector3 &v);
91 inline float length_sq(const Vector3 &v);
92 inline Vector3 normalize(const Vector3 &v);
93
94 inline Vector3 reflect(const Vector3 &v, const Vector3 &n);
95 inline Vector3 refract(const Vector3 &v, const Vector3 &n, float ior);
96 inline Vector3 refract(const Vector3 &v, const Vector3 &n, float from_ior, float to_ior);
97
98 inline float distance(const Vector3 &a, const Vector3 &b);
99 inline float distance_sq(const Vector3 &a, const Vector3 &b);
100 inline Vector3 faceforward(const Vector3 &n, const Vector3 &vi, const Vector3 &ng);
101
102 inline Vector3 major(const Vector3 &v);
103 inline int major_idx(const Vector3 &v);
104 inline Vector3 proj_axis(const Vector3 &v, const Vector3 &axis);
105
106 inline Vector3 rotate(const Vector3 &v, const Quaternion &q);
107 inline Vector3 rotate(const Vector3 &v, const Vector3 &axis, float angle);
108 inline Vector3 rotate(const Vector3 &v, const Vector3 &euler);
109
110
111 // ---- Vector4 functions ----
112 inline Vector4 operator -(const Vector4 &v);
113 inline Vector4 operator +(const Vector4 &a, const Vector4 &b);
114 inline Vector4 operator -(const Vector4 &a, const Vector4 &b);
115 inline Vector4 operator *(const Vector4 &a, const Vector4 &b);
116 inline Vector4 operator /(const Vector4 &a, const Vector4 &b);
117 inline Vector4 operator *(const Vector4 &v, float s);
118 inline Vector4 operator *(float s, const Vector4 &v);
119 inline Vector4 operator /(const Vector4 &v, float s);
120 inline Vector4 operator /(float s, const Vector4 &v);
121 inline Vector4 &operator +=(Vector4 &a, const Vector4 &b);
122 inline Vector4 &operator -=(Vector4 &a, const Vector4 &b);
123 inline Vector4 &operator *=(Vector4 &a, const Vector4 &b);
124 inline Vector4 &operator /=(Vector4 &a, const Vector4 &b);
125 inline Vector4 &operator *=(Vector4 &v, float s);
126 inline Vector4 &operator /=(Vector4 &v, float s);
127
128 Vector4 operator *(const Vector4 &v, const Matrix4x4 &m);
129 Vector4 operator *(const Matrix4x4 &m, const Vector4 &v);
130
131 inline bool operator ==(const Vector4 &a, const Vector4 &b);
132 inline bool operator !=(const Vector4 &a, const Vector4 &b);
133
134 inline float dot(const Vector4 &a, const Vector4 &b);
135 inline Vector4 cross(const Vector4 &a, const Vector4 &b, const Vector4 &c);
136 inline float length(const Vector4 &v);
137 inline float length_sq(const Vector4 &v);
138 inline Vector4 normalize(const Vector4 &v);
139
140 inline Vector4 reflect(const Vector4 &v, const Vector4 &n);
141 inline Vector4 refract(const Vector4 &v, const Vector4 &n, float ior);
142 inline Vector4 refract(const Vector4 &v, const Vector4 &n, float from_ior, float to_ior);
143
144 inline float distance(const Vector4 &a, const Vector4 &b);
145 inline float distance_sq(const Vector4 &a, const Vector4 &b);
146 inline Vector4 faceforward(const Vector4 &n, const Vector4 &vi, const Vector4 &ng);
147
148 inline Vector4 major(const Vector4 &v);
149 inline int major_idx(const Vector4 &v);
150 inline Vector4 proj_axis(const Vector4 &v, const Vector4 &axis);
151
152 inline Vector4 rotate(const Vector4 &v, const Quaternion &q);
153 inline Vector4 rotate(const Vector4 &v, const Vector4 &axis, float angle);
154 inline Vector4 rotate(const Vector4 &v, const Vector4 &euler);
155
156 // include definitions of all the inline functions above
157 #include "vector2.inl"
158 #include "vector3.inl"
159 #include "vector4.inl"
160
161 // change the swizzle macros to spit out the function definitions and invoke them
162 #undef GPH_SWIZZLE2
163 #undef GPH_SWIZZLE3
164 #undef GPH_SWIZZLE4
165 #define GPH_SWIZZLE2(T, a, b)           inline Vector2 T::a##b() const { return Vector2(a, b); }
166 #define GPH_SWIZZLE3(T, a, b, c)        inline Vector3 T::a##b##c() const { return Vector3(a, b, c); }
167 #define GPH_SWIZZLE4(T, a, b, c, d)     inline Vector4 T::a##b##c##d() const { return Vector4(a, b, c, d); }
168 GPH_VEC2_SWIZZLE
169 GPH_VEC3_SWIZZLE
170 GPH_VEC4_SWIZZLE
171
172 }
173
174 #endif  /* GMATH_VEC_H_ */