Oxygine  1
2g game engine
Vector4.h
1 #pragma once
2 #include "oxygine-include.h"
3 #include "Vector3.h"
4 namespace oxygine
5 {
6  template <class T>
7  class VectorT4
8  {
9  typedef VectorT4<T> vector4;
10  typedef VectorT3<T> vector3;
11 
12  public:
13 
14  VectorT4();
15  VectorT4(const T*);
16  VectorT4(const VectorT3<T>&, const T&);
17  VectorT4(const T&, const T&, const T&, const T&);
18 
19  VectorT4& operator+=(const VectorT4&);
20  VectorT4& operator-=(const VectorT4&);
21 
22  VectorT4 operator + (const VectorT4&) const;
23  VectorT4 operator - (const VectorT4&) const;
24 
25  VectorT4& operator*=(T);
26  VectorT4& operator/=(T);
27 
28  VectorT4 operator * (T) const;
29  VectorT4 operator / (T) const;
30 
31  VectorT3<T> xyz()const;
32 
33  inline T& operator[](int i) {return m[i];}
34  inline const T& operator[](int i)const {return m[i];}
35 
36  operator T* ()const;
37  operator const T* () const;
38 
39  static T dot(const VectorT4& v1, const VectorT4& v2);
40  static VectorT4* planeFromPoints(VectorT4* pOut, const vector3& v1, const vector3& v2, const vector3& v3);
41 
42  template<typename D> friend D& operator << (D& os, VectorT4<T>* p);
43  template<typename D> friend D& operator << (D& os, VectorT4<T>& p);
44 
45  union
46  {
47  struct
48  {
49  T x, y, z, w;
50  };
51  T m[4];
52  };
53 
54  };
55 
56  template <class T>
57  VectorT4<T>::operator T* () const
58  {
59  return m;
60  }
61 
62  template <class T>
63  VectorT4<T>::operator const T* () const
64  {
65  return m;
66  }
67 
68  template <class T>
69  VectorT3<T> VectorT4<T>::xyz() const
70  {
71  return VectorT3<T>(x, y, z);
72  }
73 
74  template <class T>
75  VectorT4<T>::VectorT4()
76  {}
77 
78 
79  template <class T>
80  VectorT4<T>::VectorT4(const T& X, const T& Y, const T& Z, const T& W):
81  x(X), y(Y), z(Z), w(W)
82  {
83  }
84 
85  template <class T>
86  VectorT4<T>::VectorT4(const T* p): x(p[0]), y(p[1]), z(p[2]), w(p[3])
87  {
88  }
89 
90  template <class T>
91  VectorT4<T>::VectorT4(const VectorT3<T>& v, const T& W):
92  x(v.x), y(v.y), z(v.z), w(W)
93  {
94  }
95 
96 
97  template <class T>
98  VectorT4<T>& VectorT4<T>::operator+=(const VectorT4& v)
99  {
100  x += v.x; y += v.y; z += v.z; w += v.w; return (*this);
101  }
102 
103  template <class T>
104  VectorT4<T>& VectorT4<T>::operator-=(const VectorT4& v)
105  {
106  x -= v.x; y -= v.y; z -= v.z; w -= v.w; return (*this);
107  }
108 
109  template <class T>
110  VectorT4<T> VectorT4<T>::operator + (const VectorT4& v) const
111  {
112  return VectorT4(x + v.x, y + v.y, z + v.z, w + v.w);
113  }
114 
115  template <class T>
116  VectorT4<T> VectorT4<T>::operator - (const VectorT4& v) const
117  {
118  return VectorT4(x - v.x, y - v.y, z - v.z, w - v.w);
119  }
120 
121  template <class T>
122  VectorT4<T>& VectorT4<T>::operator*=(T s)
123  {
124  x *= s; y *= s; z *= s; w *= s; return (*this);
125  }
126 
127  template <class T>
128  VectorT4<T>& VectorT4<T>::operator/=(T s)
129  {
130  T is = T(1.0) / s;
131  x *= is; y *= is; z *= is; w *= is; return (*this);
132  }
133 
134  template <class T>
135  VectorT4<T> VectorT4<T>::operator * (T s) const
136  {
137  return VectorT4(x * s, y * s, z * s, w * s);
138  }
139 
140  template <class T>
141  VectorT4<T> VectorT4<T>::operator / (T v) const
142  {
143  T s = T(1) / v;
144  return VectorT4(x * s, y * s, z * s, w * s);
145  }
146 
147  template <class T>
148  inline T VectorT4<T>::dot(const VectorT4& v1, const VectorT4& v2)
149  {
150  return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z + v1.w * v2.w;
151  }
152 
153  template <class T>
154  inline VectorT4<T>* VectorT4<T>::planeFromPoints(VectorT4* pOut, const vector3& v1, const vector3& v2, const vector3& v3)
155  {
156  vector3 normal;
157  vector3::normalFromPoints(&normal, v1, v2, v3);
158  T dist = normal.dot(v1);
159 
160  *pOut = vector4(normal, dist);
161 
162  return pOut;
163  }
164 
165  typedef VectorT4<float> Vector4;
166  typedef VectorT4<double> VectorD4;
167 }
–oxgl-end–!
Definition: Actor.h:14
Definition: Vector4.h:7
Definition: Vector3.h:7