project.h 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. /*
  2. * Copyright (c), Recep Aslantas.
  3. *
  4. * MIT License (MIT), http://opensource.org/licenses/MIT
  5. * Full license can be found in the LICENSE file
  6. */
  7. #ifndef cglms_projects_h
  8. #define cglms_projects_h
  9. #include "../common.h"
  10. #include "../types-struct.h"
  11. #include "../project.h"
  12. #include "vec3.h"
  13. #include "vec4.h"
  14. #include "mat4.h"
  15. #ifndef CGLM_CLIPSPACE_INCLUDE_ALL
  16. # if CGLM_CONFIG_CLIP_CONTROL & CGLM_CLIP_CONTROL_ZO_BIT
  17. # include "clipspace/project_zo.h"
  18. # elif CGLM_CONFIG_CLIP_CONTROL & CGLM_CLIP_CONTROL_NO_BIT
  19. # include "clipspace/project_no.h"
  20. # endif
  21. #else
  22. # include "clipspace/project_zo.h"
  23. # include "clipspace/project_no.h"
  24. #endif
  25. /*!
  26. * @brief maps the specified viewport coordinates into specified space [1]
  27. * the matrix should contain projection matrix.
  28. *
  29. * if you don't have ( and don't want to have ) an inverse matrix then use
  30. * glm_unproject version. You may use existing inverse of matrix in somewhere
  31. * else, this is why glm_unprojecti exists to save save inversion cost
  32. *
  33. * [1] space:
  34. * 1- if m = invProj: View Space
  35. * 2- if m = invViewProj: World Space
  36. * 3- if m = invMVP: Object Space
  37. *
  38. * You probably want to map the coordinates into object space
  39. * so use invMVP as m
  40. *
  41. * Computing viewProj:
  42. * glm_mat4_mul(proj, view, viewProj);
  43. * glm_mat4_mul(viewProj, model, MVP);
  44. * glm_mat4_inv(viewProj, invMVP);
  45. *
  46. * @param[in] pos point/position in viewport coordinates
  47. * @param[in] invMat matrix (see brief)
  48. * @param[in] vp viewport as [x, y, width, height]
  49. * @returns unprojected coordinates
  50. */
  51. CGLM_INLINE
  52. vec3s
  53. glms_unprojecti(vec3s pos, mat4s invMat, vec4s vp) {
  54. vec3s r;
  55. glm_unprojecti(pos.raw, invMat.raw, vp.raw, r.raw);
  56. return r;
  57. }
  58. /*!
  59. * @brief maps the specified viewport coordinates into specified space [1]
  60. * the matrix should contain projection matrix.
  61. *
  62. * this is same as glm_unprojecti except this function get inverse matrix for
  63. * you.
  64. *
  65. * [1] space:
  66. * 1- if m = proj: View Space
  67. * 2- if m = viewProj: World Space
  68. * 3- if m = MVP: Object Space
  69. *
  70. * You probably want to map the coordinates into object space
  71. * so use MVP as m
  72. *
  73. * Computing viewProj and MVP:
  74. * glm_mat4_mul(proj, view, viewProj);
  75. * glm_mat4_mul(viewProj, model, MVP);
  76. *
  77. * or in struct api:
  78. * MVP = mat4_mul(mat4_mul(proj, view), model)
  79. *
  80. * @param[in] pos point/position in viewport coordinates
  81. * @param[in] m matrix (see brief)
  82. * @param[in] vp viewport as [x, y, width, height]
  83. * @returns unprojected coordinates
  84. */
  85. CGLM_INLINE
  86. vec3s
  87. glms_unproject(vec3s pos, mat4s m, vec4s vp) {
  88. vec3s r;
  89. glm_unproject(pos.raw, m.raw, vp.raw, r.raw);
  90. return r;
  91. }
  92. /*!
  93. * @brief map object coordinates to window coordinates
  94. *
  95. * Computing MVP:
  96. * glm_mat4_mul(proj, view, viewProj);
  97. * glm_mat4_mul(viewProj, model, MVP);
  98. *
  99. * or in struct api:
  100. * MVP = mat4_mul(mat4_mul(proj, view), model)
  101. *
  102. * @param[in] pos object coordinates
  103. * @param[in] m MVP matrix
  104. * @param[in] vp viewport as [x, y, width, height]
  105. * @returns projected coordinates
  106. */
  107. CGLM_INLINE
  108. vec3s
  109. glms_project(vec3s pos, mat4s m, vec4s vp) {
  110. vec3s r;
  111. glm_project(pos.raw, m.raw, vp.raw, r.raw);
  112. return r;
  113. }
  114. /*!
  115. * @brief map object's z coordinate to window coordinates
  116. *
  117. * Computing MVP:
  118. * glm_mat4_mul(proj, view, viewProj);
  119. * glm_mat4_mul(viewProj, model, MVP);
  120. *
  121. * or in struct api:
  122. * MVP = mat4_mul(mat4_mul(proj, view), model)
  123. *
  124. * @param[in] v object coordinates
  125. * @param[in] m MVP matrix
  126. *
  127. * @returns projected z coordinate
  128. */
  129. CGLM_INLINE
  130. float
  131. glms_project_z(vec3s v, mat4s m) {
  132. #if CGLM_CONFIG_CLIP_CONTROL & CGLM_CLIP_CONTROL_ZO_BIT
  133. return glms_project_z_zo(v, m);
  134. #elif CGLM_CONFIG_CLIP_CONTROL & CGLM_CLIP_CONTROL_NO_BIT
  135. return glms_project_z_no(v, m);
  136. #endif
  137. }
  138. /*!
  139. * @brief define a picking region
  140. *
  141. * @param[in] center center [x, y] of a picking region in window coordinates
  142. * @param[in] size size [width, height] of the picking region in window coordinates
  143. * @param[in] vp viewport as [x, y, width, height]
  144. * @returns projected coordinates
  145. */
  146. CGLM_INLINE
  147. mat4s
  148. glms_pickmatrix(vec2s center, vec2s size, vec4s vp) {
  149. mat4s res;
  150. glm_pickmatrix(center.raw, size.raw, vp.raw, res.raw);
  151. return res;
  152. }
  153. #endif /* cglms_projects_h */