2 This file is part of the n3dmath2 library.
4 Copyright (c) 2004, 2005 John Tsiombikas <nuclear@siggraph.org>
6 The n3dmath2 library is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 The n3dmath2 library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with the n3dmath2 library; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 #ifndef _N3DMATH2_VEC_HPP_
22 #define _N3DMATH2_VEC_HPP_
25 #include "n3dmath2_types.hpp"
31 Vector2(scalar_t x = 0.0, scalar_t y = 0.0);
32 Vector2(const Vector3 &vec);
33 Vector2(const Vector4 &vec);
35 inline scalar_t &operator [](int elem);
38 friend inline Vector2 operator -(const Vector2 &vec);
40 // binary vector (op) vector operations
41 friend inline scalar_t dot_product(const Vector2 &v1, const Vector2 &v2);
43 friend inline Vector2 operator +(const Vector2 &v1, const Vector2 &v2);
44 friend inline Vector2 operator -(const Vector2 &v1, const Vector2 &v2);
45 friend inline Vector2 operator *(const Vector2 &v1, const Vector2 &v2);
46 friend inline Vector2 operator /(const Vector2 &v1, const Vector2 &v2);
47 friend inline bool operator ==(const Vector2 &v1, const Vector2 &v2);
49 friend inline void operator +=(Vector2 &v1, const Vector2 &v2);
50 friend inline void operator -=(Vector2 &v1, const Vector2 &v2);
51 friend inline void operator *=(Vector2 &v1, const Vector2 &v2);
52 friend inline void operator /=(Vector2 &v1, const Vector2 &v2);
54 // binary vector (op) scalar and scalar (op) vector operations
55 friend inline Vector2 operator +(const Vector2 &vec, scalar_t scalar);
56 friend inline Vector2 operator +(scalar_t scalar, const Vector2 &vec);
57 friend inline Vector2 operator -(const Vector2 &vec, scalar_t scalar);
58 friend inline Vector2 operator -(scalar_t scalar, const Vector2 &vec);
59 friend inline Vector2 operator *(const Vector2 &vec, scalar_t scalar);
60 friend inline Vector2 operator *(scalar_t scalar, const Vector2 &vec);
61 friend inline Vector2 operator /(const Vector2 &vec, scalar_t scalar);
62 friend inline Vector2 operator /(scalar_t scalar, const Vector2 &vec);
64 friend inline void operator +=(Vector2 &vec, scalar_t scalar);
65 friend inline void operator -=(Vector2 &vec, scalar_t scalar);
66 friend inline void operator *=(Vector2 &vec, scalar_t scalar);
67 friend inline void operator /=(Vector2 &vec, scalar_t scalar);
69 inline scalar_t length() const;
70 inline scalar_t length_sq() const;
72 Vector2 normalized() const;
74 void transform(const Matrix3x3 &mat);
75 Vector2 transformed(const Matrix3x3 &mat) const;
77 void rotate(scalar_t angle);
78 Vector2 rotated(scalar_t angle) const;
80 Vector2 reflection(const Vector2 &normal) const;
81 Vector2 refraction(const Vector2 &normal, scalar_t src_ior, scalar_t dst_ior) const;
83 friend std::ostream &operator <<(std::ostream &out, const Vector2 &vec);
90 Vector3(scalar_t x = 0.0, scalar_t y = 0.0, scalar_t z = 0.0);
91 Vector3(const Vector2 &vec);
92 Vector3(const Vector4 &vec);
93 Vector3(const SphVector &sph);
95 Vector3 &operator =(const SphVector &sph);
97 inline scalar_t &operator [](int elem);
100 friend inline Vector3 operator -(const Vector3 &vec);
102 // binary vector (op) vector operations
103 friend inline scalar_t dot_product(const Vector3 &v1, const Vector3 &v2);
104 friend inline Vector3 cross_product(const Vector3 &v1, const Vector3 &v2);
106 friend inline Vector3 operator +(const Vector3 &v1, const Vector3 &v2);
107 friend inline Vector3 operator -(const Vector3 &v1, const Vector3 &v2);
108 friend inline Vector3 operator *(const Vector3 &v1, const Vector3 &v2);
109 friend inline Vector3 operator /(const Vector3 &v1, const Vector3 &v2);
110 friend inline bool operator ==(const Vector3 &v1, const Vector3 &v2);
112 friend inline void operator +=(Vector3 &v1, const Vector3 &v2);
113 friend inline void operator -=(Vector3 &v1, const Vector3 &v2);
114 friend inline void operator *=(Vector3 &v1, const Vector3 &v2);
115 friend inline void operator /=(Vector3 &v1, const Vector3 &v2);
117 // binary vector (op) scalar and scalar (op) vector operations
118 friend inline Vector3 operator +(const Vector3 &vec, scalar_t scalar);
119 friend inline Vector3 operator +(scalar_t scalar, const Vector3 &vec);
120 friend inline Vector3 operator -(const Vector3 &vec, scalar_t scalar);
121 friend inline Vector3 operator -(scalar_t scalar, const Vector3 &vec);
122 friend inline Vector3 operator *(const Vector3 &vec, scalar_t scalar);
123 friend inline Vector3 operator *(scalar_t scalar, const Vector3 &vec);
124 friend inline Vector3 operator /(const Vector3 &vec, scalar_t scalar);
125 friend inline Vector3 operator /(scalar_t scalar, const Vector3 &vec);
127 friend inline void operator +=(Vector3 &vec, scalar_t scalar);
128 friend inline void operator -=(Vector3 &vec, scalar_t scalar);
129 friend inline void operator *=(Vector3 &vec, scalar_t scalar);
130 friend inline void operator /=(Vector3 &vec, scalar_t scalar);
132 inline scalar_t length() const;
133 inline scalar_t length_sq() const;
135 Vector3 normalized() const;
137 void transform(const Matrix3x3 &mat);
138 Vector3 transformed(const Matrix3x3 &mat) const;
139 void transform(const Matrix4x4 &mat);
140 Vector3 transformed(const Matrix4x4 &mat) const;
141 void transform(const Quaternion &quat);
142 Vector3 transformed(const Quaternion &quat) const;
144 void rotate(const Vector3 &euler);
145 Vector3 rotated(const Vector3 &euler) const;
147 Vector3 reflection(const Vector3 &normal) const;
148 Vector3 refraction(const Vector3 &normal, scalar_t src_ior, scalar_t dst_ior) const;
150 friend std::ostream &operator <<(std::ostream &out, const Vector3 &vec);
157 Vector4(scalar_t x = 0.0, scalar_t y = 0.0, scalar_t z = 0.0, scalar_t w = 0.0);
158 Vector4(const Vector2 &vec);
159 Vector4(const Vector3 &vec);
161 inline scalar_t &operator [](int elem);
164 friend inline Vector4 operator -(const Vector4 &vec);
166 // binary vector (op) vector operations
167 friend inline scalar_t dot_product(const Vector4 &v1, const Vector4 &v2);
168 friend inline Vector4 cross_product(const Vector4 &v1, const Vector4 &v2, const Vector4 &v3);
170 friend inline Vector4 operator +(const Vector4 &v1, const Vector4 &v2);
171 friend inline Vector4 operator -(const Vector4 &v1, const Vector4 &v2);
172 friend inline Vector4 operator *(const Vector4 &v1, const Vector4 &v2);
173 friend inline Vector4 operator /(const Vector4 &v1, const Vector4 &v2);
174 friend inline bool operator ==(const Vector4 &v1, const Vector4 &v2);
176 friend inline void operator +=(Vector4 &v1, const Vector4 &v2);
177 friend inline void operator -=(Vector4 &v1, const Vector4 &v2);
178 friend inline void operator *=(Vector4 &v1, const Vector4 &v2);
179 friend inline void operator /=(Vector4 &v1, const Vector4 &v2);
181 // binary vector (op) scalar and scalar (op) vector operations
182 friend inline Vector4 operator +(const Vector4 &vec, scalar_t scalar);
183 friend inline Vector4 operator +(scalar_t scalar, const Vector4 &vec);
184 friend inline Vector4 operator -(const Vector4 &vec, scalar_t scalar);
185 friend inline Vector4 operator -(scalar_t scalar, const Vector4 &vec);
186 friend inline Vector4 operator *(const Vector4 &vec, scalar_t scalar);
187 friend inline Vector4 operator *(scalar_t scalar, const Vector4 &vec);
188 friend inline Vector4 operator /(const Vector4 &vec, scalar_t scalar);
189 friend inline Vector4 operator /(scalar_t scalar, const Vector4 &vec);
191 friend inline void operator +=(Vector4 &vec, scalar_t scalar);
192 friend inline void operator -=(Vector4 &vec, scalar_t scalar);
193 friend inline void operator *=(Vector4 &vec, scalar_t scalar);
194 friend inline void operator /=(Vector4 &vec, scalar_t scalar);
196 inline scalar_t length() const;
197 inline scalar_t length_sq() const;
199 Vector4 normalized() const;
201 void transform(const Matrix4x4 &mat);
202 Vector4 transformed(const Matrix4x4 &mat) const;
204 Vector4 reflection(const Vector4 &normal) const;
205 Vector4 refraction(const Vector4 &normal, scalar_t src_ior, scalar_t dst_ior) const;
207 friend std::ostream &operator <<(std::ostream &out, const Vector4 &vec);
210 #include "n3dmath2_vec.inl"
212 #endif // _N3DMATH2_VEC_HPP_