Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1453)

Unified Diff: Source/modules/vr/HMDVRDevice.cpp

Issue 848053002: Adding WebVR interface to Blink (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Rebase Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/modules/vr/HMDVRDevice.cpp
diff --git a/Source/modules/vr/HMDVRDevice.cpp b/Source/modules/vr/HMDVRDevice.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..1f065cecec91bc4b7aa6372f05fb5960782801bf
--- /dev/null
+++ b/Source/modules/vr/HMDVRDevice.cpp
@@ -0,0 +1,143 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "config.h"
+#include "modules/vr/HMDVRDevice.h"
+
+#include "modules/vr/VRFieldOfView.h"
+#include "public/platform/Platform.h"
+#include "public/platform/WebSize.h"
+
+namespace blink {
+
+namespace {
+
+void setDomPoint(DOMPoint* point, const blink::WebVRVector3& vec)
+{
+ point->setX(vec.x);
+ point->setY(vec.y);
+ point->setZ(vec.z);
+ point->setW(0.0);
+}
+
+}
+
+HMDVRDevice::HMDVRDevice(VRHardwareUnit* hardwareUnit)
+ : VRDevice(hardwareUnit)
+{
+ m_recommendedFOVLeft = new VRFieldOfView();
+ m_recommendedFOVRight = new VRFieldOfView();
+ m_maximumFOVLeft = new VRFieldOfView();
+ m_maximumFOVRight = new VRFieldOfView();
+ m_eyeTranslationLeft = DOMPoint::create(0, 0, 0, 0);
+ m_eyeTranslationRight = DOMPoint::create(0, 0, 0, 0);
+}
+
+HMDVRDevice::VREye HMDVRDevice::StringToVREye(const String& whichEye)
+{
+ if (whichEye == "right") {
+ return VREyeRight;
+ }
+ return VREyeLeft;
Ken Russell (switch to Gerrit) 2015/02/04 19:14:00 This should explicitly check for "left" and return
+}
+
+void HMDVRDevice::updateFromWebVRDevice(const WebVRDevice& device)
+{
+ VRDevice::updateFromWebVRDevice(device);
+ const blink::WebVRHMDInfo &hmdInfo = device.hmdInfo;
+
+ m_recommendedFOVLeft->setFromWebVRFieldOfView(hmdInfo.recommendedFOVLeft);
+ m_recommendedFOVRight->setFromWebVRFieldOfView(hmdInfo.recommendedFOVRight);
+ m_maximumFOVLeft->setFromWebVRFieldOfView(hmdInfo.maximumFOVLeft);
+ m_maximumFOVRight->setFromWebVRFieldOfView(hmdInfo.maximumFOVRight);
+ setDomPoint(m_eyeTranslationLeft, hmdInfo.eyeTranslationLeft);
+ setDomPoint(m_eyeTranslationRight, hmdInfo.eyeTranslationRight);
+ hardwareUnit()->setFieldOfView(0, m_recommendedFOVLeft);
+ hardwareUnit()->setFieldOfView(1, m_recommendedFOVRight);
+}
+
+DOMPoint* HMDVRDevice::getEyeTranslation(const String& whichEye)
+{
+ switch (StringToVREye(whichEye)) {
+ case VREyeRight:
+ return m_eyeTranslationRight;
+ default:
+ return m_eyeTranslationLeft;
Ken Russell (switch to Gerrit) 2015/02/04 19:13:59 Throughout, all of the code returning the value fo
+ }
+}
+
+VRFieldOfView* HMDVRDevice::getCurrentEyeFieldOfView(const String& whichEye)
+{
+ return hardwareUnit()->getCurrentEyeFieldOfView(StringToVREye(whichEye));
+}
+
+VRFieldOfView* HMDVRDevice::getRecommendedEyeFieldOfView(const String& whichEye)
+{
+ switch (StringToVREye(whichEye)) {
+ case VREyeRight:
+ return new VRFieldOfView(*m_recommendedFOVRight);
+ default:
+ return new VRFieldOfView(*m_recommendedFOVLeft);
+ }
+}
+
+VRFieldOfView* HMDVRDevice::getMaximumEyeFieldOfView(const String& whichEye)
+{
+ switch (StringToVREye(whichEye)) {
+ case VREyeRight:
+ return new VRFieldOfView(*m_maximumFOVRight);
+ default:
+ return new VRFieldOfView(*m_maximumFOVLeft);
+ }
+}
+
+void HMDVRDevice::setFieldOfView(VRFieldOfView* leftFov, VRFieldOfView* rightFov)
+{
+ // TODO: Clamp to maxFOV
+
+ if (leftFov) {
+ hardwareUnit()->setFieldOfView(0, leftFov);
+ } else {
+ hardwareUnit()->setFieldOfView(0, m_recommendedFOVLeft);
+ }
+
+ if (rightFov) {
+ hardwareUnit()->setFieldOfView(1, rightFov);
+ } else {
+ hardwareUnit()->setFieldOfView(1, m_recommendedFOVRight);
+ }
+}
+
+DOMRect* HMDVRDevice::getRecommendedEyeRenderRect(const String& whichEye)
+{
+ // TODO: This doesn't change unless you reset the FOV. Cache it.
Ken Russell (switch to Gerrit) 2015/02/04 19:14:00 Add owner for TODOs throughout.
+ blink::WebSize size;
+ blink::Platform::current()->getVRRenderTargetSize(index(),
+ hardwareUnit()->getFieldOfView(HMDVRDevice::VREyeLeft),
+ hardwareUnit()->getFieldOfView(HMDVRDevice::VREyeRight),
+ &size);
+
+ // TODO: We can actually fetch individual eye rects from the Oculus SDK.
+ // Plumb that through and expose it here.
+ switch (StringToVREye(whichEye)) {
+ case VREyeRight:
+ return DOMRect::create(size.width / 2.0f, 0, size.width / 2.0f, size.height);
+ default:
+ return DOMRect::create(0, 0, size.width / 2.0f, size.height);
+ }
+}
+
+void HMDVRDevice::trace(Visitor* visitor)
+{
+ VRDevice::trace(visitor);
+
+ visitor->trace(m_recommendedFOVLeft);
+ visitor->trace(m_recommendedFOVRight);
+ visitor->trace(m_maximumFOVLeft);
+ visitor->trace(m_maximumFOVRight);
+ visitor->trace(m_eyeTranslationLeft);
+ visitor->trace(m_eyeTranslationRight);
+}
+
+} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698