blob: 3908681c92dee5e63f84675b5820d275a56a34ed [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "third_party/blink/renderer/modules/xr/xr_space.h"
#include "third_party/blink/renderer/modules/event_target_modules.h"
#include "third_party/blink/renderer/modules/xr/xr_input_source.h"
#include "third_party/blink/renderer/modules/xr/xr_pose.h"
#include "third_party/blink/renderer/modules/xr/xr_rigid_transform.h"
#include "third_party/blink/renderer/modules/xr/xr_session.h"
namespace blink {
XRSpace::XRSpace(XRSession* session) : session_(session) {}
XRSpace::~XRSpace() = default;
std::unique_ptr<TransformationMatrix> XRSpace::MojoFromSpace() {
// The base XRSpace does not have any relevant information, so can't determine
// a transform here.
return nullptr;
}
std::unique_ptr<TransformationMatrix> XRSpace::DefaultViewerPose() {
return nullptr;
}
std::unique_ptr<TransformationMatrix> XRSpace::SpaceFromMojo(
const TransformationMatrix& mojo_from_viewer) {
return nullptr;
}
std::unique_ptr<TransformationMatrix> XRSpace::SpaceFromViewer(
const TransformationMatrix& mojo_from_viewer) {
return nullptr;
}
std::unique_ptr<TransformationMatrix> XRSpace::SpaceFromInputForViewer(
const TransformationMatrix& mojo_from_input,
const TransformationMatrix& mojo_from_viewer) {
return nullptr;
}
TransformationMatrix XRSpace::OriginOffsetMatrix() {
TransformationMatrix identity;
return identity;
}
TransformationMatrix XRSpace::InverseOriginOffsetMatrix() {
TransformationMatrix identity;
return identity;
}
XRPose* XRSpace::getPose(XRSpace* other_space,
const TransformationMatrix* base_pose_matrix) {
std::unique_ptr<TransformationMatrix> mojo_from_space = MojoFromSpace();
if (!mojo_from_space) {
return nullptr;
}
// Rigid transforms should always be invertible.
DCHECK(mojo_from_space->IsInvertible());
TransformationMatrix space_from_mojo = mojo_from_space->Inverse();
std::unique_ptr<TransformationMatrix> mojo_from_other =
other_space->MojoFromSpace();
if (!mojo_from_other) {
return nullptr;
}
// TODO(crbug.com/969133): Update how EmulatedPosition is determined here once
// spec issue https://github.com/immersive-web/webxr/issues/534 has been
// resolved.
TransformationMatrix space_from_other =
space_from_mojo.Multiply(*mojo_from_other);
return MakeGarbageCollected<XRPose>(space_from_other,
session()->EmulatedPosition());
}
std::unique_ptr<TransformationMatrix>
XRSpace::SpaceFromViewerWithDefaultAndOffset(
const TransformationMatrix* mojo_from_viewer) {
std::unique_ptr<TransformationMatrix> space_from_viewer;
// If we don't have a valid base pose, request the reference space's default
// viewer pose. Most common when tracking is lost.
if (mojo_from_viewer) {
space_from_viewer = SpaceFromViewer(*mojo_from_viewer);
} else {
space_from_viewer = DefaultViewerPose();
}
// Can only update an XRViewerPose's views with an invertible matrix.
if (!space_from_viewer || !space_from_viewer->IsInvertible()) {
return nullptr;
}
// Account for any changes made to the reference space's origin offset so that
// things like teleportation works.
//
// This is offset_from_viewer = offset_from_space * space_from_viewer,
// where offset_from_viewer = inverse(viewer_from_offset).
// TODO(https://crbug.com/1008466): move originOffset to separate class?
return std::make_unique<TransformationMatrix>(
InverseOriginOffsetMatrix().Multiply(*space_from_viewer));
}
ExecutionContext* XRSpace::GetExecutionContext() const {
return session()->GetExecutionContext();
}
const AtomicString& XRSpace::InterfaceName() const {
return event_target_names::kXRSpace;
}
base::Optional<XRNativeOriginInformation> XRSpace::NativeOrigin() const {
return base::nullopt;
}
void XRSpace::Trace(blink::Visitor* visitor) {
visitor->Trace(session_);
ScriptWrappable::Trace(visitor);
EventTargetWithInlineData::Trace(visitor);
}
} // namespace blink