added 3dengfx into the repo, probably not the correct version for this
[summerhack] / src / 3dengfx / src / n3dmath2 / n3dmath2_vec.hpp
1 /*
2 This file is part of the n3dmath2 library.
3
4 Copyright (c) 2004, 2005 John Tsiombikas <nuclear@siggraph.org>
5
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.
10
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.
15
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
19 */
20
21 #ifndef _N3DMATH2_VEC_HPP_
22 #define _N3DMATH2_VEC_HPP_
23
24 #include <iostream>
25 #include "n3dmath2_types.hpp"
26
27 class Vector2 {
28 public:
29         scalar_t x, y;
30
31         Vector2(scalar_t x = 0.0, scalar_t y = 0.0);
32         Vector2(const Vector3 &vec);
33         Vector2(const Vector4 &vec);
34         
35         inline scalar_t &operator [](int elem); 
36         
37         // unary operations
38         friend inline Vector2 operator -(const Vector2 &vec);
39         
40         // binary vector (op) vector operations
41         friend inline scalar_t dot_product(const Vector2 &v1, const Vector2 &v2);
42         
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);
48         
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);
53         
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);
63         
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);
68         
69         inline scalar_t length() const;
70         inline scalar_t length_sq() const;
71         void normalize();
72         Vector2 normalized() const;
73
74         void transform(const Matrix3x3 &mat);
75         Vector2 transformed(const Matrix3x3 &mat) const;
76
77         void rotate(scalar_t angle);
78         Vector2 rotated(scalar_t angle) const;
79                         
80         Vector2 reflection(const Vector2 &normal) const;
81         Vector2 refraction(const Vector2 &normal, scalar_t src_ior, scalar_t dst_ior) const;
82         
83         friend std::ostream &operator <<(std::ostream &out, const Vector2 &vec);
84 };
85
86 class Vector3 {
87 public:
88         scalar_t x, y, z;
89
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);
94
95         Vector3 &operator =(const SphVector &sph);
96         
97         inline scalar_t &operator [](int elem); 
98         
99         // unary operations
100         friend inline Vector3 operator -(const Vector3 &vec);
101         
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);
105         
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);
111         
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);
116         
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);
126         
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);
131         
132         inline scalar_t length() const;
133         inline scalar_t length_sq() const;
134         void normalize();
135         Vector3 normalized() const;
136         
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;
143
144         void rotate(const Vector3 &euler);
145         Vector3 rotated(const Vector3 &euler) const;
146         
147         Vector3 reflection(const Vector3 &normal) const;
148         Vector3 refraction(const Vector3 &normal, scalar_t src_ior, scalar_t dst_ior) const;
149         
150         friend std::ostream &operator <<(std::ostream &out, const Vector3 &vec);
151 };
152
153 class Vector4 {
154 public:
155         scalar_t x, y, z, w;
156
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);
160         
161         inline scalar_t &operator [](int elem); 
162         
163         // unary operations
164         friend inline Vector4 operator -(const Vector4 &vec);
165                 
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);
169         
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);
175         
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);
180         
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);
190         
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);
195         
196         inline scalar_t length() const;
197         inline scalar_t length_sq() const;
198         void normalize();
199         Vector4 normalized() const;
200
201         void transform(const Matrix4x4 &mat);
202         Vector4 transformed(const Matrix4x4 &mat) const;
203                 
204         Vector4 reflection(const Vector4 &normal) const;
205         Vector4 refraction(const Vector4 &normal, scalar_t src_ior, scalar_t dst_ior) const;
206         
207         friend std::ostream &operator <<(std::ostream &out, const Vector4 &vec);
208 };
209
210 #include "n3dmath2_vec.inl"
211
212 #endif  // _N3DMATH2_VEC_HPP_