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

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: Addressed sigbjornf@'s epic amount of feedback Created 5 years, 10 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..e59f576ec8a4b4b7a5cab426385558ca764254ee
--- /dev/null
+++ b/Source/modules/vr/HMDVRDevice.cpp
@@ -0,0 +1,151 @@
+// Copyright 2015 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);
+}
+
+} // namespace
+
+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);
+}
+
+VREye HMDVRDevice::StringToVREye(const String& whichEye)
+{
+ if (whichEye == "left")
+ return VREyeLeft;
+ if (whichEye == "right")
+ return VREyeRight;
+ return VREyeNone;
+}
+
+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(VREyeLeft, m_recommendedFOVLeft);
+ hardwareUnit()->setFieldOfView(VREyeRight, m_recommendedFOVRight);
+}
+
+DOMPoint* HMDVRDevice::getEyeTranslation(const String& whichEye)
+{
+ switch (StringToVREye(whichEye)) {
+ case VREyeLeft:
+ return m_eyeTranslationLeft;
+ case VREyeRight:
+ return m_eyeTranslationRight;
+ default:
+ return DOMPoint::create(0, 0, 0, 0);
+ }
+}
+
+VRFieldOfView* HMDVRDevice::getCurrentEyeFieldOfView(const String& whichEye)
+{
+ return hardwareUnit()->getCurrentEyeFieldOfView(StringToVREye(whichEye));
+}
+
+VRFieldOfView* HMDVRDevice::getRecommendedEyeFieldOfView(const String& whichEye)
+{
+ switch (StringToVREye(whichEye)) {
+ case VREyeLeft:
+ return new VRFieldOfView(*m_recommendedFOVLeft);
+ case VREyeRight:
+ return new VRFieldOfView(*m_recommendedFOVRight);
+ default:
+ return new VRFieldOfView();
+ }
+}
+
+VRFieldOfView* HMDVRDevice::getMaximumEyeFieldOfView(const String& whichEye)
+{
+ switch (StringToVREye(whichEye)) {
+ case VREyeLeft:
+ return new VRFieldOfView(*m_maximumFOVLeft);
+ case VREyeRight:
+ return new VRFieldOfView(*m_maximumFOVRight);
+ default:
+ return new VRFieldOfView();
+ }
+}
+
+DOMRect* HMDVRDevice::getRecommendedEyeRenderRect(const String& whichEye)
+{
+ // FIXME: This doesn't change unless you reset the FOV. Cache it.
+ blink::WebSize size;
+ blink::Platform::current()->getVRRenderTargetSize(index(),
+ hardwareUnit()->getFieldOfView(VREyeLeft),
+ hardwareUnit()->getFieldOfView(VREyeRight),
+ &size);
+
+ // FIXME: We can actually fetch individual eye rects from the Oculus SDK.
+ // Plumb that through and expose it here.
+ switch (StringToVREye(whichEye)) {
+ case VREyeLeft:
+ return DOMRect::create(0, 0, size.width / 2.0f, size.height);
+ case VREyeRight:
+ return DOMRect::create(size.width / 2.0f, 0, size.width / 2.0f, size.height);
+ default:
+ return DOMRect::create(0, 0, 0, 0);
+ }
+}
+
+void HMDVRDevice::setFieldOfView(VRFieldOfView* leftFov, VRFieldOfView* rightFov)
+{
+ // FIXME: Clamp to maxFOV
+ if (leftFov) {
+ hardwareUnit()->setFieldOfView(VREyeLeft, leftFov);
+ } else {
+ hardwareUnit()->setFieldOfView(VREyeLeft, m_recommendedFOVLeft);
+ }
+
+ if (rightFov) {
+ hardwareUnit()->setFieldOfView(VREyeRight, rightFov);
+ } else {
+ hardwareUnit()->setFieldOfView(VREyeRight, m_recommendedFOVRight);
+ }
+}
+
+void HMDVRDevice::trace(Visitor* 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);
+
+ VRDevice::trace(visitor);
+}
+
+} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698