1 // Copyright 2018 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CHROME_BROWSER_ANDROID_VR_ARCORE_DEVICE_FAKE_ARCORE_H_ 6 #define CHROME_BROWSER_ANDROID_VR_ARCORE_DEVICE_FAKE_ARCORE_H_ 7 8 #include <memory> 9 #include "base/macros.h" 10 #include "base/memory/ref_counted.h" 11 #include "base/time/time.h" 12 #include "device/vr/android/arcore/arcore.h" 13 14 namespace device { 15 16 // Minimal fake ArCore implementation for testing. It can populate 17 // the camera texture with a GL_TEXTURE_OES image and do UV transform 18 // calculations. 19 class FakeArCore : public ArCore { 20 public: 21 FakeArCore(); 22 ~FakeArCore() override; 23 24 // ArCore implementation. 25 base::Optional<ArCore::InitializeResult> Initialize( 26 base::android::ScopedJavaLocalRef<jobject> application_context, 27 const std::unordered_set<device::mojom::XRSessionFeature>& 28 required_features, 29 const std::unordered_set<device::mojom::XRSessionFeature>& 30 optional_features, 31 const std::vector<device::mojom::XRTrackedImagePtr>& tracked_images) 32 override; 33 MinMaxRange GetTargetFramerateRange() override; 34 void SetCameraTexture(uint32_t texture) override; 35 void SetDisplayGeometry(const gfx::Size& frame_size, 36 display::Display::Rotation display_rotation) override; 37 38 gfx::Transform GetProjectionMatrix(float near, float far) override; 39 mojom::VRPosePtr Update(bool* camera_updated) override; 40 base::TimeDelta GetFrameTimestamp() override; 41 42 void Pause() override; 43 void Resume() override; 44 45 float GetEstimatedFloorHeight() override; 46 47 bool RequestHitTest(const mojom::XRRayPtr& ray, 48 std::vector<mojom::XRHitResultPtr>* hit_results) override; 49 50 base::Optional<uint64_t> SubscribeToHitTest( 51 mojom::XRNativeOriginInformationPtr nativeOriginInformation, 52 const std::vector<mojom::EntityTypeForHitTest>& entity_types, 53 mojom::XRRayPtr ray) override; 54 base::Optional<uint64_t> SubscribeToHitTestForTransientInput( 55 const std::string& profile_name, 56 const std::vector<mojom::EntityTypeForHitTest>& entity_types, 57 mojom::XRRayPtr ray) override; 58 59 mojom::XRHitTestSubscriptionResultsDataPtr GetHitTestSubscriptionResults( 60 const gfx::Transform& mojo_from_viewer, 61 const std::vector<mojom::XRInputSourceStatePtr>& input_state) override; 62 63 void UnsubscribeFromHitTest(uint64_t subscription_id) override; 64 65 mojom::XRPlaneDetectionDataPtr GetDetectedPlanesData() override; 66 mojom::XRAnchorsDataPtr GetAnchorsData() override; 67 mojom::XRLightEstimationDataPtr GetLightEstimationData() override; 68 mojom::XRDepthDataPtr GetDepthData() override; 69 70 void CreateAnchor( 71 const mojom::XRNativeOriginInformation& native_origin_information, 72 const device::Pose& native_origin_from_anchor, 73 CreateAnchorCallback callback) override; 74 void CreatePlaneAttachedAnchor( 75 const mojom::XRNativeOriginInformation& native_origin_information, 76 const device::Pose& native_origin_from_anchor, 77 uint64_t plane_id, 78 CreateAnchorCallback callback) override; 79 80 void ProcessAnchorCreationRequests( 81 const gfx::Transform& mojo_from_viewer, 82 const std::vector<mojom::XRInputSourceStatePtr>& input_state, 83 const base::TimeTicks& frame_time) override; 84 85 void DetachAnchor(uint64_t anchor_id) override; 86 87 mojom::XRTrackedImagesDataPtr GetTrackedImages() override; 88 SetCameraAspect(float aspect)89 void SetCameraAspect(float aspect) { camera_aspect_ = aspect; } 90 91 protected: 92 std::vector<float> TransformDisplayUvCoords( 93 const base::span<const float> uvs) const override; 94 95 private: 96 bool IsOnGlThread() const; 97 98 scoped_refptr<base::SingleThreadTaskRunner> gl_thread_task_runner_; 99 100 float camera_aspect_ = 1.0f; 101 display::Display::Rotation display_rotation_ = 102 display::Display::Rotation::ROTATE_0; 103 gfx::Size frame_size_; 104 105 struct FakeAnchorData { 106 gfx::Point3F position; 107 gfx::Quaternion orientation; 108 }; 109 110 std::unordered_map<uint64_t, FakeAnchorData> anchors_; 111 112 DISALLOW_COPY_AND_ASSIGN(FakeArCore); 113 }; 114 115 class FakeArCoreFactory : public ArCoreFactory { 116 public: 117 std::unique_ptr<ArCore> Create() override; 118 }; 119 120 } // namespace device 121 122 #endif // CHROME_BROWSER_ANDROID_VR_ARCORE_DEVICE_FAKE_ARCORE_H_ 123