#ifndef DEVICE_VR_OPENXR_OPENXR_ANCHOR_MANAGER_H_
#define DEVICE_VR_OPENXR_OPENXR_ANCHOR_MANAGER_H_
#include <optional>
#include <vector>
#include "base/types/expected.h"
#include "device/vr/create_anchor_request.h"
#include "device/vr/public/mojom/anchor_id.h"
#include "device/vr/public/mojom/plane_id.h"
#include "device/vr/public/mojom/vr_service.mojom.h"
#include "third_party/openxr/src/include/openxr/openxr.h"
namespace gfx {
class Transform;
}
namespace device {
class OpenXrApiWrapper;
struct XrLocation;
class OpenXrAnchorManager {
public:
OpenXrAnchorManager();
virtual ~OpenXrAnchorManager();
OpenXrAnchorManager(const OpenXrAnchorManager&) = delete;
OpenXrAnchorManager& operator=(const OpenXrAnchorManager&) = delete;
void AddCreateAnchorRequest(
const mojom::XRNativeOriginInformation& native_origin_information,
const device::Pose& native_origin_from_anchor,
const std::optional<PlaneId>& plane_id,
CreateAnchorCallback callback);
device::mojom::XRAnchorsDataPtr ProcessAnchorsForFrame(
OpenXrApiWrapper* openxr,
XrTime predicted_display_time);
virtual void DetachAnchor(AnchorId anchor_id) = 0;
virtual std::optional<XrLocation> GetXrLocationFromAnchor(
AnchorId anchor_id,
const gfx::Transform& anchor_id_from_object) const = 0;
protected:
enum class AnchorTrackingErrorType {
kTemporary = 0,
kPermanent = 1,
};
virtual AnchorId CreateAnchor(XrPosef pose,
XrSpace space,
XrTime predicted_display_time,
std::optional<PlaneId> plane_id) = 0;
virtual mojom::XRAnchorsDataPtr GetCurrentAnchorsData(
XrTime predicted_display_time) = 0;
private:
void DisposeActiveAnchorCallbacks();
void ProcessCreateAnchorRequests(OpenXrApiWrapper* openxr);
bool IsSupportedOrigin(
const mojom::XRNativeOriginInformation& native_origin_info) const;
std::vector<CreateAnchorRequest> create_anchor_requests_;
};
}
#endif