| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247 |
- /*
- * Copyright (c), Recep Aslantas.
- *
- * MIT License (MIT), http://opensource.org/licenses/MIT
- * Full license can be found in the LICENSE file
- */
- #ifndef cglm_affine_post_h
- #define cglm_affine_post_h
- /*
- Functions:
- CGLM_INLINE void glm_translated_to(mat4 m, vec3 v, mat4 dest);
- CGLM_INLINE void glm_translated(mat4 m, vec3 v);
- CGLM_INLINE void glm_translated_x(mat4 m, float to);
- CGLM_INLINE void glm_translated_y(mat4 m, float to);
- CGLM_INLINE void glm_translated_z(mat4 m, float to);
- CGLM_INLINE void glm_rotated_x(mat4 m, float angle, mat4 dest);
- CGLM_INLINE void glm_rotated_y(mat4 m, float angle, mat4 dest);
- CGLM_INLINE void glm_rotated_z(mat4 m, float angle, mat4 dest);
- CGLM_INLINE void glm_rotated(mat4 m, float angle, vec3 axis);
- CGLM_INLINE void glm_rotated_at(mat4 m, vec3 pivot, float angle, vec3 axis);
- CGLM_INLINE void glm_spinned(mat4 m, float angle, vec3 axis);
- */
- #include "common.h"
- #include "util.h"
- #include "vec3.h"
- #include "vec4.h"
- #include "mat4.h"
- #include "affine-mat.h"
- /*!
- * @brief translate existing transform matrix by v vector
- * and stores result in same matrix
- *
- * this is POST transform, applies to existing transform as last transfrom
- *
- * @param[in, out] m affine transfrom
- * @param[in] v translate vector [x, y, z]
- */
- CGLM_INLINE
- void
- glm_translated(mat4 m, vec3 v) {
- glm_vec3_add(m[3], v, m[3]);
- }
- /*!
- * @brief translate existing transform matrix by v vector
- * and store result in dest
- *
- * source matrix will remain same
- *
- * this is POST transform, applies to existing transform as last transfrom
- *
- * @param[in] m affine transfrom
- * @param[in] v translate vector [x, y, z]
- * @param[out] dest translated matrix
- */
- CGLM_INLINE
- void
- glm_translated_to(mat4 m, vec3 v, mat4 dest) {
- glm_mat4_copy(m, dest);
- glm_translated(dest, v);
- }
- /*!
- * @brief translate existing transform matrix by x factor
- *
- * this is POST transform, applies to existing transform as last transfrom
- *
- * @param[in, out] m affine transfrom
- * @param[in] x x factor
- */
- CGLM_INLINE
- void
- glm_translated_x(mat4 m, float x) {
- m[3][0] += x;
- }
- /*!
- * @brief translate existing transform matrix by y factor
- *
- * this is POST transform, applies to existing transform as last transfrom
- *
- * @param[in, out] m affine transfrom
- * @param[in] y y factor
- */
- CGLM_INLINE
- void
- glm_translated_y(mat4 m, float y) {
- m[3][1] += y;
- }
- /*!
- * @brief translate existing transform matrix by z factor
- *
- * this is POST transform, applies to existing transform as last transfrom
- *
- * @param[in, out] m affine transfrom
- * @param[in] z z factor
- */
- CGLM_INLINE
- void
- glm_translated_z(mat4 m, float z) {
- m[3][2] += z;
- }
- /*!
- * @brief rotate existing transform matrix around X axis by angle
- * and store result in dest
- *
- * this is POST transform, applies to existing transform as last transfrom
- *
- * @param[in] m affine transfrom
- * @param[in] angle angle (radians)
- * @param[out] dest rotated matrix
- */
- CGLM_INLINE
- void
- glm_rotated_x(mat4 m, float angle, mat4 dest) {
- CGLM_ALIGN_MAT mat4 t = GLM_MAT4_IDENTITY_INIT;
- float c, s;
- c = cosf(angle);
- s = sinf(angle);
- t[1][1] = c;
- t[1][2] = s;
- t[2][1] = -s;
- t[2][2] = c;
- glm_mul_rot(t, m, dest);
- }
- /*!
- * @brief rotate existing transform matrix around Y axis by angle
- * and store result in dest
- *
- * this is POST transform, applies to existing transform as last transfrom
- *
- * @param[in] m affine transfrom
- * @param[in] angle angle (radians)
- * @param[out] dest rotated matrix
- */
- CGLM_INLINE
- void
- glm_rotated_y(mat4 m, float angle, mat4 dest) {
- CGLM_ALIGN_MAT mat4 t = GLM_MAT4_IDENTITY_INIT;
- float c, s;
- c = cosf(angle);
- s = sinf(angle);
- t[0][0] = c;
- t[0][2] = -s;
- t[2][0] = s;
- t[2][2] = c;
- glm_mul_rot(t, m, dest);
- }
- /*!
- * @brief rotate existing transform matrix around Z axis by angle
- * and store result in dest
- *
- * this is POST transform, applies to existing transform as last transfrom
- *
- * @param[in] m affine transfrom
- * @param[in] angle angle (radians)
- * @param[out] dest rotated matrix
- */
- CGLM_INLINE
- void
- glm_rotated_z(mat4 m, float angle, mat4 dest) {
- CGLM_ALIGN_MAT mat4 t = GLM_MAT4_IDENTITY_INIT;
- float c, s;
- c = cosf(angle);
- s = sinf(angle);
- t[0][0] = c;
- t[0][1] = s;
- t[1][0] = -s;
- t[1][1] = c;
- glm_mul_rot(t, m, dest);
- }
- /*!
- * @brief rotate existing transform matrix around given axis by angle
- *
- * this is POST transform, applies to existing transform as last transfrom
- *
- * @param[in, out] m affine transfrom
- * @param[in] angle angle (radians)
- * @param[in] axis axis
- */
- CGLM_INLINE
- void
- glm_rotated(mat4 m, float angle, vec3 axis) {
- CGLM_ALIGN_MAT mat4 rot;
- glm_rotate_make(rot, angle, axis);
- glm_mul_rot(rot, m, m);
- }
- /*!
- * @brief rotate existing transform
- * around given axis by angle at given pivot point (rotation center)
- *
- * this is POST transform, applies to existing transform as last transfrom
- *
- * @param[in, out] m affine transfrom
- * @param[in] pivot rotation center
- * @param[in] angle angle (radians)
- * @param[in] axis axis
- */
- CGLM_INLINE
- void
- glm_rotated_at(mat4 m, vec3 pivot, float angle, vec3 axis) {
- CGLM_ALIGN(8) vec3 pivotInv;
- glm_vec3_negate_to(pivot, pivotInv);
- glm_translated(m, pivot);
- glm_rotated(m, angle, axis);
- glm_translated(m, pivotInv);
- }
- /*!
- * @brief rotate existing transform matrix around given axis by angle around self (doesn't affected by position)
- *
- * this is POST transform, applies to existing transform as last transfrom
- *
- * @param[in, out] m affine transfrom
- * @param[in] angle angle (radians)
- * @param[in] axis axis
- */
- CGLM_INLINE
- void
- glm_spinned(mat4 m, float angle, vec3 axis) {
- CGLM_ALIGN_MAT mat4 rot;
- glm_rotate_atm(rot, m[3], angle, axis);
- glm_mat4_mul(rot, m, m);
- }
- #endif /* cglm_affine_post_h */
|