| OLD | NEW |
| 1 // Copyright (c) 2017 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2017 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 #define _USE_MATH_DEFINES // for M_PI | 5 #define _USE_MATH_DEFINES // for M_PI |
| 6 #include "device/vr/openvr/openvr_device.h" | 6 #include "device/vr/openvr/openvr_device.h" |
| 7 #include <math.h> | 7 #include <math.h> |
| 8 #include "third_party/openvr/src/headers/openvr.h" | 8 #include "third_party/openvr/src/headers/openvr.h" |
| 9 | 9 |
| 10 namespace { | 10 namespace { |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 69 transform[13] = mat.m[1][3]; | 69 transform[13] = mat.m[1][3]; |
| 70 transform[14] = mat.m[2][3]; | 70 transform[14] = mat.m[2][3]; |
| 71 transform[15] = 1.0f; | 71 transform[15] = 1.0f; |
| 72 return transform; | 72 return transform; |
| 73 } | 73 } |
| 74 | 74 |
| 75 } // namespace | 75 } // namespace |
| 76 | 76 |
| 77 namespace device { | 77 namespace device { |
| 78 | 78 |
| 79 OpenVRDevice::OpenVRDevice() {} | 79 OpenVRDevice::OpenVRDevice(vr::IVRSystem* vr) : vr_system_(vr) {} |
| 80 OpenVRDevice::~OpenVRDevice() {} | 80 OpenVRDevice::~OpenVRDevice() {} |
| 81 | 81 |
| 82 void OpenVRDevice::CreateVRDisplayInfo( | 82 void OpenVRDevice::CreateVRDisplayInfo( |
| 83 const base::Callback<void(mojom::VRDisplayInfoPtr)>& on_created) { | 83 const base::Callback<void(mojom::VRDisplayInfoPtr)>& on_created) { |
| 84 vr::EVRInitError init_error; | 84 if (!vr_system_) { |
| 85 auto vr_system = | |
| 86 vr::VR_Init(&init_error, vr::EVRApplicationType::VRApplication_Scene); | |
| 87 | |
| 88 if (init_error != vr::VRInitError_None) { | |
| 89 LOG(ERROR) << vr::VR_GetVRInitErrorAsEnglishDescription(init_error); | |
| 90 on_created.Run(nullptr); | 85 on_created.Run(nullptr); |
| 91 return; | 86 return; |
| 92 } | 87 } |
| 93 | 88 |
| 94 mojom::VRDisplayInfoPtr device = mojom::VRDisplayInfo::New(); | 89 mojom::VRDisplayInfoPtr device = mojom::VRDisplayInfo::New(); |
| 95 device->index = id(); | 90 device->index = id(); |
| 96 device->displayName = | 91 device->displayName = |
| 97 GetOpenVRString(vr_system, vr::Prop_ManufacturerName_String) + " " + | 92 GetOpenVRString(vr_system_, vr::Prop_ManufacturerName_String) + " " + |
| 98 GetOpenVRString(vr_system, vr::Prop_ModelNumber_String); | 93 GetOpenVRString(vr_system_, vr::Prop_ModelNumber_String); |
| 99 device->capabilities = mojom::VRDisplayCapabilities::New(); | 94 device->capabilities = mojom::VRDisplayCapabilities::New(); |
| 100 device->capabilities->hasPosition = true; | 95 device->capabilities->hasPosition = true; |
| 101 device->capabilities->hasExternalDisplay = true; | 96 device->capabilities->hasExternalDisplay = true; |
| 102 device->capabilities->canPresent = false; | 97 device->capabilities->canPresent = false; |
| 103 | 98 |
| 104 device->leftEye = mojom::VREyeParameters::New(); | 99 device->leftEye = mojom::VREyeParameters::New(); |
| 105 device->rightEye = mojom::VREyeParameters::New(); | 100 device->rightEye = mojom::VREyeParameters::New(); |
| 106 mojom::VREyeParametersPtr& left_eye = device->leftEye; | 101 mojom::VREyeParametersPtr& left_eye = device->leftEye; |
| 107 mojom::VREyeParametersPtr& right_eye = device->rightEye; | 102 mojom::VREyeParametersPtr& right_eye = device->rightEye; |
| 108 | 103 |
| 109 left_eye->fieldOfView = openVRFovToWebVRFov(vr_system, vr::Eye_Left); | 104 left_eye->fieldOfView = openVRFovToWebVRFov(vr_system_, vr::Eye_Left); |
| 110 right_eye->fieldOfView = openVRFovToWebVRFov(vr_system, vr::Eye_Left); | 105 right_eye->fieldOfView = openVRFovToWebVRFov(vr_system_, vr::Eye_Left); |
| 111 | 106 |
| 112 vr::TrackedPropertyError error = vr::TrackedProp_Success; | 107 vr::TrackedPropertyError error = vr::TrackedProp_Success; |
| 113 float ipd = vr_system->GetFloatTrackedDeviceProperty( | 108 float ipd = vr_system_->GetFloatTrackedDeviceProperty( |
| 114 vr::k_unTrackedDeviceIndex_Hmd, vr::Prop_UserIpdMeters_Float, &error); | 109 vr::k_unTrackedDeviceIndex_Hmd, vr::Prop_UserIpdMeters_Float, &error); |
| 115 | 110 |
| 116 if (error != vr::TrackedProp_Success) | 111 if (error != vr::TrackedProp_Success) |
| 117 ipd = kDefaultIPD; | 112 ipd = kDefaultIPD; |
| 118 | 113 |
| 119 left_eye->offset.resize(3); | 114 left_eye->offset.resize(3); |
| 120 left_eye->offset[0] = -ipd * 0.5; | 115 left_eye->offset[0] = -ipd * 0.5; |
| 121 left_eye->offset[1] = 0.0f; | 116 left_eye->offset[1] = 0.0f; |
| 122 left_eye->offset[2] = 0.0f; | 117 left_eye->offset[2] = 0.0f; |
| 123 right_eye->offset.resize(3); | 118 right_eye->offset.resize(3); |
| 124 right_eye->offset[0] = ipd * 0.5; | 119 right_eye->offset[0] = ipd * 0.5; |
| 125 right_eye->offset[1] = 0.0; | 120 right_eye->offset[1] = 0.0; |
| 126 right_eye->offset[2] = 0.0; | 121 right_eye->offset[2] = 0.0; |
| 127 | 122 |
| 128 uint32_t width, height; | 123 uint32_t width, height; |
| 129 vr_system->GetRecommendedRenderTargetSize(&width, &height); | 124 vr_system_->GetRecommendedRenderTargetSize(&width, &height); |
| 130 left_eye->renderWidth = width; | 125 left_eye->renderWidth = width; |
| 131 left_eye->renderHeight = height; | 126 left_eye->renderHeight = height; |
| 132 right_eye->renderWidth = left_eye->renderWidth; | 127 right_eye->renderWidth = left_eye->renderWidth; |
| 133 right_eye->renderHeight = left_eye->renderHeight; | 128 right_eye->renderHeight = left_eye->renderHeight; |
| 134 | 129 |
| 135 device->stageParameters = mojom::VRStageParameters::New(); | 130 device->stageParameters = mojom::VRStageParameters::New(); |
| 136 vr::HmdMatrix34_t mat = | 131 vr::HmdMatrix34_t mat = |
| 137 vr_system->GetSeatedZeroPoseToStandingAbsoluteTrackingPose(); | 132 vr_system_->GetSeatedZeroPoseToStandingAbsoluteTrackingPose(); |
| 138 device->stageParameters->standingTransform = | 133 device->stageParameters->standingTransform = |
| 139 HmdMatrix34ToWebVRTransformMatrix(mat); | 134 HmdMatrix34ToWebVRTransformMatrix(mat); |
| 140 | 135 |
| 141 vr::IVRChaperone* chaperone = vr::VRChaperone(); | 136 vr::IVRChaperone* chaperone = vr::VRChaperone(); |
| 142 if (chaperone) { | 137 if (chaperone) { |
| 143 chaperone->GetPlayAreaSize(&device->stageParameters->sizeX, | 138 chaperone->GetPlayAreaSize(&device->stageParameters->sizeX, |
| 144 &device->stageParameters->sizeZ); | 139 &device->stageParameters->sizeZ); |
| 145 } else { | 140 } else { |
| 146 device->stageParameters->sizeX = 0.0f; | 141 device->stageParameters->sizeX = 0.0f; |
| 147 device->stageParameters->sizeZ = 0.0f; | 142 device->stageParameters->sizeZ = 0.0f; |
| 148 } | 143 } |
| 149 | 144 |
| 150 render_loop_ = std::make_unique<OpenVRRenderLoop>(vr_system); | 145 render_loop_ = std::make_unique<OpenVRRenderLoop>(vr_system_); |
| 151 | 146 |
| 152 on_created.Run(std::move(device)); | 147 on_created.Run(std::move(device)); |
| 153 } | 148 } |
| 154 | 149 |
| 155 void OpenVRDevice::RequestPresent(mojom::VRSubmitFrameClientPtr submit_client, | 150 void OpenVRDevice::RequestPresent(mojom::VRSubmitFrameClientPtr submit_client, |
| 156 const base::Callback<void(bool)>& callback) { | 151 const base::Callback<void(bool)>& callback) { |
| 157 callback.Run(false); | 152 callback.Run(false); |
| 158 // We don't support presentation currently. | 153 // We don't support presentation currently. |
| 159 } | 154 } |
| 160 | 155 |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 249 base::TimeDelta time = base::TimeDelta::FromSecondsD(2.0); | 244 base::TimeDelta time = base::TimeDelta::FromSecondsD(2.0); |
| 250 | 245 |
| 251 device::mojom::VRPosePtr pose = getPose(); | 246 device::mojom::VRPosePtr pose = getPose(); |
| 252 Sleep(11); // TODO (billorr): Use real vsync timing instead of a sleep (this | 247 Sleep(11); // TODO (billorr): Use real vsync timing instead of a sleep (this |
| 253 // sleep just throttles vsyncs so we don't fill message queues). | 248 // sleep just throttles vsyncs so we don't fill message queues). |
| 254 callback.Run(std::move(pose), time, frame, | 249 callback.Run(std::move(pose), time, frame, |
| 255 device::mojom::VRVSyncProvider::Status::SUCCESS); | 250 device::mojom::VRVSyncProvider::Status::SUCCESS); |
| 256 } | 251 } |
| 257 | 252 |
| 258 } // namespace device | 253 } // namespace device |
| OLD | NEW |