blob: f956d052938e2e56a42d0b78397a1d6e8f2bf1cd [file] [log] [blame]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef DEVICE_VR_OPENXR_OPENXR_SPATIAL_ANCHOR_MANAGER_H_
#define DEVICE_VR_OPENXR_OPENXR_SPATIAL_ANCHOR_MANAGER_H_
#include <vector>
#include "base/memory/raw_ref.h"
#include "base/memory/weak_ptr.h"
#include "base/types/expected.h"
#include "device/vr/openxr/openxr_anchor_manager.h"
#include "device/vr/public/mojom/pose.h"
#include "third_party/abseil-cpp/absl/container/flat_hash_map.h"
#include "third_party/abseil-cpp/absl/container/flat_hash_set.h"
#include "third_party/openxr/src/include/openxr/openxr.h"
namespace device {
class OpenXrExtensionHelper;
class OpenXrSpatialFrameworkManager;
class OpenXrSpatialPlaneManager;
// Delegate class for OpenXrSpatialFrameworkManager responsible for integration
// with the XR_EXT_SPATIAL_ANCHOR extension (aka the "Anchors" feature).
class OpenXrSpatialAnchorManager : public OpenXrAnchorManager {
public:
// Queries the supported spatial capabilities and spatial components on the
// current system instance and returns whether or not this manager can be
// enabled to provide support for the anchors feature.
static bool IsSupported(
const std::vector<XrSpatialCapabilityEXT>& capabilities);
OpenXrSpatialAnchorManager(
const OpenXrExtensionHelper& extension_helper,
const OpenXrSpatialFrameworkManager& spatial_framework_manager,
OpenXrSpatialPlaneManager* plane_manager,
XrSpace mojo_space);
~OpenXrSpatialAnchorManager() override;
// Mutates the provided map to fill in the necessary capabilities and
// components for those capabilities that need to be enabled. Used to build
// the list of |capabilityConfigs| on the |XrSpatialContextCreateInfoEXT| used
// to create the spatial context.
void PopulateCapabilityConfiguration(
absl::flat_hash_map<XrSpatialCapabilityEXT,
absl::flat_hash_set<XrSpatialComponentTypeEXT>>&
capability_configuration) const;
// OpenXrAnchorManager
AnchorId CreateAnchor(XrPosef pose,
XrSpace space,
XrTime predicted_display_time,
std::optional<PlaneId> plane_id) override;
void DetachAnchor(AnchorId anchor_id) override;
std::optional<XrLocation> GetXrLocationFromAnchor(
AnchorId anchor_id,
const gfx::Transform& anchor_id_from_new_anchor) const override;
mojom::XRAnchorsDataPtr GetCurrentAnchorsData(
XrTime predicted_display_time) override;
private:
struct SpatialAnchorData {
XrSpatialEntityEXT entity;
XrSpatialEntityIdEXT entity_id;
};
const raw_ref<const OpenXrExtensionHelper> extension_helper_;
const raw_ref<const OpenXrSpatialFrameworkManager> spatial_framework_manager_;
const raw_ptr<OpenXrSpatialPlaneManager> plane_manager_;
XrSpace mojo_space_;
AnchorId::Generator anchor_id_generator_;
absl::flat_hash_map<AnchorId, SpatialAnchorData> anchors_;
absl::flat_hash_map<XrSpatialEntityIdEXT, AnchorId> entity_id_to_anchor_id_;
absl::flat_hash_map<AnchorId, std::optional<device::Pose>>
cached_anchor_poses_;
base::WeakPtrFactory<OpenXrSpatialAnchorManager> weak_ptr_factory_{this};
};
} // namespace device
#endif // DEVICE_VR_OPENXR_OPENXR_SPATIAL_ANCHOR_MANAGER_H_