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
|
<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/webxr_test_constants.js"></script>
<script src="resources/webxr_test_asserts.js"></script>
<script>
let constructor_test_name = "XRRay constructors work";
let constructor_tests = function() {
// Constructor tests for XRRay.
// Spec: https://immersive-web.github.io/webxr/#xrray-interface
//
// Constructor 1 - from origin and direction
//
{
// Check defaults - should be 0,0,0,1 for origin and 0,0,-1,0 for direction,
// identity matrix for the transform:
let xrRay = new XRRay();
assert_point_approx_equals(
xrRay.origin, {x : 0.0, y : 0.0, z : 0.0, w : 1.0},
FLOAT_EPSILON, "origin-default:");
assert_point_approx_equals(
xrRay.direction, {x : 0.0, y : 0.0, z : -1.0, w : 0.0},
FLOAT_EPSILON, "direction-default:");
assert_matrix_approx_equals(
xrRay.matrix, IDENTITY_MATRIX,
FLOAT_EPSILON, "matrix-default:");
}
{
// Check custom value for origin, default for direction:
let originDict = {x : 11.0, y : 12.0, z : 13.0, w : 1.0};
let xrRay2 = new XRRay(DOMPoint.fromPoint(originDict));
let xrRay3 = new XRRay(DOMPointReadOnly.fromPoint(originDict));
let matrix1 = [ 1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
11, 12, 13, 1];
assert_point_approx_equals(
xrRay2.origin, originDict,
FLOAT_EPSILON, "origin-custom-direction-default:");
assert_point_approx_equals(
xrRay2.direction, {x : 0.0, y : 0.0, z : -1.0, w : 0.0},
FLOAT_EPSILON, "direction-custom-direction-default:");
assert_matrix_approx_equals(
xrRay2.matrix, matrix1,
FLOAT_EPSILON, "matrix-custom-direction-default:");
assert_ray_approx_equals(xrRay2, xrRay3, FLOAT_EPSILON, "ray2-ray3-direction-default:");
}
{
// Check custom values - ray rotated from -Z onto +X,
// not placed at origin:
// - from DOMPoint
// - from DOMPointReadOnly
let originDict = {x : 10.0, y : 10.0, z : 10.0, w : 1.0};
let directionDict = {x : 10.0, y : 0.0, z : 0.0, w : 0.0};
let directionNorm = {x : 1.0, y : 0.0, z : 0.0, w : 0.0};
// column-major
let matrix1 = [ 0, 0, 1, 0,
0, 1, 0, 0,
-1, 0, 0, 0,
10, 10, 10, 1];
let xrRay2 = new XRRay(
DOMPoint.fromPoint(originDict),
DOMPoint.fromPoint(directionDict));
let xrRay3 = new XRRay(
DOMPointReadOnly.fromPoint(originDict),
DOMPointReadOnly.fromPoint(directionDict));
assert_point_approx_equals(
xrRay2.origin, originDict,
FLOAT_EPSILON, "origin-custom:");
assert_point_approx_equals(
xrRay2.direction, directionNorm,
FLOAT_EPSILON, "direction-custom:");
assert_matrix_approx_equals(
xrRay2.matrix, matrix1,
FLOAT_EPSILON, "matrix-custom:");
assert_ray_approx_equals(xrRay2, xrRay3, FLOAT_EPSILON, "ray2-ray3:");
}
{
// Check that we don't crash on direction too close to 0,0,0:
let originDict = {x : 10.0, y : 10.0, z : 10.0, w : 1.0};
let directionDict = {x : 0.0, y : 0.0, z : 0.0, w : 0.0};
let xrRay = new XRRay(
DOMPoint.fromPoint(originDict),
DOMPoint.fromPoint(directionDict));
assert_point_approx_equals(
xrRay.origin, originDict,
FLOAT_EPSILON, "origin-custom-direction-zero:");
// cannot validate direction's & matrix's values w/o making it depend on current
// implementation, just check that they're not null
assert_not_equals(xrRay.direction, null, "origin-custom-direction-zero:direction should not be null");
assert_not_equals(xrRay.matrix, null, "origin-custom-direction-zero:matrix should not be null");
}
//
// Constructor 2 - from rigid transform.
//
{
// Not placed at origin, ray rotated by 135 degrees around Y:
let originDict = {x : 10.0, y : 10.0, z : 10.0, w : 1.0};
let directionQuaternionDict = { x : 0, y : 0.9239, z : 0, w : 0.3827 };
let directionNorm2 = { x : -0.707, y : 0.0, z : 0.707, w : 0.0 };
let matrix2 = [-0.707, 0, -0.707, 0,
0., 1, 0, 0,
0.707, 0, -0.707, 0,
10., 10, 10., 1];
let xrRay4 = new XRRay(
new XRRigidTransform(
DOMPoint.fromPoint(originDict),
DOMPoint.fromPoint(directionQuaternionDict)));
assert_point_approx_equals(
xrRay4.origin, originDict,
FLOAT_EPSILON, "origin-custom-rigid:");
assert_point_approx_equals(
xrRay4.direction, directionNorm2,
FLOAT_EPSILON, "direction-custom-rigid:");
assert_matrix_approx_equals(
xrRay4.matrix, matrix2,
FLOAT_EPSILON, "matrix-custom-rigid:");
}
};
test(constructor_tests, constructor_test_name);
</script>
|