# 3D Affine Transforms (common)

Common transform functions.

## Table of contents (click to go):

Functions:

1. `glm_translate_make()`

2. `glm_scale_to()`

3. `glm_scale_make()`

4. `glm_scale()`

5. `glm_scale_uni()`

6. `glm_rotate_make()`

7. `glm_rotate_atm()`

8. `glm_decompose_scalev()`

9. `glm_uniscaled()`

10. `glm_decompose_rs()`

11. `glm_decompose()`

## Functions documentation

void glm_translate_make(mat4 m, vec3 v)

  creates NEW translate transform matrix by v vector.

  Parameters:
    [in, out] m affine transform
    [in] v translate vector [x, y, z]

void glm_scale_to(mat4 m, vec3 v, mat4 dest)

  scale existing transform matrix by v vector and store result in dest

  Parameters:
    [in] m affine transform
    [in] v scale vector [x, y, z]
    [out] dest scaled matrix

void glm_scale_make(mat4 m, vec3 v)

  creates NEW scale matrix by v vector

  Parameters:
    [out] m affine transform
    [in] v scale vector [x, y, z]

void glm_scale(mat4 m, vec3 v)

  scales existing transform matrix by v vector and stores result in same matrix

  Parameters:
    [in, out] m affine transform
    [in] v scale vector [x, y, z]

void glm_scale_uni(mat4 m, float s)

  applies uniform scale to existing transform matrix v = [s, s, s] and stores result in same matrix

  Parameters:
    [in, out] m affine transform
    [in] v scale factor

void glm_rotate_make(mat4 m, float angle, vec3 axis)

  creates NEW rotation matrix by angle and axis, axis will be normalized so you don’t need to normalize it

  Parameters:
    [out] m affine transform
    [in] axis angle (radians)
    [in] axis axis

void glm_rotate_atm(mat4 m, vec3 pivot, float angle, vec3 axis)
  creates NEW rotation matrix by angle and axis at given point
  this creates rotation matrix, it assumes you don’t have a matrix
  this should work faster than glm_rotate_at because it reduces one glm_translate.
  Parameters:
    [in, out] m affine transform
    [in] pivot pivot, anchor point, rotation center
    [in] angle angle (radians)
    [in] axis axis

void glm_decompose_scalev(mat4 m, vec3 s)

  decompose scale vector

  Parameters:
    [in] m affine transform
    [out] s scale vector (Sx, Sy, Sz)

bool glm_uniscaled(mat4 m)

  returns true if matrix is uniform scaled. This is helpful for creating normal matrix.

  Parameters:
    [in] m matrix

void glm_decompose_rs(mat4 m, mat4 r, vec3 s)

  decompose rotation matrix (mat4) and scale vector [Sx, Sy, Sz] DON’T pass projected matrix here

  Parameters:
    [in] m affine transform
    [out] r rotation matrix
    [out] s scale matrix

void glm_decompose(mat4 m, vec4 t, mat4 r, vec3 s)

  decompose affine transform, TODO: extract shear factors. DON’T pass projected matrix here

  Parameters:
    [in] m affine transform
    [out] t translation vector
    [out] r rotation matrix (mat4)
    [out] s scaling vector [X, Y, Z]