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 "modules/vr/VRDisplay.h" | 5 #include "modules/vr/VRDisplay.h" |
6 | 6 |
7 #include "core/dom/DOMException.h" | 7 #include "core/dom/DOMException.h" |
8 #include "core/dom/Fullscreen.h" | 8 #include "core/dom/Fullscreen.h" |
9 #include "core/inspector/ConsoleMessage.h" | 9 #include "core/inspector/ConsoleMessage.h" |
10 #include "modules/vr/NavigatorVR.h" | 10 #include "modules/vr/NavigatorVR.h" |
11 #include "modules/vr/VRController.h" | 11 #include "modules/vr/VRController.h" |
12 #include "modules/vr/VRDisplayCapabilities.h" | 12 #include "modules/vr/VRDisplayCapabilities.h" |
13 #include "modules/vr/VREyeParameters.h" | 13 #include "modules/vr/VREyeParameters.h" |
| 14 #include "modules/vr/VRFrameData.h" |
14 #include "modules/vr/VRLayer.h" | 15 #include "modules/vr/VRLayer.h" |
15 #include "modules/vr/VRPose.h" | 16 #include "modules/vr/VRPose.h" |
16 #include "modules/vr/VRStageParameters.h" | 17 #include "modules/vr/VRStageParameters.h" |
17 #include "modules/webgl/WebGLRenderingContextBase.h" | 18 #include "modules/webgl/WebGLRenderingContextBase.h" |
18 #include "platform/UserGestureIndicator.h" | 19 #include "platform/UserGestureIndicator.h" |
19 #include "public/platform/Platform.h" | 20 #include "public/platform/Platform.h" |
20 | 21 |
21 namespace blink { | 22 namespace blink { |
22 | 23 |
23 namespace { | 24 namespace { |
(...skipping 11 matching lines...) Expand all Loading... |
35 | 36 |
36 VRDisplay::VRDisplay(NavigatorVR* navigatorVR) | 37 VRDisplay::VRDisplay(NavigatorVR* navigatorVR) |
37 : m_navigatorVR(navigatorVR) | 38 : m_navigatorVR(navigatorVR) |
38 , m_displayId(0) | 39 , m_displayId(0) |
39 , m_isConnected(false) | 40 , m_isConnected(false) |
40 , m_isPresenting(false) | 41 , m_isPresenting(false) |
41 , m_canUpdateFramePose(true) | 42 , m_canUpdateFramePose(true) |
42 , m_capabilities(new VRDisplayCapabilities()) | 43 , m_capabilities(new VRDisplayCapabilities()) |
43 , m_eyeParametersLeft(new VREyeParameters()) | 44 , m_eyeParametersLeft(new VREyeParameters()) |
44 , m_eyeParametersRight(new VREyeParameters()) | 45 , m_eyeParametersRight(new VREyeParameters()) |
| 46 , m_depthNear(0.01) |
| 47 , m_depthFar(10000.0) |
45 , m_fullscreenCheckTimer(this, &VRDisplay::onFullscreenCheck) | 48 , m_fullscreenCheckTimer(this, &VRDisplay::onFullscreenCheck) |
46 { | 49 { |
47 } | 50 } |
48 | 51 |
49 VRDisplay::~VRDisplay() | 52 VRDisplay::~VRDisplay() |
50 { | 53 { |
51 } | 54 } |
52 | 55 |
53 VRController* VRDisplay::controller() | 56 VRController* VRDisplay::controller() |
54 { | 57 { |
(...skipping 17 matching lines...) Expand all Loading... |
72 | 75 |
73 if (!display->stageParameters.is_null()) { | 76 if (!display->stageParameters.is_null()) { |
74 if (!m_stageParameters) | 77 if (!m_stageParameters) |
75 m_stageParameters = new VRStageParameters(); | 78 m_stageParameters = new VRStageParameters(); |
76 m_stageParameters->update(display->stageParameters); | 79 m_stageParameters->update(display->stageParameters); |
77 } else { | 80 } else { |
78 m_stageParameters = nullptr; | 81 m_stageParameters = nullptr; |
79 } | 82 } |
80 } | 83 } |
81 | 84 |
| 85 bool VRDisplay::getFrameData(VRFrameData* frameData) |
| 86 { |
| 87 updatePose(); |
| 88 |
| 89 if (!frameData) |
| 90 return false; |
| 91 |
| 92 if (m_depthNear == m_depthFar) |
| 93 return false; |
| 94 |
| 95 return frameData->update(m_framePose, m_eyeParametersLeft, m_eyeParametersRi
ght, m_depthNear, m_depthFar); |
| 96 } |
| 97 |
82 VRPose* VRDisplay::getPose() | 98 VRPose* VRDisplay::getPose() |
83 { | 99 { |
84 if (m_canUpdateFramePose) { | 100 updatePose(); |
85 m_framePose = getImmediatePose(); | |
86 Platform::current()->currentThread()->addTaskObserver(this); | |
87 m_canUpdateFramePose = false; | |
88 } | |
89 | 101 |
90 return m_framePose; | 102 if (!m_framePose) |
| 103 return nullptr; |
| 104 |
| 105 VRPose* pose = VRPose::create(); |
| 106 pose->setPose(m_framePose); |
| 107 return pose; |
91 } | 108 } |
92 | 109 |
93 VRPose* VRDisplay::getImmediatePose() | 110 void VRDisplay::updatePose() |
94 { | 111 { |
95 VRPose* pose = VRPose::create(); | 112 if (m_canUpdateFramePose) { |
96 pose->setPose(controller()->getPose(m_displayId)); | 113 m_framePose = controller()->getPose(m_displayId); |
97 return pose; | 114 if (m_isPresenting) |
| 115 m_canUpdateFramePose = false; |
| 116 } |
98 } | 117 } |
99 | 118 |
100 void VRDisplay::resetPose() | 119 void VRDisplay::resetPose() |
101 { | 120 { |
102 controller()->resetPose(m_displayId); | 121 controller()->resetPose(m_displayId); |
103 } | 122 } |
104 | 123 |
105 VREyeParameters* VRDisplay::getEyeParameters(const String& whichEye) | 124 VREyeParameters* VRDisplay::getEyeParameters(const String& whichEye) |
106 { | 125 { |
107 switch (stringToVREye(whichEye)) { | 126 switch (stringToVREye(whichEye)) { |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
261 { | 280 { |
262 HeapVector<VRLayer> layers; | 281 HeapVector<VRLayer> layers; |
263 | 282 |
264 if (m_isPresenting) { | 283 if (m_isPresenting) { |
265 layers.append(m_layer); | 284 layers.append(m_layer); |
266 } | 285 } |
267 | 286 |
268 return layers; | 287 return layers; |
269 } | 288 } |
270 | 289 |
271 void VRDisplay::submitFrame(VRPose* pose) | 290 void VRDisplay::submitFrame() |
272 { | 291 { |
273 controller()->submitFrame(m_displayId); | 292 controller()->submitFrame(m_displayId); |
274 } | 293 m_canUpdateFramePose = true; |
275 | |
276 void VRDisplay::didProcessTask() | |
277 { | |
278 // Pose should be stable until control is returned to the user agent. | |
279 if (!m_canUpdateFramePose) { | |
280 Platform::current()->currentThread()->removeTaskObserver(this); | |
281 m_canUpdateFramePose = true; | |
282 } | |
283 } | 294 } |
284 | 295 |
285 void VRDisplay::onFullscreenCheck(TimerBase*) | 296 void VRDisplay::onFullscreenCheck(TimerBase*) |
286 { | 297 { |
287 // TODO: This is a temporary measure to track if fullscreen mode has been | 298 // TODO: This is a temporary measure to track if fullscreen mode has been |
288 // exited by the UA. If so we need to end VR presentation. Soon we won't | 299 // exited by the UA. If so we need to end VR presentation. Soon we won't |
289 // depend on the Fullscreen API to fake VR presentation, so this will | 300 // depend on the Fullscreen API to fake VR presentation, so this will |
290 // become unnessecary. Until that point, though, this seems preferable to | 301 // become unnessecary. Until that point, though, this seems preferable to |
291 // adding a bunch of notification plumbing to Fullscreen. | 302 // adding a bunch of notification plumbing to Fullscreen. |
292 if (!Fullscreen::isCurrentFullScreenElement(*m_layer.source())) { | 303 if (!Fullscreen::isCurrentFullScreenElement(*m_layer.source())) { |
293 m_isPresenting = false; | 304 m_isPresenting = false; |
294 m_navigatorVR->fireVRDisplayPresentChange(this); | 305 m_navigatorVR->fireVRDisplayPresentChange(this); |
295 m_fullscreenCheckTimer.stop(); | 306 m_fullscreenCheckTimer.stop(); |
296 controller()->exitPresent(m_displayId); | 307 controller()->exitPresent(m_displayId); |
297 } | 308 } |
298 } | 309 } |
299 | 310 |
300 DEFINE_TRACE(VRDisplay) | 311 DEFINE_TRACE(VRDisplay) |
301 { | 312 { |
302 visitor->trace(m_navigatorVR); | 313 visitor->trace(m_navigatorVR); |
303 visitor->trace(m_capabilities); | 314 visitor->trace(m_capabilities); |
304 visitor->trace(m_stageParameters); | 315 visitor->trace(m_stageParameters); |
305 visitor->trace(m_eyeParametersLeft); | 316 visitor->trace(m_eyeParametersLeft); |
306 visitor->trace(m_eyeParametersRight); | 317 visitor->trace(m_eyeParametersRight); |
307 visitor->trace(m_framePose); | |
308 visitor->trace(m_layer); | 318 visitor->trace(m_layer); |
309 } | 319 } |
310 | 320 |
311 } // namespace blink | 321 } // namespace blink |
OLD | NEW |