#pragma once #include "schema_math.hpp" #include namespace saw { template class data,encode::Native> { public: using Schema = schema::Quaternion; private: data,encode::Native> vals_; using NativeType = typename native_data_type::type; public: data() = default; data(data i__, data j__, data k__, data w__): vals_{i__,j__,k__,w__} {} constexpr void normalize() { data norm{}; for(data i = 0u; i < vals_.size(); ++i){ norm += vals_.at(i) * vals_.at(i); } norm.set(std::sqrt(norm.get())); for(data i = 0u; i < vals_.size(); ++i){ vals_.at(i) = vals_.at(i) / norm; } } constexpr data& at(data i){ return vals_.at(i); } constexpr const data& at(data i) const { return vals_.at(i); } constexpr data operator*(const data& rhs) const { data mult; data i_i{0u}; data j_i{1u}; data k_i{2u}; data w_i{3u}; mult.at(i_i) = at(w_i) * rhs.at(i_i) + at(i_i) * rhs.at(w_i) + at(j_i) * rhs.at(k_i) - at(k_i) * rhs.at(j_i); mult.at(j_i) = at(w_i) * rhs.at(j_i) + at(j_i) * rhs.at(w_i) - at(i_i) * rhs.at(k_i) + at(k_i) * rhs.at(i_i); mult.at(k_i) = at(w_i) * rhs.at(k_i) + at(k_i) * rhs.at(w_i) + at(i_i) * rhs.at(j_i) - at(j_i) * rhs.at(i_i); mult.at(w_i) = at(w_i) * rhs.at(w_i) - at(i_i) * rhs.at(i_i) - at(j_i) * rhs.at(j_i) - at(k_i) * rhs.at(k_i); return mult; } }; }