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