# 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 [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 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:

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

```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);
```
Parameters:
[in] pos object coordinates
[in] m MVP matrix
[in] vp viewport as [x, y, width, height]
[out] dest projected coordinates
float glm_project_z(vec3 pos, mat4 m)
map object’s z coordinate to window coordinates

this is same as `glm_project()` except this function projects only Z coordinate which reduces a few calculations and parameters.

Computing MVP:

```glm_mat4_mul(proj, view, viewProj);
glm_mat4_mul(viewProj, model, MVP);
```
Parameters:
[in] pos object coordinates
[in] m MVP matrix
Returns:

projected z coordinate