Commit 64cbdf7a authored by Will Cassella's avatar Will Cassella Committed by Commit Bot

Replace originOffset public member with getOffsetReferenceSpace method

Remove originOffset as a public member of XRReferenceSpace. Add
getOffsetReferenceSpace() method for creating a new XRReferenceSpace
instead of mutating originOffset.

Bug: 958440
Change-Id: I9af336112df7a359a6ac02bd8d30e554ae540511
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1595131
Commit-Queue: Will Cassella <cassew@google.com>
Reviewed-by: default avatarBill Orr <billorr@chromium.org>
Reviewed-by: default avatarBrandon Jones <bajones@chromium.org>
Cr-Commit-Position: refs/heads/master@{#659786}
parent 62a3c8c4
...@@ -14,15 +14,12 @@ namespace blink { ...@@ -14,15 +14,12 @@ namespace blink {
XRBoundedReferenceSpace::XRBoundedReferenceSpace(XRSession* session) XRBoundedReferenceSpace::XRBoundedReferenceSpace(XRSession* session)
: XRReferenceSpace(session) {} : XRReferenceSpace(session) {}
XRBoundedReferenceSpace::~XRBoundedReferenceSpace() = default; XRBoundedReferenceSpace::XRBoundedReferenceSpace(
XRSession* session,
void XRBoundedReferenceSpace::setOriginOffset(XRRigidTransform* transform) { XRRigidTransform* origin_offset)
XRReferenceSpace::setOriginOffset(transform); : XRReferenceSpace(session, origin_offset) {}
// Force a bounds update. XRBoundedReferenceSpace::~XRBoundedReferenceSpace() = default;
stage_parameters_id_ = 0;
EnsureUpdated();
}
// No default pose for bounded reference spaces. // No default pose for bounded reference spaces.
std::unique_ptr<TransformationMatrix> XRBoundedReferenceSpace::DefaultPose() { std::unique_ptr<TransformationMatrix> XRBoundedReferenceSpace::DefaultPose() {
...@@ -51,8 +48,7 @@ void XRBoundedReferenceSpace::EnsureUpdated() { ...@@ -51,8 +48,7 @@ void XRBoundedReferenceSpace::EnsureUpdated() {
// In order to ensure that the bounds continue to line up with the user's // In order to ensure that the bounds continue to line up with the user's
// physical environment we need to transform by the inverse of the // physical environment we need to transform by the inverse of the
// originOffset. // originOffset.
TransformationMatrix bounds_transform = TransformationMatrix bounds_transform = InverseOriginOffsetMatrix();
originOffset()->InverseTransformMatrix();
if (display_info->stageParameters->bounds) { if (display_info->stageParameters->bounds) {
bounds_geometry_.clear(); bounds_geometry_.clear();
...@@ -126,4 +122,10 @@ void XRBoundedReferenceSpace::OnReset() { ...@@ -126,4 +122,10 @@ void XRBoundedReferenceSpace::OnReset() {
DispatchEvent(*XRReferenceSpaceEvent::Create(event_type_names::kReset, this)); DispatchEvent(*XRReferenceSpaceEvent::Create(event_type_names::kReset, this));
} }
XRBoundedReferenceSpace* XRBoundedReferenceSpace::cloneWithOriginOffset(
XRRigidTransform* origin_offset) {
return MakeGarbageCollected<XRBoundedReferenceSpace>(this->session(),
origin_offset);
}
} // namespace blink } // namespace blink
...@@ -15,15 +15,14 @@ class XRBoundedReferenceSpace final : public XRReferenceSpace { ...@@ -15,15 +15,14 @@ class XRBoundedReferenceSpace final : public XRReferenceSpace {
DEFINE_WRAPPERTYPEINFO(); DEFINE_WRAPPERTYPEINFO();
public: public:
XRBoundedReferenceSpace(XRSession*); explicit XRBoundedReferenceSpace(XRSession*);
XRBoundedReferenceSpace(XRSession*, XRRigidTransform*);
~XRBoundedReferenceSpace() override; ~XRBoundedReferenceSpace() override;
std::unique_ptr<TransformationMatrix> DefaultPose() override; std::unique_ptr<TransformationMatrix> DefaultPose() override;
std::unique_ptr<TransformationMatrix> TransformBasePose( std::unique_ptr<TransformationMatrix> TransformBasePose(
const TransformationMatrix& base_pose) override; const TransformationMatrix& base_pose) override;
void setOriginOffset(XRRigidTransform*) override;
HeapVector<Member<DOMPointReadOnly>> boundsGeometry(); HeapVector<Member<DOMPointReadOnly>> boundsGeometry();
void Trace(blink::Visitor*) override; void Trace(blink::Visitor*) override;
...@@ -31,6 +30,9 @@ class XRBoundedReferenceSpace final : public XRReferenceSpace { ...@@ -31,6 +30,9 @@ class XRBoundedReferenceSpace final : public XRReferenceSpace {
void OnReset() override; void OnReset() override;
private: private:
XRBoundedReferenceSpace* cloneWithOriginOffset(
XRRigidTransform* origin_offset) override;
void EnsureUpdated(); void EnsureUpdated();
HeapVector<Member<DOMPointReadOnly>> bounds_geometry_; HeapVector<Member<DOMPointReadOnly>> bounds_geometry_;
......
...@@ -13,9 +13,13 @@ namespace blink { ...@@ -13,9 +13,13 @@ namespace blink {
// origin offset starts as identity transform // origin offset starts as identity transform
XRReferenceSpace::XRReferenceSpace(XRSession* session) XRReferenceSpace::XRReferenceSpace(XRSession* session)
: XRSpace(session), : XRReferenceSpace(
origin_offset_(MakeGarbageCollected<XRRigidTransform>(nullptr, nullptr)) { session,
} MakeGarbageCollected<XRRigidTransform>(nullptr, nullptr)) {}
XRReferenceSpace::XRReferenceSpace(XRSession* session,
XRRigidTransform* origin_offset)
: XRSpace(session), origin_offset_(origin_offset) {}
XRReferenceSpace::~XRReferenceSpace() = default; XRReferenceSpace::~XRReferenceSpace() = default;
...@@ -63,14 +67,28 @@ XRReferenceSpace::GetTransformToMojoSpace() { ...@@ -63,14 +67,28 @@ XRReferenceSpace::GetTransformToMojoSpace() {
return transform_matrix; return transform_matrix;
} }
void XRReferenceSpace::setOriginOffset(XRRigidTransform* transform) { TransformationMatrix XRReferenceSpace::OriginOffsetMatrix() {
origin_offset_ = transform; return origin_offset_->TransformMatrix();
} }
TransformationMatrix XRReferenceSpace::InverseOriginOffsetMatrix() { TransformationMatrix XRReferenceSpace::InverseOriginOffsetMatrix() {
return origin_offset_->InverseTransformMatrix(); return origin_offset_->InverseTransformMatrix();
} }
XRReferenceSpace* XRReferenceSpace::getOffsetReferenceSpace(
XRRigidTransform* additional_offset) {
auto matrix =
OriginOffsetMatrix().Multiply(additional_offset->TransformMatrix());
auto* result_transform = MakeGarbageCollected<XRRigidTransform>(matrix);
return cloneWithOriginOffset(result_transform);
}
XRReferenceSpace* XRReferenceSpace::cloneWithOriginOffset(
XRRigidTransform* origin_offset) {
return MakeGarbageCollected<XRReferenceSpace>(this->session(), origin_offset);
}
void XRReferenceSpace::Trace(blink::Visitor* visitor) { void XRReferenceSpace::Trace(blink::Visitor* visitor) {
visitor->Trace(origin_offset_); visitor->Trace(origin_offset_);
XRSpace::Trace(visitor); XRSpace::Trace(visitor);
......
...@@ -19,6 +19,7 @@ class XRReferenceSpace : public XRSpace { ...@@ -19,6 +19,7 @@ class XRReferenceSpace : public XRSpace {
public: public:
explicit XRReferenceSpace(XRSession*); explicit XRReferenceSpace(XRSession*);
XRReferenceSpace(XRSession*, XRRigidTransform*);
~XRReferenceSpace() override; ~XRReferenceSpace() override;
std::unique_ptr<TransformationMatrix> DefaultPose() override; std::unique_ptr<TransformationMatrix> DefaultPose() override;
...@@ -30,10 +31,11 @@ class XRReferenceSpace : public XRSpace { ...@@ -30,10 +31,11 @@ class XRReferenceSpace : public XRSpace {
std::unique_ptr<TransformationMatrix> GetTransformToMojoSpace() override; std::unique_ptr<TransformationMatrix> GetTransformToMojoSpace() override;
XRRigidTransform* originOffset() const { return origin_offset_; } TransformationMatrix OriginOffsetMatrix() override;
virtual void setOriginOffset(XRRigidTransform*);
TransformationMatrix InverseOriginOffsetMatrix() override; TransformationMatrix InverseOriginOffsetMatrix() override;
XRReferenceSpace* getOffsetReferenceSpace(XRRigidTransform* transform);
DEFINE_ATTRIBUTE_EVENT_LISTENER(reset, kReset) DEFINE_ATTRIBUTE_EVENT_LISTENER(reset, kReset)
void Trace(blink::Visitor*) override; void Trace(blink::Visitor*) override;
...@@ -41,6 +43,9 @@ class XRReferenceSpace : public XRSpace { ...@@ -41,6 +43,9 @@ class XRReferenceSpace : public XRSpace {
virtual void OnReset(); virtual void OnReset();
private: private:
virtual XRReferenceSpace* cloneWithOriginOffset(
XRRigidTransform* origin_offset);
Member<XRRigidTransform> origin_offset_; Member<XRRigidTransform> origin_offset_;
}; };
......
...@@ -16,6 +16,6 @@ enum XRReferenceSpaceType { ...@@ -16,6 +16,6 @@ enum XRReferenceSpaceType {
Exposed=Window, Exposed=Window,
RuntimeEnabled=WebXR RuntimeEnabled=WebXR
] interface XRReferenceSpace : XRSpace { ] interface XRReferenceSpace : XRSpace {
attribute XRRigidTransform originOffset;
attribute EventHandler onreset; attribute EventHandler onreset;
XRReferenceSpace getOffsetReferenceSpace(XRRigidTransform originOffset);
}; };
...@@ -37,6 +37,11 @@ std::unique_ptr<TransformationMatrix> XRSpace::TransformBaseInputPose( ...@@ -37,6 +37,11 @@ std::unique_ptr<TransformationMatrix> XRSpace::TransformBaseInputPose(
return nullptr; return nullptr;
} }
TransformationMatrix XRSpace::OriginOffsetMatrix() {
TransformationMatrix identity;
return identity;
}
TransformationMatrix XRSpace::InverseOriginOffsetMatrix() { TransformationMatrix XRSpace::InverseOriginOffsetMatrix() {
TransformationMatrix identity; TransformationMatrix identity;
return identity; return identity;
......
...@@ -51,6 +51,7 @@ class XRSpace : public EventTargetWithInlineData { ...@@ -51,6 +51,7 @@ class XRSpace : public EventTargetWithInlineData {
ExecutionContext* GetExecutionContext() const override; ExecutionContext* GetExecutionContext() const override;
const AtomicString& InterfaceName() const override; const AtomicString& InterfaceName() const override;
virtual TransformationMatrix OriginOffsetMatrix();
virtual TransformationMatrix InverseOriginOffsetMatrix(); virtual TransformationMatrix InverseOriginOffsetMatrix();
void Trace(blink::Visitor*) override; void Trace(blink::Visitor*) override;
......
...@@ -17,6 +17,12 @@ XRStationaryReferenceSpace::XRStationaryReferenceSpace(XRSession* session, ...@@ -17,6 +17,12 @@ XRStationaryReferenceSpace::XRStationaryReferenceSpace(XRSession* session,
Subtype subtype) Subtype subtype)
: XRReferenceSpace(session), subtype_(subtype) {} : XRReferenceSpace(session), subtype_(subtype) {}
XRStationaryReferenceSpace::XRStationaryReferenceSpace(
XRSession* session,
XRRigidTransform* transform,
Subtype subtype)
: XRReferenceSpace(session, transform), subtype_(subtype) {}
XRStationaryReferenceSpace::~XRStationaryReferenceSpace() = default; XRStationaryReferenceSpace::~XRStationaryReferenceSpace() = default;
void XRStationaryReferenceSpace::UpdateFloorLevelTransform() { void XRStationaryReferenceSpace::UpdateFloorLevelTransform() {
...@@ -67,8 +73,8 @@ XRStationaryReferenceSpace::TransformBasePose( ...@@ -67,8 +73,8 @@ XRStationaryReferenceSpace::TransformBasePose(
// Apply the floor-level transform to the base pose. // Apply the floor-level transform to the base pose.
if (floor_level_transform_) { if (floor_level_transform_) {
std::unique_ptr<TransformationMatrix> pose( auto pose =
std::make_unique<TransformationMatrix>(*floor_level_transform_)); std::make_unique<TransformationMatrix>(*floor_level_transform_);
pose->Multiply(base_pose); pose->Multiply(base_pose);
return pose; return pose;
} }
...@@ -77,8 +83,7 @@ XRStationaryReferenceSpace::TransformBasePose( ...@@ -77,8 +83,7 @@ XRStationaryReferenceSpace::TransformBasePose(
// 'position-disabled' poses must not contain any translation components, // 'position-disabled' poses must not contain any translation components,
// and as a result the space the base pose is originally in doesn't matter // and as a result the space the base pose is originally in doesn't matter
// much. Strip out translation component and return. // much. Strip out translation component and return.
std::unique_ptr<TransformationMatrix> pose( auto pose = std::make_unique<TransformationMatrix>(base_pose);
std::make_unique<TransformationMatrix>(base_pose));
pose->SetM41(0.0); pose->SetM41(0.0);
pose->SetM42(0.0); pose->SetM42(0.0);
pose->SetM43(0.0); pose->SetM43(0.0);
...@@ -98,8 +103,7 @@ XRStationaryReferenceSpace::TransformBaseInputPose( ...@@ -98,8 +103,7 @@ XRStationaryReferenceSpace::TransformBaseInputPose(
const TransformationMatrix& base_pose) { const TransformationMatrix& base_pose) {
switch (subtype_) { switch (subtype_) {
case kSubtypePositionDisabled: { case kSubtypePositionDisabled: {
std::unique_ptr<TransformationMatrix> head_model_pose( auto head_model_pose = TransformBasePose(base_pose);
TransformBasePose(base_pose));
// Get the positional delta between the base pose and the head model pose. // Get the positional delta between the base pose and the head model pose.
float dx = head_model_pose->M41() - base_pose.M41(); float dx = head_model_pose->M41() - base_pose.M41();
...@@ -108,8 +112,7 @@ XRStationaryReferenceSpace::TransformBaseInputPose( ...@@ -108,8 +112,7 @@ XRStationaryReferenceSpace::TransformBaseInputPose(
// Translate the controller by the same delta so that it shows up in the // Translate the controller by the same delta so that it shows up in the
// right relative position. // right relative position.
std::unique_ptr<TransformationMatrix> pose( auto pose = std::make_unique<TransformationMatrix>(base_input_pose);
std::make_unique<TransformationMatrix>(base_input_pose));
pose->SetM41(pose->M41() + dx); pose->SetM41(pose->M41() + dx);
pose->SetM42(pose->M42() + dy); pose->SetM42(pose->M42() + dy);
pose->SetM43(pose->M43() + dz); pose->SetM43(pose->M43() + dz);
...@@ -133,4 +136,10 @@ void XRStationaryReferenceSpace::OnReset() { ...@@ -133,4 +136,10 @@ void XRStationaryReferenceSpace::OnReset() {
DispatchEvent(*XRReferenceSpaceEvent::Create(event_type_names::kReset, this)); DispatchEvent(*XRReferenceSpaceEvent::Create(event_type_names::kReset, this));
} }
XRStationaryReferenceSpace* XRStationaryReferenceSpace::cloneWithOriginOffset(
XRRigidTransform* origin_offset) {
return MakeGarbageCollected<XRStationaryReferenceSpace>(
this->session(), origin_offset, subtype_);
}
} // namespace blink } // namespace blink
...@@ -21,6 +21,7 @@ class XRStationaryReferenceSpace final : public XRReferenceSpace { ...@@ -21,6 +21,7 @@ class XRStationaryReferenceSpace final : public XRReferenceSpace {
}; };
XRStationaryReferenceSpace(XRSession*, Subtype); XRStationaryReferenceSpace(XRSession*, Subtype);
XRStationaryReferenceSpace(XRSession*, XRRigidTransform*, Subtype);
~XRStationaryReferenceSpace() override; ~XRStationaryReferenceSpace() override;
std::unique_ptr<TransformationMatrix> DefaultPose() override; std::unique_ptr<TransformationMatrix> DefaultPose() override;
...@@ -35,6 +36,9 @@ class XRStationaryReferenceSpace final : public XRReferenceSpace { ...@@ -35,6 +36,9 @@ class XRStationaryReferenceSpace final : public XRReferenceSpace {
void OnReset() override; void OnReset() override;
private: private:
XRStationaryReferenceSpace* cloneWithOriginOffset(
XRRigidTransform* origin_offset) override;
void UpdateFloorLevelTransform(); void UpdateFloorLevelTransform();
unsigned int display_info_id_ = 0; unsigned int display_info_id_ = 0;
......
...@@ -13,6 +13,11 @@ namespace blink { ...@@ -13,6 +13,11 @@ namespace blink {
XRUnboundedReferenceSpace::XRUnboundedReferenceSpace(XRSession* session) XRUnboundedReferenceSpace::XRUnboundedReferenceSpace(XRSession* session)
: XRReferenceSpace(session) {} : XRReferenceSpace(session) {}
XRUnboundedReferenceSpace::XRUnboundedReferenceSpace(
XRSession* session,
XRRigidTransform* origin_offset)
: XRReferenceSpace(session, origin_offset) {}
XRUnboundedReferenceSpace::~XRUnboundedReferenceSpace() = default; XRUnboundedReferenceSpace::~XRUnboundedReferenceSpace() = default;
// No default pose for unbounded reference spaces. // No default pose for unbounded reference spaces.
...@@ -36,4 +41,10 @@ void XRUnboundedReferenceSpace::OnReset() { ...@@ -36,4 +41,10 @@ void XRUnboundedReferenceSpace::OnReset() {
DispatchEvent(*XRReferenceSpaceEvent::Create(event_type_names::kReset, this)); DispatchEvent(*XRReferenceSpaceEvent::Create(event_type_names::kReset, this));
} }
XRUnboundedReferenceSpace* XRUnboundedReferenceSpace::cloneWithOriginOffset(
XRRigidTransform* origin_offset) {
return MakeGarbageCollected<XRUnboundedReferenceSpace>(this->session(),
origin_offset);
}
} // namespace blink } // namespace blink
...@@ -14,7 +14,8 @@ class XRUnboundedReferenceSpace final : public XRReferenceSpace { ...@@ -14,7 +14,8 @@ class XRUnboundedReferenceSpace final : public XRReferenceSpace {
DEFINE_WRAPPERTYPEINFO(); DEFINE_WRAPPERTYPEINFO();
public: public:
XRUnboundedReferenceSpace(XRSession*); explicit XRUnboundedReferenceSpace(XRSession*);
XRUnboundedReferenceSpace(XRSession*, XRRigidTransform*);
~XRUnboundedReferenceSpace() override; ~XRUnboundedReferenceSpace() override;
std::unique_ptr<TransformationMatrix> DefaultPose() override; std::unique_ptr<TransformationMatrix> DefaultPose() override;
...@@ -26,6 +27,9 @@ class XRUnboundedReferenceSpace final : public XRReferenceSpace { ...@@ -26,6 +27,9 @@ class XRUnboundedReferenceSpace final : public XRReferenceSpace {
void OnReset() override; void OnReset() override;
private: private:
XRUnboundedReferenceSpace* cloneWithOriginOffset(
XRRigidTransform* origin_offset) override;
std::unique_ptr<TransformationMatrix> pose_transform_; std::unique_ptr<TransformationMatrix> pose_transform_;
}; };
......
This is a testharness.js-based test. This is a testharness.js-based test.
Found 202 tests; 200 PASS, 2 FAIL, 0 TIMEOUT, 0 NOTRUN. Found 202 tests; 201 PASS, 1 FAIL, 0 TIMEOUT, 0 NOTRUN.
PASS idl_test setup PASS idl_test setup
PASS Partial interface Navigator: original interface defined PASS Partial interface Navigator: original interface defined
PASS Partial dictionary WebGLContextAttributes: original dictionary defined PASS Partial dictionary WebGLContextAttributes: original dictionary defined
...@@ -74,7 +74,7 @@ PASS XRReferenceSpace interface object name ...@@ -74,7 +74,7 @@ PASS XRReferenceSpace interface object name
PASS XRReferenceSpace interface: existence and properties of interface prototype object PASS XRReferenceSpace interface: existence and properties of interface prototype object
PASS XRReferenceSpace interface: existence and properties of interface prototype object's "constructor" property PASS XRReferenceSpace interface: existence and properties of interface prototype object's "constructor" property
PASS XRReferenceSpace interface: existence and properties of interface prototype object's @@unscopables property PASS XRReferenceSpace interface: existence and properties of interface prototype object's @@unscopables property
FAIL XRReferenceSpace interface: operation getOffsetReferenceSpace(XRRigidTransform) assert_own_property: interface prototype object missing non-static operation expected property "getOffsetReferenceSpace" missing PASS XRReferenceSpace interface: operation getOffsetReferenceSpace(XRRigidTransform)
PASS XRReferenceSpace interface: attribute onreset PASS XRReferenceSpace interface: attribute onreset
PASS XRBoundedReferenceSpace interface: existence and properties of interface object PASS XRBoundedReferenceSpace interface: existence and properties of interface object
PASS XRBoundedReferenceSpace interface object length PASS XRBoundedReferenceSpace interface object length
......
...@@ -37,7 +37,7 @@ let testFunction = function(session, fakeDeviceController, t) { ...@@ -37,7 +37,7 @@ let testFunction = function(session, fakeDeviceController, t) {
let space2 = spaces[1]; let space2 = spaces[1];
// Rotate 90 degrees about x axis, then move 1 meter along y axis. // Rotate 90 degrees about x axis, then move 1 meter along y axis.
space1.originOffset = new XRRigidTransform( space1 = space1.getOffsetReferenceSpace(new XRRigidTransform(
DOMPointReadOnly.fromPoint({ DOMPointReadOnly.fromPoint({
x : 0, x : 0,
y : 1, y : 1,
...@@ -50,10 +50,10 @@ let testFunction = function(session, fakeDeviceController, t) { ...@@ -50,10 +50,10 @@ let testFunction = function(session, fakeDeviceController, t) {
z : 0, z : 0,
w : Math.cos(radians / 2) w : Math.cos(radians / 2)
}) })
); ));
// Rotate 90 degrees about z axis, then move 1 meter along x axis. // Rotate 90 degrees about z axis, then move 1 meter along x axis.
space2.originOffset = new XRRigidTransform( space2 = space2.getOffsetReferenceSpace(new XRRigidTransform(
DOMPointReadOnly.fromPoint({ DOMPointReadOnly.fromPoint({
x : 1, x : 1,
y : 0, y : 0,
...@@ -66,7 +66,7 @@ let testFunction = function(session, fakeDeviceController, t) { ...@@ -66,7 +66,7 @@ let testFunction = function(session, fakeDeviceController, t) {
z : Math.sin(radians / 2), z : Math.sin(radians / 2),
w : Math.cos(radians / 2) w : Math.cos(radians / 2)
}) })
); ));
let space1_from_space2 = xrFrame.getPose(space1, space2); let space1_from_space2 = xrFrame.getPose(space1, space2);
const EXPECTED_POSE_MATRIX = [ const EXPECTED_POSE_MATRIX = [
......
...@@ -10626,10 +10626,9 @@ interface XRRay ...@@ -10626,10 +10626,9 @@ interface XRRay
interface XRReferenceSpace : XRSpace interface XRReferenceSpace : XRSpace
attribute @@toStringTag attribute @@toStringTag
getter onreset getter onreset
getter originOffset
method constructor method constructor
method getOffsetReferenceSpace
setter onreset setter onreset
setter originOffset
interface XRReferenceSpaceEvent : Event interface XRReferenceSpaceEvent : Event
attribute @@toStringTag attribute @@toStringTag
getter referenceSpace getter referenceSpace
......
...@@ -63,13 +63,19 @@ let testFunction = ...@@ -63,13 +63,19 @@ let testFunction =
input_source.pointerOffset = POINTER_OFFSET_WITH_ROTATION; input_source.pointerOffset = POINTER_OFFSET_WITH_ROTATION;
fakeDeviceController.addInputSource(input_source); fakeDeviceController.addInputSource(input_source);
const RADIANS_90D = Math.PI / 2;
const EXPECTED_VIEW_MATRIX_1 = [0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, -1, -1, -1, 1]; const EXPECTED_VIEW_MATRIX_1 = [0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, -1, -1, -1, 1];
const EXPECTED_GRIP_MATRIX_1 = [0, 0, -1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 2, 3, 1]; const EXPECTED_GRIP_MATRIX_1 = [0, 0, -1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 2, 3, 1];
const EXPECTED_RAY_MATRIX_1 = [0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 2, 2, 1, 1]; const EXPECTED_RAY_MATRIX_1 = [0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 2, 2, 1, 1];
const EXPECTED_VIEW_MATRIX_2 = [0.7419161200523376, 0.6434604525566101, -0.1884651929140091, 0, -0.1884651929140091, -0.06961867958307266, -0.9796091318130493, 0, -0.6434604525566101, 0.7623069882392883, 0.06961867958307266, 0, -4, 4, 9, 1]; const EXPECTED_VIEW_MATRIX_2 = [0, 0, 1, 0, 0, 1, 0, 0, -1, 0, 0, 0, -4, 4, 9, 1];
const EXPECTED_GRIP_MATRIX_2 = [-0.6434604525566101, 0.06961867958307266, -0.7623069882392883, 0, 0.7419161200523376, -0.1884651929140091, -0.6434604525566101, 0, -0.1884651929140091, -0.9796091318130493, 0.06961867958307266, 0, 4.118846416473389, 8.01339340209961, -5.368484020233154, 1]; const EXPECTED_GRIP_MATRIX_2 = [0, -1, 0, 0, 0, 0, -1, 0, 1, 0, 0, 0, -9, -2, -5, 1];
const EXPECTED_RAY_MATRIX_2 = [0.7419161200523376, -0.1884651929140091, -0.6434604525566101, 0, 0.6434604525566101, -0.06961867958307266, 0.7623069882392883, 0, -0.1884651929140091, -0.9796091318130493, 0.06961867958307266, 0, 2.643460512161255, 7.1730217933654785, -6.823479652404785, 1]; const EXPECTED_RAY_MATRIX_2 = [0, 0, -1, 0, 0, 1, 0, 0, 1, 0, 0, 0, -8, -4, -5, 1];
const EXPECTED_VIEW_MATRIX_3 = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -4, 6, 14, 1];
const EXPECTED_GRIP_MATRIX_3 = [0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 5, -4, -14, 1];
const EXPECTED_RAY_MATRIX_3 = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 5, -6, -13, 1];
// Must have a reference space to get input poses. eye-level doesn't apply // Must have a reference space to get input poses. eye-level doesn't apply
// any transforms to the given matrix. // any transforms to the given matrix.
...@@ -77,7 +83,7 @@ let testFunction = ...@@ -77,7 +83,7 @@ let testFunction =
function OnFrame(time, frame) { function OnFrame(time, frame) {
let source = session.getInputSources()[0]; let source = session.getInputSources()[0];
function CheckState(expected_view_matrix, expected_grip_matrix, expected_ray_matrix) { function CheckState(referenceSpace, expected_view_matrix, expected_grip_matrix, expected_ray_matrix) {
let pose = frame.getViewerPose(referenceSpace); let pose = frame.getViewerPose(referenceSpace);
let grip_pose = frame.getPose(source.gripSpace, referenceSpace); let grip_pose = frame.getPose(source.gripSpace, referenceSpace);
let input_pose = frame.getPose(source.targetRaySpace, referenceSpace); let input_pose = frame.getPose(source.targetRaySpace, referenceSpace);
...@@ -91,25 +97,38 @@ let testFunction = ...@@ -91,25 +97,38 @@ let testFunction =
assert_matrices_approx_equal(ray_matrix, expected_ray_matrix); assert_matrices_approx_equal(ray_matrix, expected_ray_matrix);
} }
CheckState(EXPECTED_VIEW_MATRIX_1, EXPECTED_GRIP_MATRIX_1, EXPECTED_RAY_MATRIX_1); CheckState(referenceSpace, EXPECTED_VIEW_MATRIX_1, EXPECTED_GRIP_MATRIX_1, EXPECTED_RAY_MATRIX_1);
const new_position = { const new_position1 = {
x : 10, x: 10,
y : -3, y: -3,
z : 5 z: 5,
};
const new_orientation1 = {
x: Math.sin(RADIANS_90D / 2),
y: 0,
z: 0,
w: Math.cos(RADIANS_90D / 2),
}; };
const degrees_45 = Math.PI / 4; referenceSpace = referenceSpace.getOffsetReferenceSpace(new XRRigidTransform(new_position1, new_orientation1));
const rotation = Math.sin(degrees_45 / 2); CheckState(referenceSpace, EXPECTED_VIEW_MATRIX_2, EXPECTED_GRIP_MATRIX_2, EXPECTED_RAY_MATRIX_2);
const new_orientation = {
x : rotation, const new_position2 = {
y : rotation * -1, x: 5,
z : rotation * 3, y: 2,
w : Math.cos(degrees_45 / 2) z: 0,
};
const new_orientation2 = {
x: 0,
y: Math.sin(RADIANS_90D / 2),
z: 0,
w: Math.cos(RADIANS_90D / 2),
}; };
referenceSpace.originOffset = new XRRigidTransform(new_position, new_orientation); referenceSpace = referenceSpace.getOffsetReferenceSpace(new XRRigidTransform(new_position2, new_orientation2));
CheckState(EXPECTED_VIEW_MATRIX_2, EXPECTED_GRIP_MATRIX_2, EXPECTED_RAY_MATRIX_2); CheckState(referenceSpace, EXPECTED_VIEW_MATRIX_3, EXPECTED_GRIP_MATRIX_3, EXPECTED_RAY_MATRIX_3);
resolve(); resolve();
} }
......
...@@ -429,8 +429,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ...@@ -429,8 +429,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{x: invPosition[0], y: invPosition[1], z: invPosition[2]}, {x: invPosition[0], y: invPosition[1], z: invPosition[2]},
{x: invOrientation[0], y: invOrientation[1], z: invOrientation[2], w: invOrientation[3]}); {x: invOrientation[0], y: invOrientation[1], z: invOrientation[2], w: invOrientation[3]});
// Update originOffset to use the teleported player position and orientation // Update refSpace to use a new originOffset with the teleported player position and orientation
refSpace.originOffset = xform; refSpace = refSpace.getOffsetReferenceSpace(xform);
console.log('teleport to', trackingSpaceOriginInWorldSpace); console.log('teleport to', trackingSpaceOriginInWorldSpace);
} }
......
...@@ -173,8 +173,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ...@@ -173,8 +173,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
// right level. (Here we're moving it 1.6 meters, which should // right level. (Here we're moving it 1.6 meters, which should
// *very* roughly align us with the eye height of an "average" // *very* roughly align us with the eye height of an "average"
// adult human.) // adult human.)
refSpace.originOffset = new XRRigidTransform({y: -1.6}); return refSpace.getOffsetReferenceSpace(new XRRigidTransform({y: -1.6}));
return refSpace;
}); });
} else { } else {
throw e; throw e;
......
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