// 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; Normalize(); }; template DirectionOf::DirectionOf(Vector3 v) { this->horizontal = atan2f(v.Right(), v.Forward()) * Passer::LinearAlgebra::Rad2Deg; this->vertical = 90 - acosf(v.Up()) * Passer::LinearAlgebra::Rad2Deg; Normalize(); } 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::Degrees(float horizontal, float vertical) { return DirectionOf(AngleOf::Degrees(horizontal), AngleOf::Degrees(vertical)); } template DirectionOf Passer::LinearAlgebra::DirectionOf::Radians(float horizontal, float vertical) { return DirectionOf(AngleOf::Radians(horizontal), AngleOf::Radians(vertical)); } template bool Passer::LinearAlgebra::DirectionOf::operator==( const DirectionOf d) const { return (this->horizontal == d.horizontal) && (this->vertical == d.vertical); } template DirectionOf Passer::LinearAlgebra::DirectionOf::operator-() const { DirectionOf r = DirectionOf(this->horizontal + AngleOf::Degrees(180), -this->vertical); return r; } template Vector3 DirectionOf::ToVector3() { Vector3 v = Quaternion::Euler(-(this->vertical.InDegrees()), this->horizontal.InDegrees(), 0) * Vector3::forward; return v; } template void DirectionOf::Normalize() { if (this->vertical > AngleOf::Degrees(90) || this->vertical < AngleOf::Degrees(-90)) { this->horizontal += AngleOf::Degrees(180); this->vertical = AngleOf::Degrees(180) - this->vertical; } } template class DirectionOf; template class DirectionOf;