// 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 "Direction.h" #include "Quaternion.h" #include "Vector3.h" #include template DirectionOf::DirectionOf() { this->horizontal = AngleOf(0.0f); this->vertical = AngleOf(0.0f); } template DirectionOf::DirectionOf(AngleOf horizontal, AngleOf vertical) { this->horizontal = horizontal; this->vertical = vertical; }; template DirectionOf::DirectionOf(Vector3 v) { this->horizontal = atan2f(v.Right(), v.Forward()) * Passer::LinearAlgebra::Rad2Deg; this->vertical = 90 - acosf(v.Up()) * Passer::LinearAlgebra::Rad2Deg; } template const DirectionOf DirectionOf::forward = DirectionOf(0.0f, 0.0f); template const DirectionOf DirectionOf::back = DirectionOf(180.0f, 0.0f); template const DirectionOf DirectionOf::up = DirectionOf(0.0f, 90.0f); template const DirectionOf DirectionOf::down = DirectionOf(0.0f, -90.0f); template const DirectionOf DirectionOf::left = DirectionOf(-90.0f, 0.0f); template const DirectionOf DirectionOf::right = DirectionOf(90.0f, 0.0f); template DirectionOf Passer::LinearAlgebra::DirectionOf::operator-() const { DirectionOf r = DirectionOf(-this->horizontal, -this->vertical); return r; } template DirectionOf Passer::LinearAlgebra::DirectionOf::operator+( const DirectionOf& v) const { DirectionOf r = DirectionOf(this->horizontal + v.horizontal, this->vertical + v.vertical); return r; } template DirectionOf Passer::LinearAlgebra::DirectionOf::operator+=( const DirectionOf& v) { this->horizontal += v.horizontal; this->vertical += v.vertical; return *this; } template Vector3 DirectionOf::ToVector3() { Vector3 v = Quaternion::Euler(-(this->vertical.InDegrees()), this->horizontal.InDegrees(), 0) * Vector3::forward; return v; } template class DirectionOf; template class DirectionOf;