OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "device/vr/android/gvr/gvr_device.h" | 5 #include "device/vr/android/gvr/gvr_device.h" |
6 | 6 |
7 #include <math.h> | 7 #include <math.h> |
8 #include <algorithm> | 8 #include <algorithm> |
9 | 9 |
10 #include "base/time/time.h" | 10 #include "base/time/time.h" |
11 #include "base/trace_event/trace_event.h" | 11 #include "base/trace_event/trace_event.h" |
12 #include "device/vr/android/gvr/gvr_delegate.h" | 12 #include "device/vr/android/gvr/gvr_delegate.h" |
| 13 #include "device/vr/vr_device_manager.h" |
13 #include "third_party/gvr-android-sdk/src/ndk-beta/include/vr/gvr/capi/include/g
vr.h" | 14 #include "third_party/gvr-android-sdk/src/ndk-beta/include/vr/gvr/capi/include/g
vr.h" |
14 #include "third_party/gvr-android-sdk/src/ndk-beta/include/vr/gvr/capi/include/g
vr_types.h" | 15 #include "third_party/gvr-android-sdk/src/ndk-beta/include/vr/gvr/capi/include/g
vr_types.h" |
15 #include "ui/gfx/transform.h" | 16 #include "ui/gfx/transform.h" |
16 #include "ui/gfx/transform_util.h" | 17 #include "ui/gfx/transform_util.h" |
17 | 18 |
18 namespace device { | 19 namespace device { |
19 | 20 |
20 namespace { | 21 namespace { |
21 | 22 |
22 static const uint64_t kPredictionTimeWithoutVsyncNanos = 50000000; | 23 static const uint64_t kPredictionTimeWithoutVsyncNanos = 50000000; |
23 | 24 |
24 } // namespace | 25 } // namespace |
25 | 26 |
26 GvrDevice::GvrDevice(VRDeviceProvider* provider, GvrDelegate* delegate) | 27 GvrDevice::GvrDevice(GvrDeviceProvider* provider, GvrDelegate* delegate) |
27 : VRDevice(provider), delegate_(delegate) {} | 28 : VRDevice(provider), delegate_(delegate), gvr_provider_(provider) {} |
28 | 29 |
29 GvrDevice::~GvrDevice() {} | 30 GvrDevice::~GvrDevice() {} |
30 | 31 |
31 VRDisplayPtr GvrDevice::GetVRDevice() { | 32 VRDisplayPtr GvrDevice::GetVRDevice() { |
32 TRACE_EVENT0("input", "GvrDevice::GetVRDevice"); | 33 TRACE_EVENT0("input", "GvrDevice::GetVRDevice"); |
33 | 34 |
34 gvr::GvrApi* gvr_api = delegate_->gvr_api(); | 35 gvr::GvrApi* gvr_api = GetGvrApi(); |
| 36 if (!gvr_api) |
| 37 return nullptr; |
35 | 38 |
36 VRDisplayPtr device = VRDisplay::New(); | 39 VRDisplayPtr device = VRDisplay::New(); |
37 | 40 |
| 41 device->index = id(); |
| 42 |
| 43 std::string vendor = gvr_api->GetViewerVendor(); |
| 44 std::string model = gvr_api->GetViewerModel(); |
| 45 device->displayName = vendor + " " + model; |
| 46 |
38 device->capabilities = VRDisplayCapabilities::New(); | 47 device->capabilities = VRDisplayCapabilities::New(); |
39 device->capabilities->hasOrientation = true; | 48 device->capabilities->hasOrientation = true; |
40 device->capabilities->hasPosition = false; | 49 device->capabilities->hasPosition = false; |
41 device->capabilities->hasExternalDisplay = false; | 50 device->capabilities->hasExternalDisplay = false; |
42 device->capabilities->canPresent = true; | 51 device->capabilities->canPresent = true; |
43 | 52 |
44 device->leftEye = VREyeParameters::New(); | 53 device->leftEye = VREyeParameters::New(); |
45 device->rightEye = VREyeParameters::New(); | 54 device->rightEye = VREyeParameters::New(); |
46 VREyeParametersPtr& left_eye = device->leftEye; | 55 VREyeParametersPtr& left_eye = device->leftEye; |
47 VREyeParametersPtr& right_eye = device->rightEye; | 56 VREyeParametersPtr& right_eye = device->rightEye; |
48 | 57 |
49 device->displayName = gvr_api->GetViewerModel(); | |
50 | |
51 gvr::BufferViewportList gvr_buffer_viewports = | 58 gvr::BufferViewportList gvr_buffer_viewports = |
52 gvr_api->CreateEmptyBufferViewportList(); | 59 gvr_api->CreateEmptyBufferViewportList(); |
53 gvr_buffer_viewports.SetToRecommendedBufferViewports(); | 60 gvr_buffer_viewports.SetToRecommendedBufferViewports(); |
54 | 61 |
55 gvr::BufferViewport eye_viewport = gvr_api->CreateBufferViewport(); | 62 gvr::BufferViewport eye_viewport = gvr_api->CreateBufferViewport(); |
56 gvr_buffer_viewports.GetBufferViewport(GVR_LEFT_EYE, &eye_viewport); | 63 gvr_buffer_viewports.GetBufferViewport(GVR_LEFT_EYE, &eye_viewport); |
57 gvr::Rectf eye_fov = eye_viewport.GetSourceFov(); | 64 gvr::Rectf eye_fov = eye_viewport.GetSourceFov(); |
58 left_eye->fieldOfView = VRFieldOfView::New(); | 65 left_eye->fieldOfView = VRFieldOfView::New(); |
59 left_eye->fieldOfView->upDegrees = eye_fov.top; | 66 left_eye->fieldOfView->upDegrees = eye_fov.top; |
60 left_eye->fieldOfView->downDegrees = eye_fov.bottom; | 67 left_eye->fieldOfView->downDegrees = eye_fov.bottom; |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
93 | 100 |
94 right_eye->renderWidth = left_eye->renderWidth; | 101 right_eye->renderWidth = left_eye->renderWidth; |
95 right_eye->renderHeight = left_eye->renderHeight; | 102 right_eye->renderHeight = left_eye->renderHeight; |
96 | 103 |
97 return device; | 104 return device; |
98 } | 105 } |
99 | 106 |
100 VRPosePtr GvrDevice::GetPose() { | 107 VRPosePtr GvrDevice::GetPose() { |
101 TRACE_EVENT0("input", "GvrDevice::GetSensorState"); | 108 TRACE_EVENT0("input", "GvrDevice::GetSensorState"); |
102 | 109 |
103 gvr::GvrApi* gvr_api = delegate_->gvr_api(); | 110 gvr::GvrApi* gvr_api = GetGvrApi(); |
| 111 if (!gvr_api) |
| 112 return nullptr; |
104 | 113 |
105 VRPosePtr pose = VRPose::New(); | 114 VRPosePtr pose = VRPose::New(); |
106 | 115 |
107 pose->timestamp = base::Time::Now().ToJsTime(); | 116 pose->timestamp = base::Time::Now().ToJsTime(); |
108 | 117 |
109 gvr::ClockTimePoint target_time = gvr::GvrApi::GetTimePointNow(); | 118 gvr::ClockTimePoint target_time = gvr::GvrApi::GetTimePointNow(); |
110 target_time.monotonic_system_time_nanos += kPredictionTimeWithoutVsyncNanos; | 119 target_time.monotonic_system_time_nanos += kPredictionTimeWithoutVsyncNanos; |
111 | 120 |
112 gvr::Mat4f head_mat = gvr_api->GetHeadPoseInStartSpace(target_time); | 121 gvr::Mat4f head_mat = gvr_api->GetHeadPoseInStartSpace(target_time); |
113 | 122 |
(...skipping 17 matching lines...) Expand all Loading... |
131 pose->position = mojo::Array<float>::New(3); | 140 pose->position = mojo::Array<float>::New(3); |
132 pose->position[0] = decomposed_transform.translate[0]; | 141 pose->position[0] = decomposed_transform.translate[0]; |
133 pose->position[1] = decomposed_transform.translate[1]; | 142 pose->position[1] = decomposed_transform.translate[1]; |
134 pose->position[2] = decomposed_transform.translate[2]; | 143 pose->position[2] = decomposed_transform.translate[2]; |
135 } | 144 } |
136 | 145 |
137 return pose; | 146 return pose; |
138 } | 147 } |
139 | 148 |
140 void GvrDevice::ResetPose() { | 149 void GvrDevice::ResetPose() { |
141 delegate_->gvr_api()->ResetTracking(); | 150 gvr::GvrApi* gvr_api = GetGvrApi(); |
| 151 if (gvr_api) |
| 152 gvr_api->ResetTracking(); |
142 } | 153 } |
143 | 154 |
144 bool GvrDevice::RequestPresent() { | 155 bool GvrDevice::RequestPresent() { |
145 delegate_->RequestWebVRPresent(); | 156 return gvr_provider_->RequestPresent(); |
146 return true; | |
147 } | 157 } |
148 | 158 |
149 void GvrDevice::ExitPresent() { | 159 void GvrDevice::ExitPresent() { |
150 delegate_->ExitWebVRPresent(); | 160 gvr_provider_->ExitPresent(); |
151 } | 161 } |
152 | 162 |
153 void GvrDevice::SubmitFrame(VRPosePtr pose) { | 163 void GvrDevice::SubmitFrame(VRPosePtr pose) { |
154 delegate_->SubmitWebVRFrame(); | 164 if (delegate_) |
| 165 delegate_->SubmitWebVRFrame(); |
155 } | 166 } |
156 | 167 |
157 void GvrDevice::UpdateLayerBounds(VRLayerBoundsPtr leftBounds, | 168 void GvrDevice::UpdateLayerBounds(VRLayerBoundsPtr leftBounds, |
158 VRLayerBoundsPtr rightBounds) { | 169 VRLayerBoundsPtr rightBounds) { |
| 170 if (!delegate_) |
| 171 return; |
| 172 |
159 delegate_->UpdateWebVRTextureBounds(0, // Left eye | 173 delegate_->UpdateWebVRTextureBounds(0, // Left eye |
160 leftBounds->left, leftBounds->top, | 174 leftBounds->left, leftBounds->top, |
161 leftBounds->width, leftBounds->height); | 175 leftBounds->width, leftBounds->height); |
162 delegate_->UpdateWebVRTextureBounds(1, // Right eye | 176 delegate_->UpdateWebVRTextureBounds(1, // Right eye |
163 rightBounds->left, rightBounds->top, | 177 rightBounds->left, rightBounds->top, |
164 rightBounds->width, rightBounds->height); | 178 rightBounds->width, rightBounds->height); |
165 } | 179 } |
166 | 180 |
| 181 void GvrDevice::SetDelegate(GvrDelegate* delegate) { |
| 182 delegate_ = delegate; |
| 183 |
| 184 // Notify the clients that this device has changed |
| 185 if (delegate_) |
| 186 VRDeviceManager::GetInstance()->OnDeviceChanged(GetVRDevice()); |
| 187 } |
| 188 |
| 189 gvr::GvrApi* GvrDevice::GetGvrApi() { |
| 190 if (!delegate_) |
| 191 return nullptr; |
| 192 |
| 193 return delegate_->gvr_api(); |
| 194 } |
| 195 |
167 } // namespace device | 196 } // namespace device |
OLD | NEW |