#ifndef DEVICE_VR_OPENXR_OPENXR_SPATIAL_HIT_TEST_MANAGER_H_
#define DEVICE_VR_OPENXR_OPENXR_SPATIAL_HIT_TEST_MANAGER_H_
#include "device/vr/openxr/openxr_extension_helper.h"
#include "device/vr/openxr/openxr_hit_test_manager.h"
#include "device/vr/openxr/openxr_platform.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 OpenXrSpatialFrameworkManager;
class OpenXrSpatialPlaneManager;
class OpenXrSpatialHitTestManager : public OpenXrHitTestManager {
public:
static bool IsSupported(
XrInstance instance,
XrSystemId system,
PFN_xrEnumerateSpatialCapabilityComponentTypesEXT
xrEnumerateSpatialCapabilityComponentTypesEXT,
const std::vector<XrSpatialCapabilityEXT>& capabilities);
OpenXrSpatialHitTestManager(
const OpenXrExtensionHelper& extension_helper,
const OpenXrSpatialFrameworkManager& spatial_framework_manager,
OpenXrSpatialPlaneManager* plane_manager,
XrSpace mojo_space,
XrInstance instance,
XrSystemId system);
~OpenXrSpatialHitTestManager() override;
void PopulateCapabilityConfiguration(
absl::flat_hash_map<XrSpatialCapabilityEXT,
absl::flat_hash_set<XrSpatialComponentTypeEXT>>&
capability_components) const;
std::vector<mojom::XRHitResultPtr> RequestHitTest(
const gfx::Point3F& origin,
const gfx::Vector3dF& direction) override;
protected:
void OnStartProcessingHitTests(XrTime predicted_display_time) override;
private:
XrSpatialSnapshotEXT GetSnapshot(const gfx::Point3F& origin,
const gfx::Vector3dF& direction);
const raw_ref<const OpenXrExtensionHelper> extension_helper_;
const raw_ref<const OpenXrSpatialFrameworkManager> spatial_framework_manager_;
const raw_ptr<OpenXrSpatialPlaneManager> plane_manager_;
XrSpace mojo_space_;
XrInstance instance_;
XrSystemId system_;
XrTime predicted_display_time_;
};
}
#endif