summaryrefslogtreecommitdiff
path: root/libs/cglm/docs/source/project.rst
blob: b31a86a8a339724c47069ba922de57d76af31a92 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
.. default-domain:: C

Project / UnProject
================================================================================

Header: cglm/project.h

Viewport is required as *vec4* **[X, Y, Width, Height]** but this doesn't mean
that you should store it as **vec4**. You can convert your data representation
to vec4 before passing it to related functions.

Table of contents (click to go):
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Functions:

1. :c:func:`glm_unprojecti`
#. :c:func:`glm_unproject`
#. :c:func:`glm_project`

Functions documentation
~~~~~~~~~~~~~~~~~~~~~~~

.. c:function:: void  glm_unprojecti(vec3 pos, mat4 invMat, vec4 vp, vec3 dest)

    | maps the specified viewport coordinates into specified space [1]
      the matrix should contain projection matrix.

    if you don't have ( and don't want to have ) an inverse matrix then use
    glm_unproject version. You may use existing inverse of matrix in somewhere
    else, this is why glm_unprojecti exists to save save inversion cost

    [1] space:
      - if m = invProj:     View Space
      - if m = invViewProj: World Space
      - if m = invMVP:      Object Space

    You probably want to map the coordinates into object space
    so use invMVP as m

    Computing viewProj:

    .. code-block:: c

       glm_mat4_mul(proj, view, viewProj);
       glm_mat4_mul(viewProj, model, MVP);
       glm_mat4_inv(viewProj, invMVP);

    Parameters:
      | *[in]*  **pos**     point/position in viewport coordinates
      | *[in]*  **invMat**  matrix (see brief)
      | *[in]*  **vp**      viewport as [x, y, width, height]
      | *[out]* **dest**    unprojected coordinates

.. c:function:: void  glm_unproject(vec3 pos, mat4 m, vec4 vp, vec3 dest)

    | maps the specified viewport coordinates into specified space [1]
      the matrix should contain projection matrix.

    this is same as glm_unprojecti except this function get inverse matrix for
    you.

    [1] space:
      - if m = proj:     View Space
      - if m = viewProj: World Space
      - if m = MVP:      Object Space

    You probably want to map the coordinates into object space so use MVP as m

    Computing viewProj and MVP:

    .. code-block:: c

       glm_mat4_mul(proj, view, viewProj);
       glm_mat4_mul(viewProj, model, MVP);

    Parameters:
      | *[in]*  **pos**  point/position in viewport coordinates
      | *[in]*  **m**    matrix (see brief)
      | *[in]*  **vp**   viewport as [x, y, width, height]
      | *[out]* **dest** unprojected coordinates

.. c:function:: void  glm_project(vec3 pos, mat4 m, vec4 vp, vec3 dest)

    | map object coordinates to window coordinates

    Computing MVP:

    .. code-block:: c

       glm_mat4_mul(proj, view, viewProj);
       glm_mat4_mul(viewProj, model, MVP);

    this could be useful for gettng a bbox which fits with view frustum and
    object bounding boxes. In this case you crop view frustum box with objects
    box

    Parameters:
      | *[in]*  **pos**      object coordinates
      | *[in]*  **m**        MVP matrix
      | *[in]*  **vp**       viewport as [x, y, width, height]
      | *[out]* **dest**     projected coordinates