diff options
Diffstat (limited to 'src/util/vector.h')
| -rw-r--r-- | src/util/vector.h | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/src/util/vector.h b/src/util/vector.h index 33f6551..314131c 100644 --- a/src/util/vector.h +++ b/src/util/vector.h @@ -190,3 +190,42 @@ inline F32 vec_angle( VEC2 v1, VEC2 v2 ) { VEC2 d = v2 - v1; return remainderf( atan2f( d.y, d.x ) * RADPI, 360.f ); } + +inline VEC3 angle_vectors( VEC3 angles ) { + F32 sp, sy, cp, cy; + sp = sinf( angles.x * PIRAD ); + cp = cosf( angles.x * PIRAD ); + sy = sinf( angles.y * PIRAD ); + cy = cosf( angles.y * PIRAD ); + + return VEC3{ cp * cy, cp * sy, -sp }; +} + +inline void angle_vectors( const VEC3& angles, VEC3* forward, VEC3* right, VEC3* up ) { + F32 sr, sp, sy, cr, cp, cy; + + sp = sinf( angles.x * PIRAD ); + cp = cosf( angles.x * PIRAD ); + sy = sinf( angles.y * PIRAD ); + cy = cosf( angles.y * PIRAD ); + sr = sinf( angles.z * PIRAD ); + cr = cosf( angles.z * PIRAD ); + + if ( forward ) { + forward->x = cp * cy; + forward->y = cp * sy; + forward->z = -sp; + } + + if ( right ) { + right->x = -1 * sr * sp * cy + -1 * cr * -sy; + right->y = -1 * sr * sp * sy + -1 * cr * cy; + right->z = -1 * sr * cp; + } + + if ( up ) { + up->x = cr * sp * cy + -sr * -sy; + up->y = cr * sp * sy + -sr * cy; + up->z = cr * cp; + } +} |
