1 #ifndef ANDROID_DVR_EIGEN_H_
2 #define ANDROID_DVR_EIGEN_H_
3 
4 #include <Eigen/Core>
5 #include <Eigen/Geometry>
6 
7 namespace Eigen {
8 
9 // Eigen doesn't take advantage of C++ template typedefs, but we can
10 template <class T, int N>
11 using Vector = Matrix<T, N, 1>;
12 
13 template <class T>
14 using Vector2 = Vector<T, 2>;
15 
16 template <class T>
17 using Vector3 = Vector<T, 3>;
18 
19 template <class T>
20 using Vector4 = Vector<T, 4>;
21 
22 template <class T, int N>
23 using RowVector = Matrix<T, 1, N>;
24 
25 template <class T>
26 using RowVector2 = RowVector<T, 2>;
27 
28 template <class T>
29 using RowVector3 = RowVector<T, 3>;
30 
31 template <class T>
32 using RowVector4 = RowVector<T, 4>;
33 
34 // In Eigen, the type you should be using for transformation matrices is the
35 // `Transform` class, instead of a raw `Matrix`.
36 // The `Projective` option means this will not make any assumptions about the
37 // last row of the object, making this suitable for use as general OpenGL
38 // projection matrices (which is the most common use-case). The one caveat
39 // is that in order to apply this transformation to non-homogeneous vectors
40 // (e.g., vec3), you must use the `.linear()` method to get the affine part of
41 // the matrix.
42 //
43 // Example:
44 //   mat4 transform;
45 //   vec3 position;
46 //   vec3 transformed = transform.linear() * position;
47 //
48 // Note, the use of N-1 is because the parameter passed to Eigen is the ambient
49 // dimension of the transformation, not the size of the matrix iself.
50 // However graphics programmers sometimes get upset when they see a 3 next
51 // to a matrix when they expect a 4, so I'm hoping this will avoid that.
52 template <class T, int N>
53 using AffineMatrix = Transform<T, N-1, Projective>;
54 
55 }  // namespace Eigen
56 
57 #endif  // ANDROID_DVR_EIGEN_H_
58