aboutsummaryrefslogtreecommitdiffstats
path: root/tests/wpt/web-platform-tests/webxr/xrFrame_getPose.https.html
blob: a8015e3276acc3f97cced60c964d92c752a25d24 (plain) (blame)
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
<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/test-constants.js"></script>
<script src="resources/webxr_util.js"></script>
<script src="resources/xr-test-asserts.js"></script>
<canvas></canvas>

<script>

let immersiveTestName = "XRFrame.getPose works for immersive sessions";
let nonImmersiveTestName = "XRFrame.getPose works for non-immersive sessions";

let fakeDeviceInitParams = { supportsImmersive:true };

let testFunction = function(session, fakeDeviceController, t) {
  // Need to have a valid pose or input events don't process.
  fakeDeviceController.setXRPresentationFrameData(VALID_POSE_MATRIX, [{
      eye:"left",
      projectionMatrix: VALID_PROJECTION_MATRIX,
      viewMatrix: VALID_VIEW_MATRIX
    }, {
      eye:"right",
      projectionMatrix: VALID_PROJECTION_MATRIX,
      viewMatrix: VALID_VIEW_MATRIX
    }]);

  return Promise.all([
    session.requestReferenceSpace({ type: "stationary", subtype: "eye-level" }),
    session.requestReferenceSpace({ type: "stationary", subtype: "eye-level" })
  ]).then((spaces) => new Promise((resolve) => {
    function onFrame(time, xrFrame) {
      const radians = Math.PI / 2.0; // 90 degrees

      // Both eye-level spaces start out with originOffset = identity matrix.
      let space1 = spaces[0];
      let space2 = spaces[1];

      // Rotate 90 degrees about x axis, then move 1 meter along y axis.
      space1.originOffset = new XRRigidTransform(
        DOMPointReadOnly.fromPoint({
          x : 0,
          y : 1,
          z : 0,
          w : 0
        }),
        DOMPointReadOnly.fromPoint({
          x : Math.sin(radians / 2),
          y : 0,
          z : 0,
          w : Math.cos(radians / 2)
        })
      );

      // Rotate 90 degrees about z axis, then move 1 meter along x axis.
      space2.originOffset = new XRRigidTransform(
        DOMPointReadOnly.fromPoint({
          x : 1,
          y : 0,
          z : 0,
          w : 0
        }),
        DOMPointReadOnly.fromPoint({
          x : 0,
          y : 0,
          z : Math.sin(radians / 2),
          w : Math.cos(radians / 2)
        })
      );

      let space1_from_space2 = xrFrame.getPose(space1, space2);
      const EXPECTED_POSE_MATRIX = [
        0, 0, -1, 0, // 1st column
        -1, 0, 0, 0, // 2nd column
        0, 1, 0, 0, // 3rd column
        1, 0, 1, 1 // 4th column
      ];
      assert_matrix_approx_equals(space1_from_space2.transform.matrix, EXPECTED_POSE_MATRIX, FLOAT_EPSILON);

      // Finished test.
      resolve();
    }

    session.requestAnimationFrame(onFrame);
  }));
};

xr_session_promise_test(immersiveTestName, testFunction,
  fakeDeviceInitParams, 'immersive-vr');
xr_session_promise_test(nonImmersiveTestName, testFunction,
  fakeDeviceInitParams, 'inline');

</script>