/* * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * Copyright 2011-2016 Danny Robson */ #ifndef __UTIL_QUATERNION_HPP #define __UTIL_QUATERNION_HPP #include "coord.hpp" #include "vector.hpp" #include "matrix.hpp" #include namespace util { // quaternion's are _just_ different enough to other coord types that we // special case as a distinct POD type and provide many of the same // functions as distinct declarations. // // issues include: // * strictly 4 dimensions // * scalar operations sometimes don't make sense on the w component // * objects must be normalised to make sense template struct quaternion { T w, x, y, z; static quaternion angle_axis (T radians, vector<3,T> axis); static quaternion from_euler (vector<3,T>); static quaternion from_to (vector<3,T>, vector<3,T>); static quaternion look (vector<3,T> fwd, vector<3,T> up); matrix4 as_matrix (void) const; static constexpr quaternion identity (void); }; /////////////////////////////////////////////////////////////////////////// template vector3 rotate (vector3, quaternion); /////////////////////////////////////////////////////////////////////////// template constexpr T norm2 (quaternion); template constexpr T norm (quaternion); template constexpr bool is_normalised (quaternion); template constexpr quaternion normalised (quaternion); /////////////////////////////////////////////////////////////////////////// template quaternion conjugate (quaternion); /////////////////////////////////////////////////////////////////////////// template quaternion operator* (quaternion, quaternion); //------------------------------------------------------------------------- template quaternion& operator*= (quaternion&, quaternion); //------------------------------------------------------------------------- template quaternion operator/ (quaternion, quaternion); //------------------------------------------------------------------------- template constexpr quaternion operator/ (quaternion, T); /////////////////////////////////////////////////////////////////////////// template constexpr bool operator== (quaternion, quaternion); //------------------------------------------------------------------------- template bool almost_equal (quaternion, quaternion); /////////////////////////////////////////////////////////////////////////// typedef quaternion quaternionf; typedef quaternion quaterniond; /////////////////////////////////////////////////////////////////////////// template std::ostream& operator<< (std::ostream&, quaternion); } #include "./quaternion.ipp" #endif