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