summaryrefslogtreecommitdiff
path: root/src/util/vector.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/util/vector.h')
-rw-r--r--src/util/vector.h39
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;
+ }
+}