Oxygine  1
2g game engine
Vector3.h
1 #pragma once
2 #include "oxygine-include.h"
3 #include "Vector2.h"
4 namespace oxygine
5 {
6  template <class T>
7  class VectorT3
8  {
9  typedef VectorT3<T> vector3;
10  public:
11  typedef T type;
12 
13 
14  VectorT3();
15  VectorT3(const T*);
16  VectorT3(T, T, T);
17 
18  VectorT3& operator+=(const VectorT3&);
19  VectorT3& operator-=(const VectorT3&);
20 
21  VectorT3 operator + (const VectorT3&) const;
22  VectorT3 operator - (const VectorT3&) const;
23  VectorT3 operator - () const;
24 
25  VectorT3 operator * (T) const;
26  VectorT3 operator / (T) const;
27 
28  VectorT3& operator*=(T);
29  VectorT3& operator/=(T);
30 
31  template<class R>
32  operator VectorT3<R> ()const;
33 
34  VectorT2<T> xy() const
35  {
36  return VectorT2<T>(x, y);
37  }
38 
39  bool operator == (const VectorT3& r) const;
40  bool operator != (const VectorT3& r) const;
41 
42  void normalize();
43  VectorT3 normalized() const { VectorT3 t = *this; t.normalize(); return t; }
44 
45  void clamp(const VectorT3& min, const VectorT3& max);
46  T length() const;
47  T dot(const VectorT3& p) const;
48 
49  inline T& operator[](int i) {return m[i];}
50  inline const T& operator[](int i)const {return m[i];}
51 
53  static VectorT3& cross(VectorT3& out, const VectorT3& v1, const VectorT3& v2);
54  static T dot(const VectorT3& v1, const VectorT3& v2);
55  static VectorT3& normalize(VectorT3& out, const VectorT3& v);
56  static VectorT3& normalFromPoints(VectorT3& out, const VectorT3& v1, const VectorT3& v2, const VectorT3& v3);
57 
58  union
59  {
60  struct
61  {
62  T x, y, z;
63  };
64  T m[3];
65  };
66  };
67 
68  template<class T>
69  template<class R>
71  {
72  return VectorT3<R>(R(x), R(y), R(z));
73  }
74 
75 
76  template<class T>
77  bool VectorT3<T>::operator == (const VectorT3<T>& r) const
78  {
79  if (x == r.x && y == r.y && z == r.z)
80  return true;
81  return false;
82  }
83 
84  template<class T>
85  bool VectorT3<T>::operator != (const VectorT3<T>& r) const
86  {
87  return !(r == (*this));
88  }
89 
90  template <class T>
91  VectorT3<T>::VectorT3()
92  {}
93 
94  template <class T>
95  VectorT3<T>::VectorT3(const T* p):
96  x(p[0]), y(p[1]), z(p[2])
97  {
98  }
99 
100 
101  template <class T>
102  VectorT3<T>::VectorT3(T X, T Y, T Z):
103  x(X), y(Y), z(Z)
104  {
105  }
106 
107  template <class T>
108  VectorT3<T>& VectorT3<T>::operator+=(const VectorT3& v)
109  {
110  x += v.x; y += v.y; z += v.z; return (*this);
111  }
112 
113  template <class T>
114  VectorT3<T>& VectorT3<T>::operator-=(const VectorT3& v)
115  {
116  x -= v.x; y -= v.y; z -= v.z; return (*this);
117  }
118 
119  template <class T>
120  VectorT3<T> VectorT3<T>::operator + (const VectorT3& v) const
121  {
122  return VectorT3(x + v.x, y + v.y, z + v.z);
123  }
124 
125  template <class T>
126  VectorT3<T> VectorT3<T>::operator - (const VectorT3& v) const
127  {
128  return VectorT3(x - v.x, y - v.y, z - v.z);
129  }
130 
131  template <class T>
132  VectorT3<T> VectorT3<T>::operator - () const
133  {
134  return VectorT3(-x, -y, -z);
135  }
136 
137  template <class T>
138  VectorT3<T> VectorT3<T>::operator * (T s) const
139  {
140  return VectorT3(x * s, y * s, z * s);
141  }
142 
143  template <class T>
144  VectorT3<T> VectorT3<T>::operator / (T v) const
145  {
146  T s = T(1) / v;
147  return VectorT3(x * s, y * s, z * s);
148  }
149 
150 
151  template <class T>
152  VectorT3<T>& VectorT3<T>::operator*=(T s)
153  {
154  x *= s; y *= s; z *= s; return (*this);
155  }
156 
157  template <class T>
158  VectorT3<T>& VectorT3<T>::operator/=(T s)
159  {
160  T is = T(1.0) / s;
161  x *= is; y *= is; z *= is; return (*this);
162  }
163 
164  template <class T>
165  void VectorT3<T>::normalize()
166  {
167  normalize(*this, *this);
168  }
169 
170  template <class T>
171  T VectorT3<T>::length() const
172  {
173  return scalar::sqrt(x * x + y * y + z * z);
174  }
175 
176  template <class T>
177  T VectorT3<T>::dot(const VectorT3& p) const
178  {
179  return VectorT3<T>::dot(*this, p);
180  }
181 
182 
183  template <class T>
184  inline VectorT3<T>& VectorT3<T>::cross(VectorT3& out, const VectorT3& v1, const VectorT3& v2)
185  {
186  out.x = v1.y * v2.z - v1.z * v2.y;
187  out.y = v1.z * v2.x - v1.x * v2.z;
188  out.z = v1.x * v2.y - v1.y * v2.x;
189  return out;
190  }
191 
192  template <class T>
193  inline void VectorT3<T>::clamp(const VectorT3& min, const VectorT3& max)
194  {
195  if (x > max.x)
196  x = max.x;
197  if (y > max.y)
198  y = max.y;
199  if (z > max.z)
200  z = max.z;
201 
202  if (x < min.x)
203  x = min.x;
204  if (y < min.y)
205  y = min.y;
206  if (z < min.z)
207  z = min.z;
208  }
209 
210  template <class T>
211  inline T VectorT3<T>::dot(const VectorT3& v1, const VectorT3& v2)
212  {
213  return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z;
214  }
215 
216  template <class T>
217  inline VectorT3<T>& VectorT3<T>::normalize(VectorT3<T>& out, const VectorT3<T>& v)
218  {
219  T norm = T(1.0) / scalar::sqrt(v.x * v.x + v.y * v.y + v.z * v.z);
220  out = v;
221  out.x *= norm;
222  out.y *= norm;
223  out.z *= norm;
224  return out;
225  }
226 
227  template <class T>
228  inline VectorT3<T>& VectorT3<T>::normalFromPoints(VectorT3& out, const VectorT3& v1, const VectorT3& v2, const VectorT3& v3)
229  {
230  vector3 b1 = v1 - v2;
231  vector3 b2 = v3 - v2;
232  vector3 cross;
233  vector3::cross(&cross, b2, b1);
234  vector3::normalize(&cross, cross);
235 
236  out.x = cross.x;
237  out.y = cross.y;
238  out.z = cross.z;
239 
240  return out;
241  }
242 
243  typedef VectorT3<float> Vector3;
244  typedef VectorT3<double> VectorD3;
245 }
–oxgl-end–!
Definition: Actor.h:14
Definition: Vector2.h:9
Definition: Vector3.h:7