Commit 8217eeb3 authored by Piotr Bialecki's avatar Piotr Bialecki Committed by Commit Bot

Test origin-offset for `viewer` space

Bug: 1009129

Change-Id: Iea0ee4259c894db49a76f8f4e1ca9b53f95f69ad
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1829296
Commit-Queue: Piotr Bialecki <bialpio@chromium.org>
Reviewed-by: default avatarKlaus Weidner <klausw@chromium.org>
Reviewed-by: default avatarAlexander Cooper <alcooper@chromium.org>
Cr-Commit-Position: refs/heads/master@{#701468}
parent e7007fa7
...@@ -50,12 +50,18 @@ XRPose* XRReferenceSpace::getPose( ...@@ -50,12 +50,18 @@ XRPose* XRReferenceSpace::getPose(
XRSpace* other_space, XRSpace* other_space,
const TransformationMatrix* mojo_from_viewer) { const TransformationMatrix* mojo_from_viewer) {
if (type_ == Type::kTypeViewer) { if (type_ == Type::kTypeViewer) {
std::unique_ptr<TransformationMatrix> offsetspace_from_viewer = std::unique_ptr<TransformationMatrix> other_offsetspace_from_viewer =
other_space->SpaceFromViewerWithDefaultAndOffset(mojo_from_viewer); other_space->SpaceFromViewerWithDefaultAndOffset(mojo_from_viewer);
if (!offsetspace_from_viewer) { if (!other_offsetspace_from_viewer) {
return nullptr; return nullptr;
} }
return MakeGarbageCollected<XRPose>(*offsetspace_from_viewer,
auto viewer_from_offset = OriginOffsetMatrix();
auto other_offsetspace_from_offset =
*other_offsetspace_from_viewer * viewer_from_offset;
return MakeGarbageCollected<XRPose>(other_offsetspace_from_offset,
session()->EmulatedPosition()); session()->EmulatedPosition());
} else { } else {
return XRSpace::getPose(other_space, mojo_from_viewer); return XRSpace::getPose(other_space, mojo_from_viewer);
......
...@@ -35,7 +35,7 @@ class XRReferenceSpace : public XRSpace { ...@@ -35,7 +35,7 @@ class XRReferenceSpace : public XRSpace {
~XRReferenceSpace() override; ~XRReferenceSpace() override;
XRPose* getPose(XRSpace* other_space, XRPose* getPose(XRSpace* other_space,
const TransformationMatrix* base_pose_matrix) override; const TransformationMatrix* mojo_from_viewer) override;
std::unique_ptr<TransformationMatrix> DefaultViewerPose() override; std::unique_ptr<TransformationMatrix> DefaultViewerPose() override;
std::unique_ptr<TransformationMatrix> SpaceFromMojo( std::unique_ptr<TransformationMatrix> SpaceFromMojo(
const TransformationMatrix& mojo_from_viewer) override; const TransformationMatrix& mojo_from_viewer) override;
......
...@@ -30,6 +30,31 @@ let assert_point_approx_equals = function(p1, p2, epsilon = FLOAT_EPSILON, prefi ...@@ -30,6 +30,31 @@ let assert_point_approx_equals = function(p1, p2, epsilon = FLOAT_EPSILON, prefi
} }
}; };
// |p1|, |p2| - objects with x, y, z, w components that are floating point numbers
// |epsilon| - float specifying precision
// |prefix| - string used as a prefix for logging
let assert_point_significantly_not_equals = function(p1, p2, epsilon = FLOAT_EPSILON, prefix = "") {
assert_not_equals(p1, null, prefix + "p1 must be non-null");
assert_not_equals(p2, null, prefix + "p2 must be non-null");
let mismatched_component = null;
for (const v of ['x', 'y', 'z', 'w']) {
if (Math.abs(p1[v] - p2[v]) > epsilon) {
mismatched_component = v;
break;
}
}
if (mismatched_component === null) {
let error_message = prefix + ' Point comparison failed.\n';
error_message += ` p1: {x: ${p1.x}, y: ${p1.y}, z: ${p1.z}, w: ${p1.w}}\n`;
error_message += ` p2: {x: ${p2.x}, y: ${p2.y}, z: ${p2.z}, w: ${p2.w}}\n`;
error_message += ` Difference in components did not exceeded the given epsilon.\n`;
assert_unreached(error_message);
}
};
// |m1|, |m2| - arrays of floating point numbers // |m1|, |m2| - arrays of floating point numbers
// |epsilon| - float specifying precision // |epsilon| - float specifying precision
// |prefix| - string used as a prefix for logging // |prefix| - string used as a prefix for logging
......
<!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 src="resources/webxr_test_asserts.js"></script>
<canvas id="webgl-canvas"></canvas>
<script>
let testName = "Creating XRReferenceSpace origin offset off of `viewer` space works.";
let fakeDeviceInitParams = {
supportsImmersive: true,
viewerOrigin: VALID_POSE_TRANSFORM,
views: VALID_VIEWS,
supportedFeatures: ALL_FEATURES
};
let originOffsetPosition = new DOMPointReadOnly(0, 0, 1);
let testFunction =
(session, fakeDeviceController, t) => new Promise((resolve) => {
session.requestReferenceSpace('local').then( (localSpace) => {
session.requestReferenceSpace('viewer').then( (viewerSpace) => {
let offsetSpace = viewerSpace.getOffsetReferenceSpace(
new XRRigidTransform(originOffsetPosition));
function OnFrame(time, frame) {
let viewerPose = frame.getPose(viewerSpace, localSpace);
let offsetPose = frame.getPose(offsetSpace, localSpace);
let viewerPose2 = frame.getPose(localSpace ,viewerSpace);
let offsetPose2 = frame.getPose(localSpace, offsetSpace);
t.step(() => {
assert_point_significantly_not_equals(viewerPose.transform.position, offsetPose.transform.position);
assert_point_significantly_not_equals(viewerPose2.transform.position, offsetPose2.transform.position);
});
resolve();
}
// Can only request input poses in an xr frame.
session.requestAnimationFrame(OnFrame);
});
});
});
xr_session_promise_test(
testName, testFunction, fakeDeviceInitParams, 'immersive-vr');
</script>
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment