// Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "quaternion.h" #include namespace impeller { Quaternion Quaternion::Slerp(const Quaternion& to, double time) const { double cosine = Dot(to); if (fabs(cosine) < 1.0 - 1e-3 /* epsilon */) { /* * Spherical Interpolation. */ auto sine = sqrt(1.0 - cosine * cosine); auto angle = atan2(sine, cosine); auto sineInverse = 1.0 / sine; auto c0 = sin((1.0 - time) * angle) * sineInverse; auto c1 = sin(time * angle) * sineInverse; return *this * c0 + to * c1; } else { /* * Linear Interpolation. */ return (*this * (1.0 - time) + to * time).Normalize(); } } } // namespace impeller