| 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 |