1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
|
<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/webxr_util.js"></script>
<script src="resources/webxr_test_constants.js"></script>
<script>
let testName = "XRRigidTransform constructor works";
let fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE;
let testFunction =
(session, fakeDeviceController, t) => new Promise((resolve, reject) => {
let coordDict = function(coords) {
let tempDict = {
x : coords[0],
y : coords[1],
z : coords[2]
}
if (coords.length >= 4) {
tempDict["w"] = coords[3];
}
return tempDict;
};
let createDOMPoint = function(coords) {
return DOMPoint.fromPoint(coordDict(coords));
};
let createDOMPointReadOnly = function(coords) {
return DOMPointReadOnly.fromPoint(coordDict(coords));
};
let quaternionLength = function(point) {
return Math.sqrt(
(point.x * point.x) +
(point.y * point.y) +
(point.z * point.z) +
(point.w * point.w));
};
let checkDOMPoint = function(point, x, y, z, w, desc) {
t.step(() => {
assert_approx_equals(point.x, x, FLOAT_EPSILON, `${desc}: x value`);
assert_approx_equals(point.y, y, FLOAT_EPSILON, `${desc}: y value`);
assert_approx_equals(point.z, z, FLOAT_EPSILON, `${desc}: z value`);
assert_approx_equals(point.w, w, FLOAT_EPSILON, `${desc}: w value`);
});
};
let checkTransform = function(transformObj, desc) {
t.step(() => {
assert_not_equals(transformObj, null, `${desc}: exists`);
assert_not_equals(transformObj.position, null, `${desc}: position exists`);
assert_not_equals(transformObj.orientation, null, `${desc}: orientation exists`);
assert_not_equals(transformObj.matrix, null, `${desc}: matrix exists`);
assert_equals(transformObj.matrix.length, 16, `${desc}: matrix of correct length`);
});
};
// test creating transform with specified position and orientation
// make sure that orientation was normalized to have length = 1.0
let transform = new XRRigidTransform(
createDOMPoint([1.0, 2.0, 3.0]),
createDOMPoint([1.1, 2.1, 3.1, 1.0]));
checkTransform(transform, "Arbitrary transform");
checkDOMPoint(transform.position, 1.0, 2.0, 3.0, 1.0, "Arbitrary transform position");
assert_approx_equals(quaternionLength(transform.orientation), 1.0, FLOAT_EPSILON,
"Arbitrary transform is normalized");
// test creating identity transform
let identity = new XRRigidTransform();
checkTransform(identity, "Identity transform");
checkDOMPoint(identity.position, 0.0, 0.0, 0.0, 1.0, "Identity transform position");
checkDOMPoint(identity.orientation, 0.0, 0.0, 0.0, 1.0, "Identity transform orientation");
// create transform with only position specified
transform = new XRRigidTransform(createDOMPoint([1.0, 2.0, 3.0]));
checkTransform(transform, "Position-only");
// create transform with only orientation specified
transform = new XRRigidTransform(undefined, createDOMPoint([1.1, 2.1, 3.1, 1.0]));
checkTransform(transform, "orientation-only");
// create transform with DOMPointReadOnly
transform = new XRRigidTransform(
createDOMPointReadOnly([1.0, 2.0, 3.0]),
createDOMPointReadOnly([1.1, 2.1, 3.1, 1.0]));
checkTransform(transform, "Created with DOMPointReadOnly");
// create transform with dictionary
transform = new XRRigidTransform(
coordDict([1.0, 2.0, 3.0]),
coordDict([1.1, 2.1, 3.1, 1.0]));
checkTransform(transform, "Created with dict");
assert_throws_js(TypeError, () => new XRRigidTransform(
coordDict([1.0, 2.0, 3.0, 0.5]),
coordDict([1.1, 2.1, 3.1, 1.0])
), "Constructor should throw TypeError for non-1 position w values");
assert_throws_js(TypeError, () => new XRRigidTransform(
coordDict([NaN, 2.0, 3.0, 1.0]),
coordDict([1.1, 2.1, 3.1, 1.0])
), "Constructor should throw TypeError if position values contain NaN");
assert_throws_js(TypeError, () => new XRRigidTransform(
coordDict([1.0, Infinity, 3.0, 1.0]),
coordDict([1.1, 2.1, 3.1, 1.0])
), "Constructor should throw TypeError if position values contain Infinity");
assert_throws_js(TypeError, () => new XRRigidTransform(
coordDict([1.0, 2.0, -Infinity, 1.0]),
coordDict([1.1, 2.1, 3.1, 1.0])
), "Constructor should throw TypeError if position values contain -Infinity");
assert_throws_js(TypeError, () => new XRRigidTransform(
coordDict([1.0, 2.0, 3.0, 1.0]),
coordDict([NaN, 2.1, 3.1, 1.0])
), "Constructor should throw TypeError if orientation values contain NaN");
assert_throws_js(TypeError, () => new XRRigidTransform(
coordDict([1.0, 2.0, 3.0, 1.0]),
coordDict([1.1, Infinity, 3.1, 1.0])
), "Constructor should throw TypeError if orientation values contain Infinity");
assert_throws_js(TypeError, () => new XRRigidTransform(
coordDict([1.0, 2.0, 3.0, 1.0]),
coordDict([1.1, 2.1, -Infinity, 1.0])
), "Constructor should throw TypeError if orientation values contain -Infinity");
assert_throws_dom("InvalidStateError", () => new XRRigidTransform(
coordDict([1.0, 2.0, 3.0, 1.0]),
coordDict([0, 0, 0, 0])
), "Constructor should throw InvalidStateError for non-normalizeable orientation values");
assert_throws_dom("InvalidStateError", () => new XRRigidTransform(
coordDict([1.0, 2.0, 3.0, 1.0]),
coordDict([-1.7976931348623157e+308, 0, 0, 0])
), "Constructor should throw InvalidStateError for non-normalizeable orientation values");
resolve();
});
xr_session_promise_test(testName, testFunction, fakeDeviceInitParams,
'immersive-vr');
</script>
|