// 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(); this->vertical = AngleOf(); } template DirectionOf::DirectionOf(AngleOf horizontal, AngleOf vertical) { this->horizontal = horizontal; this->vertical = vertical; Normalize(); }; // template // DirectionOf::DirectionOf(Vector3 v) { // this->horizontal = AngleOf::Atan2( // v.Right(), // v.Forward()); // AngleOf::Radians(atan2f(v.Right(), v.Forward())); // this->vertical = // -AngleOf::deg90 - // AngleOf::Acos( // v.Up()); // AngleOf::Radians(-(0.5f * pi) - acosf(v.Up())); // Normalize(); // } template const DirectionOf DirectionOf::forward = DirectionOf(AngleOf(), AngleOf()); template const DirectionOf DirectionOf::back = DirectionOf(AngleOf::deg180, AngleOf()); template const DirectionOf DirectionOf::up = DirectionOf(AngleOf(), AngleOf::deg90); template const DirectionOf DirectionOf::down = DirectionOf(AngleOf(), -AngleOf::deg90); template const DirectionOf DirectionOf::left = DirectionOf(-AngleOf::deg90, AngleOf()); template const DirectionOf DirectionOf::right = DirectionOf(AngleOf::deg90, AngleOf()); template Vector3 Passer::LinearAlgebra::DirectionOf::ToVector3() const { Quaternion q = Quaternion::Euler(-this->vertical.InDegrees(), this->horizontal.InDegrees(), 0); Vector3 v = q * Vector3::forward; return v; } template DirectionOf Passer::LinearAlgebra::DirectionOf::FromVector3(Vector3 v) { DirectionOf d; d.horizontal = AngleOf::Atan2( v.Right(), v.Forward()); // AngleOf::Radians(atan2f(v.Right(), v.Forward())); d.vertical = -AngleOf::deg90 - AngleOf::Acos( v.Up()); // AngleOf::Radians(-(0.5f * pi) - acosf(v.Up())); d.Normalize(); return d; } 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::deg180, -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::deg90 || this->vertical < -AngleOf::deg90) { this->horizontal += AngleOf::deg180; this->vertical = AngleOf::deg180 - this->vertical; } } template class DirectionOf; template class DirectionOf;