Bug 1500820 - Compare absolute dot-product to 1.0 when interpolating quaternions; r=hiro

See the extended commit message for the following spec change:

  6b36d41ebc

Basically, by failing to take the absolute value, for certain content we can end
up doing division by zero which will mean that the test included in this patch
will cause an assertion to fail in debug builds and return
"matrix(NaN, NaN....)" in release builds.

Differential Revision: https://phabricator.services.mozilla.com/D9618

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Brian Birtles 2018-10-24 07:06:43 +00:00
parent d9acf21231
commit 99201827d6
2 changed files with 37 additions and 1 deletions

View File

@ -1829,7 +1829,7 @@ impl Animate for Quaternion {
self.3 * other.3)
.min(1.0).max(-1.0);
if dot == 1.0 {
if dot.abs() == 1.0 {
return Ok(*self);
}

View File

@ -0,0 +1,36 @@
<!doctype html>
<meta charset="utf-8">
<title>Matrix interpolation</title>
<link rel="help" href="https://drafts.csswg.org/css-transforms-2/#interpolation-of-3d-matrices">
<meta name="assert" content="When interpolating between two matrices, each matrix is decomposed into the corresponding translation, rotation, scale, skew and (for a 3D matrix) perspective values">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/interpolation-testcommon.js"></script>
<body>
<script>
// Test interpolation of quaternions when the dot product is -1.
//
// We need to be particularly careful not to use a rotate function with a zero
// angle since the handling of zero angle rotations may change in future as per:
//
// https://github.com/w3c/csswg-drafts/issues/3236
//
// For rotateY(360deg) we should get a quaternion of:
// [ 0, sin(2 * PI / 2), 0, cos(2 * PI / 2) ]
// = [ 0, 0, 0, -1 ]
//
// For rotateX(720deg) we should get a quaternion of:
// [ 0, 0, sin(4 * PI / 2), cos(4 * PI / 2) ]
// = [ 0, 0, 0, 1 ]
//
// Dot product = 0 * 0 + 0 * 0 + 0 * 0 + 1 * -1 = -1
test_interpolation(
{
property: 'transform',
from: 'rotateY(360deg)',
to: 'rotateX(720deg)',
},
[{ at: 0.5, expect: 'matrix(1, 0, 0, 1, 0, 0)' }]
);
</script>
</body>