Clutter Engine 0.0.1
Loading...
Searching...
No Matches
matrix_projection.inl
1namespace glm
2{
3 template<typename T, typename U, qualifier Q>
4 GLM_FUNC_QUALIFIER vec<3, T, Q> projectZO(vec<3, T, Q> const& obj, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport)
5 {
6 vec<4, T, Q> tmp = vec<4, T, Q>(obj, static_cast<T>(1));
7 tmp = model * tmp;
8 tmp = proj * tmp;
9
10 tmp /= tmp.w;
11 tmp.x = tmp.x * static_cast<T>(0.5) + static_cast<T>(0.5);
12 tmp.y = tmp.y * static_cast<T>(0.5) + static_cast<T>(0.5);
13
14 tmp[0] = tmp[0] * T(viewport[2]) + T(viewport[0]);
15 tmp[1] = tmp[1] * T(viewport[3]) + T(viewport[1]);
16
17 return vec<3, T, Q>(tmp);
18 }
19
20 template<typename T, typename U, qualifier Q>
21 GLM_FUNC_QUALIFIER vec<3, T, Q> projectNO(vec<3, T, Q> const& obj, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport)
22 {
23 vec<4, T, Q> tmp = vec<4, T, Q>(obj, static_cast<T>(1));
24 tmp = model * tmp;
25 tmp = proj * tmp;
26
27 tmp /= tmp.w;
28 tmp = tmp * static_cast<T>(0.5) + static_cast<T>(0.5);
29 tmp[0] = tmp[0] * T(viewport[2]) + T(viewport[0]);
30 tmp[1] = tmp[1] * T(viewport[3]) + T(viewport[1]);
31
32 return vec<3, T, Q>(tmp);
33 }
34
35 template<typename T, typename U, qualifier Q>
36 GLM_FUNC_QUALIFIER vec<3, T, Q> project(vec<3, T, Q> const& obj, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport)
37 {
38 if(GLM_CONFIG_CLIP_CONTROL & GLM_CLIP_CONTROL_ZO_BIT)
39 return projectZO(obj, model, proj, viewport);
40 else
41 return projectNO(obj, model, proj, viewport);
42 }
43
44 template<typename T, typename U, qualifier Q>
45 GLM_FUNC_QUALIFIER vec<3, T, Q> unProjectZO(vec<3, T, Q> const& win, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport)
46 {
47 mat<4, 4, T, Q> Inverse = inverse(proj * model);
48
49 vec<4, T, Q> tmp = vec<4, T, Q>(win, T(1));
50 tmp.x = (tmp.x - T(viewport[0])) / T(viewport[2]);
51 tmp.y = (tmp.y - T(viewport[1])) / T(viewport[3]);
52 tmp.x = tmp.x * static_cast<T>(2) - static_cast<T>(1);
53 tmp.y = tmp.y * static_cast<T>(2) - static_cast<T>(1);
54
55 vec<4, T, Q> obj = Inverse * tmp;
56 obj /= obj.w;
57
58 return vec<3, T, Q>(obj);
59 }
60
61 template<typename T, typename U, qualifier Q>
62 GLM_FUNC_QUALIFIER vec<3, T, Q> unProjectNO(vec<3, T, Q> const& win, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport)
63 {
64 mat<4, 4, T, Q> Inverse = inverse(proj * model);
65
66 vec<4, T, Q> tmp = vec<4, T, Q>(win, T(1));
67 tmp.x = (tmp.x - T(viewport[0])) / T(viewport[2]);
68 tmp.y = (tmp.y - T(viewport[1])) / T(viewport[3]);
69 tmp = tmp * static_cast<T>(2) - static_cast<T>(1);
70
71 vec<4, T, Q> obj = Inverse * tmp;
72 obj /= obj.w;
73
74 return vec<3, T, Q>(obj);
75 }
76
77 template<typename T, typename U, qualifier Q>
78 GLM_FUNC_QUALIFIER vec<3, T, Q> unProject(vec<3, T, Q> const& win, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport)
79 {
80 if(GLM_CONFIG_CLIP_CONTROL & GLM_CLIP_CONTROL_ZO_BIT)
81 return unProjectZO(win, model, proj, viewport);
82 else
83 return unProjectNO(win, model, proj, viewport);
84 }
85
86 template<typename T, qualifier Q, typename U>
87 GLM_FUNC_QUALIFIER mat<4, 4, T, Q> pickMatrix(vec<2, T, Q> const& center, vec<2, T, Q> const& delta, vec<4, U, Q> const& viewport)
88 {
89 assert(delta.x > static_cast<T>(0) && delta.y > static_cast<T>(0));
90 mat<4, 4, T, Q> Result(static_cast<T>(1));
91
92 if(!(delta.x > static_cast<T>(0) && delta.y > static_cast<T>(0)))
93 return Result; // Error
94
95 vec<3, T, Q> Temp(
96 (static_cast<T>(viewport[2]) - static_cast<T>(2) * (center.x - static_cast<T>(viewport[0]))) / delta.x,
97 (static_cast<T>(viewport[3]) - static_cast<T>(2) * (center.y - static_cast<T>(viewport[1]))) / delta.y,
98 static_cast<T>(0));
99
100 // Translate and scale the picked region to the entire window
101 Result = translate(Result, Temp);
102 return scale(Result, vec<3, T, Q>(static_cast<T>(viewport[2]) / delta.x, static_cast<T>(viewport[3]) / delta.y, static_cast<T>(1)));
103 }
104}//namespace glm
GLM_FUNC_QUALIFIER mat< C, R, T, Q > inverse(mat< C, R, T, Q > const &m)
Definition func_matrix.inl:388
GLM_FUNC_DECL mat< 4, 4, T, Q > pickMatrix(vec< 2, T, Q > const &center, vec< 2, T, Q > const &delta, vec< 4, U, Q > const &viewport)
Definition matrix_projection.inl:87
GLM_FUNC_DECL vec< 3, T, Q > project(vec< 3, T, Q > const &obj, mat< 4, 4, T, Q > const &model, mat< 4, 4, T, Q > const &proj, vec< 4, U, Q > const &viewport)
Definition matrix_projection.inl:36
GLM_FUNC_DECL vec< 3, T, Q > unProjectNO(vec< 3, T, Q > const &win, mat< 4, 4, T, Q > const &model, mat< 4, 4, T, Q > const &proj, vec< 4, U, Q > const &viewport)
Definition matrix_projection.inl:62
GLM_FUNC_DECL vec< 3, T, Q > projectNO(vec< 3, T, Q > const &obj, mat< 4, 4, T, Q > const &model, mat< 4, 4, T, Q > const &proj, vec< 4, U, Q > const &viewport)
Definition matrix_projection.inl:21
GLM_FUNC_DECL vec< 3, T, Q > unProjectZO(vec< 3, T, Q > const &win, mat< 4, 4, T, Q > const &model, mat< 4, 4, T, Q > const &proj, vec< 4, U, Q > const &viewport)
Definition matrix_projection.inl:45
GLM_FUNC_DECL vec< 3, T, Q > unProject(vec< 3, T, Q > const &win, mat< 4, 4, T, Q > const &model, mat< 4, 4, T, Q > const &proj, vec< 4, U, Q > const &viewport)
Definition matrix_projection.inl:78
GLM_FUNC_DECL vec< 3, T, Q > projectZO(vec< 3, T, Q > const &obj, mat< 4, 4, T, Q > const &model, mat< 4, 4, T, Q > const &proj, vec< 4, U, Q > const &viewport)
Definition matrix_projection.inl:4
GLM_FUNC_DECL mat< 4, 4, T, Q > translate(mat< 4, 4, T, Q > const &m, vec< 3, T, Q > const &v)
Definition matrix_transform.inl:10
GLM_FUNC_DECL mat< 4, 4, T, Q > scale(mat< 4, 4, T, Q > const &m, vec< 3, T, Q > const &v)
Definition matrix_transform.inl:78
GLM_FUNC_DECL genType proj(genType const &x, genType const &Normal)
Definition projection.inl:6
Core features
Definition common.hpp:21
Definition qualifier.hpp:36
Definition qualifier.hpp:35