blob: 53f1107345694aa858d0184faca12c3077e8cef7 [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_HIT_TEST_MANAGER_H_
#define DEVICE_VR_OPENXR_OPENXR_SPATIAL_HIT_TEST_MANAGER_H_
#include "base/memory/weak_ptr.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;
// Delegate class for OpenXrSpatialFrameworkManager responsible for integration
// with the XR_ANDROID_SPATIAL_DISCOVERY_RAYCAST extension (aka the "hit test"
// feature).
// NOTE: The usage of the XR_ANDROID_SPATIAL_DISCOVERY_RAYCAST is a temporary
// stopgap to enable the usage of the whole spatial framework. It is intended
// that as soon as the XR_EXT_ version of this extension exists that this class
// will be ported to leverage that extension instead. It is hoped however, that
// this extension should look very similar to the current version and thus
// hopefully only minimal changes will be required.
class OpenXrSpatialHitTestManager : public OpenXrHitTestManager {
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 plane detection feature.
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;
// 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_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_;
};
} // namespace device
#endif // DEVICE_VR_OPENXR_OPENXR_SPATIAL_HIT_TEST_MANAGER_H_