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