<!--
Tests that anchors can be created off of AR hit test results when plane is present.
-->
<html>
<head>
<link rel="stylesheet" type="text/css" href="../resources/webxr_e2e.css">
</head>
<body>
<canvas id="webgl-canvas"></canvas>
<script src="../../../../../../third_party/blink/web_tests/resources/testharness.js"></script>
<script src="../resources/webxr_e2e.js"></script>
<script>var shouldAutoCreateNonImmersiveSession = false;</script>
<script src="../resources/webxr_boilerplate.js"></script>
<script>
const TestState = Object.freeze({
"Initial": 0,
"HitTestSourceAvailable": 1, // hitTestSource variable is guaranteed to be non-null in this state
"AnchorRequested": 2,
});
let testState = TestState.Initial;
let hitTestSource = null;
function stepStartHitTesting() {
const sessionInfo = sessionInfos[sessionTypes.AR];
console.log('Requesting hit test source');
sessionInfo.currentSession.requestHitTestSource({
space: sessionInfo.currentRefSpace,
offsetRay: new XRRay()
}).then((hts) => {
console.log('Got hit test source');
// Mark that the hit test source is available.
hitTestSource = hts;
testState = TestState.HitTestSourceAvailable;
}).catch((err) => {
assert_unreached("XRSession.requestHitTestSource() promise rejected.");
});
onARFrameCallback = (session, frame) => {
console.log('Got AR frame, test state is ' + testState);
switch(testState) {
case TestState.Initial: {
// In initial state, there is nothing to do (we're waiting for hit test source).
return;
}
case TestState.HitTestSourceAvailable: {
// Since we already have a hit test source, let's get its results and create an anchor.
const results = frame.getHitTestResults(hitTestSource);
if(results.length) {
const result = results[0];
console.log('Creating anchor');
result.createAnchor().then((anchor) => {
// Mark the test as done, there is no need to pump rAFcb at this point anymore.
done();
}).catch((err) => {
// Fail the test.
assert_unreached("XRHitTestResult.createAnchor() promise rejected.");
});
// Mark that we are waiting for anchor creation.
testState = TestState.AnchorRequested;
}
return;
}
default:
return;
}
};
}
</script>
</body>
</html>