// This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0.If a copy of the MPL was not distributed with this // file, You can obtain one at https ://mozilla.org/MPL/2.0/. #include "SwingTwist.h" template SwingTwistOf::SwingTwistOf() { // this->horizontal = AngleOf(0); // this->vertical = AngleOf(0); this->swing = DirectionOf(0, 0); this->twist = AngleOf(0); } template Passer::LinearAlgebra::SwingTwistOf::SwingTwistOf(DirectionOf swing, AngleOf twist) { this->swing = swing; this->twist = twist; } template SwingTwistOf::SwingTwistOf(AngleOf horizontal, AngleOf vertical, AngleOf twist) { // this->horizontal = horizontal; // this->vertical = vertical; this->swing = DirectionOf(horizontal, vertical); this->twist = twist; } template SwingTwistOf SwingTwistOf::Degrees(float horizontal, float vertical, float twist) { DirectionOf swing = DirectionOf(AngleOf::Degrees(horizontal), AngleOf::Degrees(vertical)); AngleOf twistAngle = AngleOf::Degrees(twist); SwingTwistOf orientation = SwingTwistOf(swing, twistAngle); return orientation; } template Quaternion SwingTwistOf::ToQuaternion() { Quaternion q = Quaternion::Euler(this->swing.vertical.ToFloat(), this->swing.horizontal.ToFloat(), this->twist.ToFloat()); return q; } template SwingTwistOf Passer::LinearAlgebra::SwingTwistOf::FromQuaternion( Quaternion q) { Vector3 angles = Quaternion::ToAngles(q); SwingTwistOf r = SwingTwistOf(angles.Up(), angles.Right(), angles.Forward()); return r; } template const SwingTwistOf SwingTwistOf::identity = SwingTwistOf(); template SphericalOf SwingTwistOf::operator*(const SphericalOf& vector) const { SphericalOf v = SphericalOf(vector.distance, vector.horizontal + this->swing.horizontal, vector.vertical + this->swing.vertical); return v; } template SwingTwistOf SwingTwistOf::operator*( const SwingTwistOf& rotation) const { SwingTwistOf r = SwingTwistOf(this->swing.horizontal + rotation.swing.horizontal, this->swing.vertical + rotation.swing.vertical, this->twist + rotation.twist); return r; } template SwingTwistOf SwingTwistOf::operator*=(const SwingTwistOf& rotation) { // this->swing.horizontal += rotation.swing.horizontal; // this->swing.vertical += rotation.swing.vertical; this->swing += rotation.swing; this->twist += rotation.twist; return *this; } template SwingTwistOf Passer::LinearAlgebra::SwingTwistOf::Inverse( SwingTwistOf rotation) { SwingTwistOf r = SwingTwistOf(-rotation.swing, -rotation.twist); return r; } template SwingTwistOf Passer::LinearAlgebra::SwingTwistOf::AngleAxis( float angle, const SphericalOf& axis) { Vector3 axis_vector = axis.ToVector3(); Quaternion q = Quaternion::AngleAxis(angle, axis_vector); SwingTwistOf r = SwingTwistOf::FromQuaternion(q); return r; } template class SwingTwistOf; template class SwingTwistOf;