tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

xrFrame_getViewerPose_getPose_identities.https.html (5302B)


      1 <!DOCTYPE html>
      2 <body>
      3  <script src=/resources/testharness.js></script>
      4  <script src=/resources/testharnessreport.js></script>
      5  <script src="resources/webxr_util.js"></script>
      6  <script src="resources/webxr_test_constants.js"></script>
      7  <script src="resources/webxr_test_asserts.js"></script>
      8 
      9  <script>
     10 
     11    let testName = "XRFrame getViewerPose(viewerSpace) & getPose(space, space) return identity even during tracking loss";
     12 
     13    // Use the same device as tracked immersive device, but modify the viewer origin.
     14    const deviceInitParams = Object.assign({}, TRACKED_IMMERSIVE_DEVICE, {viewerOrigin: null});
     15 
     16    // Used when creating a reference space that is offset from local space.
     17    // Actual values should not matter for the test.
     18    const offsetSpaceTransform = new XRRigidTransform(
     19      { x: 1.00, y: -1.50, z: 10.00, w: 1.0 },
     20      { x: 0.27, y:  0.00, z:  0.27, w: 0.92},  // 45 degrees around [1, 0, 1] axis
     21    );
     22 
     23    const expectMatrix = function(pose, expectedMatrix, poseName) {
     24      assert_not_equals(pose, null,
     25                        poseName + " should not be null!");
     26      assert_matrix_approx_equals(pose.transform.matrix, expectedMatrix,
     27                                  poseName + "'s matrix should match expectations!");
     28      assert_false(pose.emulatedPosition,
     29                   poseName + ".emulatedPosition should be false!");
     30    }
     31 
     32    const expectIdentity = function(pose, poseName) {
     33      assert_not_equals(pose, null,
     34                        poseName + " should not be null!");
     35      assert_matrix_approx_equals(pose.transform.matrix, IDENTITY_MATRIX,
     36                                  poseName + "'s matrix should equal identity!");
     37      assert_false(pose.emulatedPosition,
     38                   poseName + ".emulatedPosition should be false!");
     39    }
     40 
     41    const testFunction = function(session, fakeDeviceController, t) {
     42      // Verify that setting viewerOrigin to null throws TypeError per spec.
     43      t.step(() => {
     44        assert_throws_js(TypeError, () => {
     45          // fakeDeviceController is supplied to the test and should expose the method
     46          // that the implementation uses to set the viewer origin. If the API name
     47          // differs, adapt this call accordingly.
     48          fakeDeviceController.setViewerOrigin(null);
     49        }, "fakeDeviceController.setViewerOrigin(null) should throw TypeError");
     50      });
     51 
     52      return Promise.all([
     53        session.requestReferenceSpace('local'),
     54        session.requestReferenceSpace('viewer'),
     55        session.requestReferenceSpace('local-floor'),
     56        session.requestReferenceSpace('bounded-floor'),
     57        session.requestReferenceSpace('unbounded'),
     58        session.requestReferenceSpace('local'),
     59      ]).then((allSpaces) => new Promise((resolve, reject) => {
     60        const [
     61          localSpace1,
     62          viewerSpace,
     63          localFloorSpace,
     64          boundedFloorSpace,
     65          unboundedSpace,
     66          localSpace2] = allSpaces;
     67 
     68        const offsetLocalSpace1 = localSpace1.getOffsetReferenceSpace(offsetSpaceTransform);
     69        const offsetLocalSpace2 = localSpace2.getOffsetReferenceSpace(offsetSpaceTransform);
     70        const offsetViewerSpace = viewerSpace.getOffsetReferenceSpace(offsetSpaceTransform);
     71 
     72        // Throw in an offset space:
     73        allSpaces.push(offsetLocalSpace1);
     74 
     75        function onFrame(time, frame) {
     76          // Expect identities:
     77          const viewerFromViewer1 = frame.getViewerPose(viewerSpace);
     78 
     79          const localFromLocalDifferentAddress = frame.getPose(localSpace1, localSpace2);
     80          const offsetFromOffsetDifferentAddress = frame.getPose(offsetLocalSpace1, offsetLocalSpace2);
     81 
     82          t.step(() => {
     83            expectIdentity(viewerFromViewer1, "viewerFromViewer1");
     84            expectIdentity(localFromLocalDifferentAddress, "localFromLocalDifferentAddress");
     85            expectIdentity(offsetFromOffsetDifferentAddress, "offsetFromOffsetDifferentAddress");
     86          });
     87 
     88          // Expect offsetSpaceTransform:
     89          const viewerFromViewer2 = frame.getViewerPose(offsetViewerSpace);
     90 
     91          const viewerFromOffset2 = frame.getPose(offsetViewerSpace, viewerSpace);
     92          const localFromOffset1 = frame.getPose(offsetLocalSpace1, localSpace1);
     93          const localFromOffset2 = frame.getPose(offsetLocalSpace2, localSpace1);
     94 
     95          t.step(() => {
     96            expectMatrix(viewerFromViewer2, offsetSpaceTransform.matrix, "viewerFromViewer2");
     97            expectMatrix(viewerFromOffset2, offsetSpaceTransform.matrix, "viewerFromOffset2");
     98            expectMatrix(localFromOffset1, offsetSpaceTransform.matrix, "localFromOffset1");
     99            expectMatrix(localFromOffset2, offsetSpaceTransform.matrix, "localFromOffset2");
    100          });
    101 
    102          // Expect identities:
    103          allSpaces.forEach((space, index) => {
    104            const pose = frame.getPose(space, space);
    105            t.step(() => {
    106              expectIdentity(pose, "pose[" + index +"]");
    107            });
    108          });
    109 
    110          resolve();
    111        }
    112 
    113        session.requestAnimationFrame(onFrame);
    114      }));
    115    };
    116 
    117    xr_session_promise_test(testName, testFunction,
    118      deviceInitParams, 'immersive-vr', {
    119        requiredFeatures: ["local", "local-floor", "bounded-floor", "unbounded"]
    120      });
    121 
    122  </script>
    123 </body>