Commit f94c4688 authored by Piotr Bialecki's avatar Piotr Bialecki Committed by Commit Bot

Create specific type for Poses instead of using VRPose

Currently, we extensively use VRPose to surface data to blink even for
the entities where additional VRPose fields make no sense. In addition,
VRPose allows for null position / orientation even though those
entities will always have position and orientation known.

I have decided against using gfx.mojom.Transform to surface that
information since it allows for transforms that perform more than just
translation and rotation and we would have to perform additional checks
to enforce that no additional components are present.

Bug: 1013229
Change-Id: I517a5b33aa905ca3c29e8b742c6767f2b6eb03bd
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1887752
Commit-Queue: Piotr Bialecki <bialpio@chromium.org>
Auto-Submit: Piotr Bialecki <bialpio@chromium.org>
Reviewed-by: default avatarDaniel Cheng <dcheng@chromium.org>
Reviewed-by: default avatarAlexander Cooper <alcooper@chromium.org>
Cr-Commit-Position: refs/heads/master@{#714288}
parent 544412a4
......@@ -63,13 +63,15 @@ class ArCore {
mojom::XRRayPtr ray) = 0;
virtual mojom::XRHitTestSubscriptionResultsDataPtr
GetHitTestSubscriptionResults(const device::mojom::VRPosePtr& pose) = 0;
GetHitTestSubscriptionResults(
const gfx::Transform& mojo_from_viewer,
const base::Optional<std::vector<mojom::XRInputSourceStatePtr>>&
maybe_input_state) = 0;
virtual void UnsubscribeFromHitTest(uint64_t subscription_id) = 0;
virtual base::Optional<uint64_t> CreateAnchor(
const mojom::VRPosePtr& pose) = 0;
virtual base::Optional<uint64_t> CreateAnchor(const mojom::VRPosePtr& pose,
virtual base::Optional<uint64_t> CreateAnchor(const mojom::PosePtr& pose) = 0;
virtual base::Optional<uint64_t> CreateAnchor(const mojom::PosePtr& pose,
uint64_t plane_id) = 0;
virtual void DetachAnchor(uint64_t anchor_id) = 0;
......
......@@ -22,6 +22,7 @@
#include "chrome/browser/android/vr/arcore_device/ar_image_transport.h"
#include "chrome/browser/android/vr/arcore_device/arcore_impl.h"
#include "chrome/browser/android/vr/arcore_device/arcore_session_utils.h"
#include "chrome/browser/android/vr/arcore_device/type_converters.h"
#include "chrome/browser/android/vr/web_xr_presentation_state.h"
#include "device/vr/public/mojom/vr_service.mojom.h"
#include "gpu/ipc/common/gpu_memory_buffer_impl_android_hardware_buffer.h"
......@@ -697,7 +698,7 @@ void ArCoreGl::UnsubscribeFromHitTest(uint64_t subscription_id) {
arcore_->UnsubscribeFromHitTest(subscription_id);
}
void ArCoreGl::CreateAnchor(mojom::VRPosePtr anchor_pose,
void ArCoreGl::CreateAnchor(mojom::PosePtr anchor_pose,
CreateAnchorCallback callback) {
DVLOG(2) << __func__;
......@@ -711,7 +712,7 @@ void ArCoreGl::CreateAnchor(mojom::VRPosePtr anchor_pose,
}
}
void ArCoreGl::CreatePlaneAnchor(mojom::VRPosePtr anchor_pose,
void ArCoreGl::CreatePlaneAnchor(mojom::PosePtr anchor_pose,
uint64_t plane_id,
CreatePlaneAnchorCallback callback) {
DVLOG(2) << __func__;
......@@ -763,7 +764,9 @@ void ArCoreGl::ProcessFrame(
// Get results for hit test subscriptions.
frame_data->hit_test_subscription_results =
arcore_->GetHitTestSubscriptionResults(frame_data->pose);
arcore_->GetHitTestSubscriptionResults(
mojo::ConvertTo<gfx::Transform>(frame_data->pose),
frame_data->pose->input_state);
}
// Get anchors data, including anchors created this frame.
......
......@@ -122,9 +122,9 @@ class ArCoreGl : public mojom::XRFrameDataProvider,
void UnsubscribeFromHitTest(uint64_t subscription_id) override;
void CreateAnchor(mojom::VRPosePtr anchor_pose,
void CreateAnchor(mojom::PosePtr anchor_pose,
CreateAnchorCallback callback) override;
void CreatePlaneAnchor(mojom::VRPosePtr anchor_pose,
void CreatePlaneAnchor(mojom::PosePtr anchor_pose,
uint64_t plane_id,
CreatePlaneAnchorCallback callback) override;
......
......@@ -22,41 +22,55 @@ using base::android::JavaRef;
namespace {
device::mojom::VRPosePtr GetMojomPoseFromArPose(
ArSession* session,
device::internal::ScopedArCoreObject<ArPose*> pose) {
float pose_raw[7]; // 7 = orientation(4) + position(3).
ArPose_getPoseRaw(session, pose.get(), pose_raw);
std::pair<gfx::Quaternion, gfx::Point3F> GetPositionAndOrientationFromArPose(
const ArSession* session,
const device::internal::ScopedArCoreObject<ArPose*>& pose) {
std::array<float, 7> pose_raw; // 7 = orientation(4) + position(3).
ArPose_getPoseRaw(session, pose.get(), pose_raw.data());
return {gfx::Quaternion(pose_raw[0], pose_raw[1], pose_raw[2], pose_raw[3]),
gfx::Point3F(pose_raw[4], pose_raw[5], pose_raw[6])};
}
// Helper, returns new VRPosePtr with position and orientation set to match the
// position and orientation of passed in |pose|.
device::mojom::VRPosePtr GetMojomVRPoseFromArPose(
const ArSession* session,
const device::internal::ScopedArCoreObject<ArPose*>& pose) {
device::mojom::VRPosePtr result = device::mojom::VRPose::New();
std::tie(result->orientation, result->position) =
GetPositionAndOrientationFromArPose(session, pose);
return result;
}
result->orientation =
gfx::Quaternion(pose_raw[0], pose_raw[1], pose_raw[2], pose_raw[3]);
result->position = gfx::Point3F(pose_raw[4], pose_raw[5], pose_raw[6]);
// Helper, returns new PosePtr with position and orientation set to match the
// position and orientation of passed in |pose|.
device::mojom::PosePtr GetMojomPoseFromArPose(
const ArSession* session,
const device::internal::ScopedArCoreObject<ArPose*>& pose) {
device::mojom::PosePtr result = device::mojom::Pose::New();
std::tie(result->orientation, result->position) =
GetPositionAndOrientationFromArPose(session, pose);
return result;
}
// Helper, creates new ArPose* with position and orientation set to match the
// position and orientation of passed in |pose|.
device::internal::ScopedArCoreObject<ArPose*> GetArPoseFromMojomPose(
ArSession* session,
const device::mojom::VRPosePtr& pose) {
const device::mojom::PosePtr& pose) {
float pose_raw[7] = {}; // 7 = orientation(4) + position(3).
if (pose->orientation) {
pose_raw[0] = pose->orientation->x();
pose_raw[1] = pose->orientation->y();
pose_raw[2] = pose->orientation->z();
pose_raw[3] = pose->orientation->w();
} else {
// Only need to set the .w to 1.
pose_raw[3] = 1;
}
pose_raw[0] = pose->orientation.x();
pose_raw[1] = pose->orientation.y();
pose_raw[2] = pose->orientation.z();
pose_raw[3] = pose->orientation.w();
if (pose->position) {
pose_raw[4] = pose->position->x();
pose_raw[5] = pose->position->y();
pose_raw[6] = pose->position->z();
}
pose_raw[4] = pose->position.x();
pose_raw[5] = pose->position.y();
pose_raw[6] = pose->position.z();
device::internal::ScopedArCoreObject<ArPose*> result;
......@@ -230,7 +244,8 @@ mojom::VRPosePtr ArCoreImpl::Update(bool* camera_updated) {
ArCamera_getDisplayOrientedPose(arcore_session_.get(), arcore_camera.get(),
arcore_pose.get());
return GetMojomPoseFromArPose(arcore_session_.get(), std::move(arcore_pose));
return GetMojomVRPoseFromArPose(arcore_session_.get(),
std::move(arcore_pose));
}
void ArCoreImpl::EnsureArCorePlanesList() {
......@@ -320,7 +335,7 @@ std::vector<mojom::XRAnchorDataPtr> ArCoreImpl::GetUpdatedAnchorsData() {
arcore_session_.get(), nullptr,
internal::ScopedArCoreObject<ArPose*>::Receiver(anchor_pose).get());
ArAnchor_getPose(arcore_session_.get(), ar_anchor, anchor_pose.get());
mojom::VRPosePtr pose =
mojom::PosePtr pose =
GetMojomPoseFromArPose(arcore_session_.get(), std::move(anchor_pose));
// ID
......@@ -411,7 +426,7 @@ std::vector<mojom::XRPlaneDataPtr> ArCoreImpl::GetUpdatedPlanesData() {
arcore_session_.get(), nullptr,
internal::ScopedArCoreObject<ArPose*>::Receiver(plane_pose).get());
ArPlane_getCenterPose(arcore_session_.get(), ar_plane, plane_pose.get());
mojom::VRPosePtr pose =
mojom::PosePtr pose =
GetMojomPoseFromArPose(arcore_session_.get(), std::move(plane_pose));
// polygon
......@@ -615,7 +630,9 @@ base::Optional<uint64_t> ArCoreImpl::SubscribeToHitTest(
mojom::XRHitTestSubscriptionResultsDataPtr
ArCoreImpl::GetHitTestSubscriptionResults(
const device::mojom::VRPosePtr& pose) {
const gfx::Transform& mojo_from_viewer,
const base::Optional<std::vector<mojom::XRInputSourceStatePtr>>&
maybe_input_state) {
mojom::XRHitTestSubscriptionResultsDataPtr result =
mojom::XRHitTestSubscriptionResultsData::New();
......@@ -623,7 +640,8 @@ ArCoreImpl::GetHitTestSubscriptionResults(
// First, check if we can find the current transformation for a ray. If not,
// skip processing this subscription.
auto maybe_mojo_from_native_origin = GetMojoFromNativeOrigin(
subscription_id_and_data.second.native_origin_information, pose);
subscription_id_and_data.second.native_origin_information,
mojo_from_viewer, maybe_input_state);
if (!maybe_mojo_from_native_origin) {
continue;
......@@ -661,7 +679,7 @@ ArCoreImpl::GetHitTestSubscriptionResult(
base::Optional<gfx::Transform> ArCoreImpl::GetMojoFromReferenceSpace(
device::mojom::XRReferenceSpaceCategory category,
const device::mojom::VRPosePtr& mojo_from_viewer) {
const gfx::Transform& mojo_from_viewer) {
switch (category) {
case device::mojom::XRReferenceSpaceCategory::LOCAL:
return gfx::Transform{};
......@@ -671,7 +689,7 @@ base::Optional<gfx::Transform> ArCoreImpl::GetMojoFromReferenceSpace(
return result;
}
case device::mojom::XRReferenceSpaceCategory::VIEWER:
return mojo::ConvertTo<gfx::Transform>(mojo_from_viewer);
return mojo_from_viewer;
case device::mojom::XRReferenceSpaceCategory::BOUNDED_FLOOR:
return base::nullopt;
case device::mojom::XRReferenceSpaceCategory::UNBOUNDED:
......@@ -681,27 +699,27 @@ base::Optional<gfx::Transform> ArCoreImpl::GetMojoFromReferenceSpace(
base::Optional<gfx::Transform> ArCoreImpl::GetMojoFromNativeOrigin(
const mojom::XRNativeOriginInformationPtr& native_origin_information,
const device::mojom::VRPosePtr& mojo_from_viewer) {
const gfx::Transform& mojo_from_viewer,
const base::Optional<std::vector<mojom::XRInputSourceStatePtr>>&
maybe_input_state) {
if (native_origin_information->is_input_source_id()) {
if (!mojo_from_viewer->input_state) {
if (!maybe_input_state) {
return base::nullopt;
}
// Linear search should be fine for ARCore device as it only has one input
// source (for now).
for (auto& input_source_state : *mojo_from_viewer->input_state) {
for (auto& input_source_state : *maybe_input_state) {
if (input_source_state->source_id ==
native_origin_information->get_input_source_id()) {
if (!input_source_state->description->input_from_pointer) {
return base::nullopt;
}
auto view_from_pointer =
auto viewer_from_pointer =
*input_source_state->description->input_from_pointer;
auto mojo_from_view = mojo::ConvertTo<gfx::Transform>(mojo_from_viewer);
return mojo_from_view * view_from_pointer;
return mojo_from_viewer * viewer_from_pointer;
}
}
......@@ -726,7 +744,7 @@ base::Optional<gfx::Transform> ArCoreImpl::GetMojoFromNativeOrigin(
arcore_session_.get(), nullptr,
internal::ScopedArCoreObject<ArPose*>::Receiver(ar_pose).get());
ArPlane_getCenterPose(arcore_session_.get(), plane, ar_pose.get());
mojom::VRPosePtr mojo_pose =
mojom::PosePtr mojo_pose =
GetMojomPoseFromArPose(arcore_session_.get(), std::move(ar_pose));
return mojo::ConvertTo<gfx::Transform>(mojo_pose);
......@@ -744,7 +762,7 @@ base::Optional<gfx::Transform> ArCoreImpl::GetMojoFromNativeOrigin(
ArAnchor_getPose(arcore_session_.get(), anchor_it->second.get(),
ar_pose.get());
mojom::VRPosePtr mojo_pose =
mojom::PosePtr mojo_pose =
GetMojomPoseFromArPose(arcore_session_.get(), std::move(ar_pose));
return mojo::ConvertTo<gfx::Transform>(mojo_pose);
......@@ -911,7 +929,7 @@ bool ArCoreImpl::RequestHitTest(
}
base::Optional<uint64_t> ArCoreImpl::CreateAnchor(
const device::mojom::VRPosePtr& pose) {
const device::mojom::PosePtr& pose) {
DCHECK(pose);
auto ar_pose = GetArPoseFromMojomPose(arcore_session_.get(), pose);
......@@ -935,7 +953,7 @@ base::Optional<uint64_t> ArCoreImpl::CreateAnchor(
}
base::Optional<uint64_t> ArCoreImpl::CreateAnchor(
const device::mojom::VRPosePtr& pose,
const device::mojom::PosePtr& pose,
uint64_t plane_id) {
DCHECK(pose);
......
......@@ -142,13 +142,15 @@ class ArCoreImpl : public ArCore {
mojom::XRRayPtr ray) override;
mojom::XRHitTestSubscriptionResultsDataPtr GetHitTestSubscriptionResults(
const device::mojom::VRPosePtr& pose) override;
const gfx::Transform& mojo_from_viewer,
const base::Optional<std::vector<mojom::XRInputSourceStatePtr>>&
maybe_input_state) override;
void UnsubscribeFromHitTest(uint64_t subscription_id) override;
base::Optional<uint64_t> CreateAnchor(
const device::mojom::VRPosePtr& pose) override;
base::Optional<uint64_t> CreateAnchor(const device::mojom::VRPosePtr& pose,
const device::mojom::PosePtr& pose) override;
base::Optional<uint64_t> CreateAnchor(const device::mojom::PosePtr& pose,
uint64_t plane_id) override;
void DetachAnchor(uint64_t anchor_id) override;
......@@ -231,11 +233,13 @@ class ArCoreImpl : public ArCore {
base::Optional<gfx::Transform> GetMojoFromNativeOrigin(
const mojom::XRNativeOriginInformationPtr& native_origin_information,
const device::mojom::VRPosePtr& pose);
const gfx::Transform& mojo_from_viewer,
const base::Optional<std::vector<mojom::XRInputSourceStatePtr>>&
maybe_input_state);
base::Optional<gfx::Transform> GetMojoFromReferenceSpace(
device::mojom::XRReferenceSpaceCategory category,
const device::mojom::VRPosePtr& pose);
const gfx::Transform& mojo_from_viewer);
// Executes |fn| for each still tracked, non-subsumed plane present in
// |arcore_planes_|.
......
......@@ -220,7 +220,9 @@ base::Optional<uint64_t> FakeArCore::SubscribeToHitTest(
mojom::XRHitTestSubscriptionResultsDataPtr
FakeArCore::GetHitTestSubscriptionResults(
const device::mojom::VRPosePtr& pose) {
const gfx::Transform& mojo_from_viewer,
const base::Optional<std::vector<mojom::XRInputSourceStatePtr>>&
maybe_input_state) {
return nullptr;
}
......@@ -232,7 +234,7 @@ mojom::XRPlaneDetectionDataPtr FakeArCore::GetDetectedPlanesData() {
std::vector<mojom::XRPlaneDataPtr> result;
// 1m ahead of the origin, neutral orientation facing forward.
mojom::VRPosePtr pose = mojom::VRPose::New();
mojom::PosePtr pose = mojom::Pose::New();
pose->position = gfx::Point3F(0.0, 0.0, -1.0);
pose->orientation = gfx::Quaternion();
......@@ -255,7 +257,7 @@ mojom::XRAnchorsDataPtr FakeArCore::GetAnchorsData() {
std::vector<uint64_t> result_ids;
for (auto& anchor_id_and_data : anchors_) {
mojom::VRPosePtr pose = mojom::VRPose::New();
mojom::PosePtr pose = mojom::Pose::New();
pose->position = anchor_id_and_data.second.position;
pose->orientation = anchor_id_and_data.second.orientation;
......@@ -267,28 +269,16 @@ mojom::XRAnchorsDataPtr FakeArCore::GetAnchorsData() {
return mojom::XRAnchorsData::New(std::move(result_ids), std::move(result));
}
base::Optional<uint64_t> FakeArCore::CreateAnchor(const mojom::VRPosePtr& pose,
base::Optional<uint64_t> FakeArCore::CreateAnchor(const mojom::PosePtr& pose,
uint64_t plane_id) {
// TODO(992035): Fix this when implementing tests.
return CreateAnchor(pose);
}
base::Optional<uint64_t> FakeArCore::CreateAnchor(
const mojom::VRPosePtr& pose) {
base::Optional<uint64_t> FakeArCore::CreateAnchor(const mojom::PosePtr& pose) {
DCHECK(pose);
gfx::Point3F position =
pose->position ? gfx::Point3F(pose->position->x(), pose->position->y(),
pose->position->z())
: gfx::Point3F();
gfx::Quaternion orientation =
pose->orientation
? gfx::Quaternion(pose->orientation->x(), pose->orientation->y(),
pose->orientation->z(), pose->orientation->w())
: gfx::Quaternion(0, 0, 0, 1);
anchors_[next_id_] = {position, orientation};
anchors_[next_id_] = {pose->position, pose->orientation};
int32_t anchor_id = next_id_;
next_id_++;
......
......@@ -45,7 +45,9 @@ class FakeArCore : public ArCore {
mojom::XRRayPtr ray) override;
mojom::XRHitTestSubscriptionResultsDataPtr GetHitTestSubscriptionResults(
const device::mojom::VRPosePtr& pose) override;
const gfx::Transform& mojo_from_viewer,
const base::Optional<std::vector<mojom::XRInputSourceStatePtr>>&
maybe_input_state) override;
void UnsubscribeFromHitTest(uint64_t subscription_id) override;
......@@ -53,8 +55,8 @@ class FakeArCore : public ArCore {
mojom::XRAnchorsDataPtr GetAnchorsData() override;
base::Optional<uint64_t> CreateAnchor(
const device::mojom::VRPosePtr& pose) override;
base::Optional<uint64_t> CreateAnchor(const device::mojom::VRPosePtr& pose,
const device::mojom::PosePtr& pose) override;
base::Optional<uint64_t> CreateAnchor(const device::mojom::PosePtr& pose,
uint64_t plane_id) override;
void DetachAnchor(uint64_t anchor_id) override;
......
......@@ -36,4 +36,16 @@ gfx::Transform TypeConverter<gfx::Transform, device::mojom::VRPosePtr>::Convert(
return gfx::ComposeTransform(decomposed);
}
gfx::Transform TypeConverter<gfx::Transform, device::mojom::PosePtr>::Convert(
const device::mojom::PosePtr& pose) {
gfx::DecomposedTransform decomposed;
decomposed.quaternion = pose->orientation;
decomposed.translate[0] = pose->position.x();
decomposed.translate[1] = pose->position.y();
decomposed.translate[2] = pose->position.z();
return gfx::ComposeTransform(decomposed);
}
} // namespace mojo
......@@ -21,6 +21,11 @@ struct TypeConverter<gfx::Transform, device::mojom::VRPosePtr> {
static gfx::Transform Convert(const device::mojom::VRPosePtr& pose);
};
template <>
struct TypeConverter<gfx::Transform, device::mojom::PosePtr> {
static gfx::Transform Convert(const device::mojom::PosePtr& pose);
};
} // namespace mojo
#endif // CHROME_BROWSER_ANDROID_VR_ARCORE_DEVICE_TYPE_CONVERTERS_H_
......@@ -208,6 +208,13 @@ struct VRPose {
bool pose_reset;
};
// An entity's pose. Used by entities for which both position and orientation is
// always known (e.g. anchors, planes).
struct Pose {
gfx.mojom.Quaternion orientation;
gfx.mojom.Point3F position;
};
struct XRRay {
gfx.mojom.Point3F origin;
gfx.mojom.Vector3dF direction;
......@@ -328,7 +335,7 @@ struct XRPlaneData {
// Pose of the plane's center. Defines new coordinate space.
// Y axis of the coordinate space describes plane's normal, the rotation of
// X and Z around the Y axis is arbitrary.
VRPose pose;
Pose pose;
// Vertices of 2D convex polygon approximating the plane.
array<XRPlanePointData> polygon;
......@@ -358,7 +365,7 @@ struct XRAnchorData {
uint64 id;
// Pose of the anchor.
VRPose pose;
Pose pose;
};
// Struct containing information about all tracked & updated anchors in a given
......@@ -554,8 +561,8 @@ interface XREnvironmentIntegrationProvider {
// Issues a request to create an anchor attached to a session.
// |result| will contain status code of the request. |anchor_id| will be valid
// only if the |result| is SUCCESS.
CreateAnchor(VRPose anchor_pose) => (CreateAnchorResult result,
uint64 anchor_id);
CreateAnchor(Pose anchor_pose) => (CreateAnchorResult result,
uint64 anchor_id);
// TODO(https://crbug.com/657632): Switch anchor_id to nullable integer once
// that's available. This will allow us to remove CreateAnchorResult if we're
// not interested in obtaining detailed error information from the device.
......@@ -563,7 +570,7 @@ interface XREnvironmentIntegrationProvider {
// Issues a request to create an anchor attached to a plane.
// |result| will contain status code of the request. |anchor_id| will be valid
// only if the |result| is SUCCESS.
CreatePlaneAnchor(VRPose anchor_pose, uint64 plane_id) =>
CreatePlaneAnchor(Pose anchor_pose, uint64 plane_id) =>
(CreateAnchorResult result, uint64 anchor_id);
// TODO(https://crbug.com/657632): Ditto - make anchor_id a nullable integer..
......
......@@ -57,6 +57,35 @@ TypeConverter<blink::TransformationMatrix, device::mojom::blink::VRPosePtr>::
return result;
}
blink::TransformationMatrix
TypeConverter<blink::TransformationMatrix, device::mojom::blink::PosePtr>::
Convert(const device::mojom::blink::PosePtr& pose) {
DCHECK(pose);
blink::TransformationMatrix result;
blink::TransformationMatrix::DecomposedType decomp = {};
decomp.perspective_w = 1;
decomp.scale_x = 1;
decomp.scale_y = 1;
decomp.scale_z = 1;
// TODO(https://crbug.com/929841): Remove negation once the bug is fixed.
gfx::Quaternion quat = pose->orientation.inverse();
decomp.quaternion_x = quat.x();
decomp.quaternion_y = quat.y();
decomp.quaternion_z = quat.z();
decomp.quaternion_w = quat.w();
decomp.translate_x = pose->position.X();
decomp.translate_y = pose->position.Y();
decomp.translate_z = pose->position.Z();
result.Recompose(decomp);
return result;
}
blink::HeapVector<blink::Member<blink::DOMPointReadOnly>>
TypeConverter<blink::HeapVector<blink::Member<blink::DOMPointReadOnly>>,
WTF::Vector<device::mojom::blink::XRPlanePointDataPtr>>::
......
......@@ -26,6 +26,13 @@ struct TypeConverter<blink::TransformationMatrix,
const device::mojom::blink::VRPosePtr& pose);
};
template <>
struct TypeConverter<blink::TransformationMatrix,
device::mojom::blink::PosePtr> {
static blink::TransformationMatrix Convert(
const device::mojom::blink::PosePtr& pose);
};
template <>
struct TypeConverter<blink::HeapVector<blink::Member<blink::DOMPointReadOnly>>,
WTF::Vector<device::mojom::blink::XRPlanePointDataPtr>> {
......
......@@ -505,19 +505,17 @@ ScriptPromise XRSession::CreateAnchor(ScriptState* script_state,
return ScriptPromise();
}
device::mojom::blink::VRPosePtr pose_ptr =
device::mojom::blink::VRPose::New();
pose_ptr->orientation =
// TODO(https://crbug.com/929841): Remove negation in quaternion once the bug
// is fixed.
device::mojom::blink::PosePtr pose_ptr = device::mojom::blink::Pose::New(
gfx::Quaternion(-decomposed.quaternion_x, -decomposed.quaternion_y,
-decomposed.quaternion_z, decomposed.quaternion_w);
pose_ptr->position = blink::FloatPoint3D(
decomposed.translate_x, decomposed.translate_y, decomposed.translate_z);
-decomposed.quaternion_z, decomposed.quaternion_w),
blink::FloatPoint3D(decomposed.translate_x, decomposed.translate_y,
decomposed.translate_z));
DVLOG(3) << __func__
<< ": pose_ptr->orientation = " << pose_ptr->orientation->ToString()
<< ", pose_ptr->position = [" << pose_ptr->position->X() << ", "
<< pose_ptr->position->Y() << ", " << pose_ptr->position->Z() << "]";
<< ": pose_ptr->orientation = " << pose_ptr->orientation.ToString()
<< ", pose_ptr->position = " << pose_ptr->position.ToString();
if (plane) {
xr_->xrEnvironmentProviderRemote()->CreatePlaneAnchor(
......
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