blob: 2c5a75b286b53153b51dc2151560c71437d01c09 [file] [log] [blame]
// 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 <sstream>
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