Oxygine  1
2g game engine
AffineTransform.h
1 #pragma once
2 #include "oxygine-include.h"
3 #include "Vector2.h"
4 #include "Matrix.h"
5 
6 namespace oxygine
7 {
8  template<class T>
9  class AffineTransformT
10  {
11  public:
12 
13  typedef VectorT2<T> vector2;
14  typedef AffineTransformT<T> affineTransform;
15  typedef MatrixT<T> matrix;
16 
17  AffineTransformT() {}
18  AffineTransformT(T a_, T b_, T c_, T d_, T x_, T y_): a(a_), b(b_), c(c_), d(d_), x(x_), y(y_) {}
19 
20 
21  explicit AffineTransformT(const matrix& m)
22  {
23  a = m.ml[0];
24  b = m.ml[1];
25  c = m.ml[4];
26  d = m.ml[5];
27  x = m.ml[12];
28  y = m.ml[13];
29  }
30 
31  void identity()
32  {
33  a = T(1);
34  b = T(0);
35  c = T(0);
36  d = T(1);
37  x = T(0);
38  y = T(0);
39  }
40 
41  static affineTransform getIdentity()
42  {
43  affineTransform t;
44  t.identity();
45  return t;
46  }
47 
48  void translate(const vector2& v)
49  {
50  x += a * v.x + c * v.y;
51  y += b * v.x + d * v.y;
52  }
53 
54  affineTransform translated(const vector2& v) const
55  {
56  affineTransform t = *this;
57  t.translate(v);
58  return t;
59  }
60 
61  void scale(const vector2& v)
62  {
63  a *= v.x;
64  b *= v.x;
65  c *= v.y;
66  d *= v.y;
67  }
68 
69  affineTransform scaled(const vector2& v) const
70  {
71  affineTransform t = *this;
72  t.scale(v);
73  return t;
74  }
75 
76  void rotate(T v)
77  {
78  T sin_ = scalar::sin(v);
79  T cos_ = scalar::cos(v);
80 
81  affineTransform rot(cos_, sin_, -sin_, cos_, 0, 0);
82  *this = *this * rot;
83  }
84 
85  affineTransform rotated(T v) const
86  {
87  affineTransform t = *this;
88  t.rotate(v);
89  return t;
90  }
91 
92  void invert()
93  {
94  affineTransform t = *this;
95 
96  T det = T(1) / (t.a * t.d - t.b * t.c);
97 
98  a = det * t.d;
99  b = -det * t.b;
100  c = -det * t.c;
101  d = det * t.a;
102  x = det * (t.c * t.y - t.d * t.x);
103  y = det * (t.b * t.x - t.a * t.y);
104  }
105 
106  affineTransform inverted() const
107  {
108  affineTransform t = *this;
109  t.invert();
110  return t;
111  }
112 
113  operator matrix() const
114  {
115  return toMatrix();
116  }
117 
118  matrix toMatrix() const
119  {
120  return matrix(
121  a, b, 0, 0,
122  c, d, 0, 0,
123  0, 0, 1, 0,
124  x, y, 0, 1
125  );
126  }
127 
128 
129  static affineTransform& multiply(affineTransform& out, const affineTransform& t1, const affineTransform& t2)
130  {
131  out.a = t1.a * t2.a + t1.b * t2.c;
132  out.b = t1.a * t2.b + t1.b * t2.d;
133  out.c = t1.c * t2.a + t1.d * t2.c;
134  out.d = t1.c * t2.b + t1.d * t2.d;
135  out.x = t1.x * t2.a + t1.y * t2.c + t2.x;
136  out.y = t1.x * t2.b + t1.y * t2.d + t2.y;
137 
138  return out;
139  }
140 
141 
142  affineTransform operator * (const affineTransform& t2) const
143  {
144  affineTransform r;
145  multiply(r, *this, t2);
146  return r;
147  }
148 
149  vector2 transform(const vector2& v) const
150  {
151  return vector2(
152  a * v.x + c * v.y + x,
153  b * v.x + d * v.y + y);
154  }
155 
156 
157  T a, b, c, d;
158  T x, y;
159  };
160 
161  typedef AffineTransformT<float> AffineTransform;
162 }
–oxgl-end–!
Definition: Actor.h:14