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