# Project / UnProject¶

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.

Functions:

## Functions documentation¶

void `glm_unprojecti`(vec3 pos, mat4 invMat, vec4 vp, vec3 dest)
maps the specified viewport coordinates into specified space  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

 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:

```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
void `glm_unproject`(vec3 pos, mat4 m, vec4 vp, vec3 dest)
maps the specified viewport coordinates into specified space  the matrix should contain projection matrix.

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

 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:

```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
void `glm_project`(vec3 pos, mat4 m, vec4 vp, vec3 dest)
map object coordinates to window coordinates

Computing MVP:

```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