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

Side by Side Diff: device/vr/openvr/openvr_device.cc

Issue 2825203004: Added support for OpenVR controllers (Closed)
Patch Set: Read pose by vr::TrackingUniverseSeated Created 3 years, 8 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 unified diff | Download patch
« no previous file with comments | « device/vr/openvr/openvr_device.h ('k') | device/vr/openvr/openvr_device_provider.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « device/vr/openvr/openvr_device.h ('k') | device/vr/openvr/openvr_device_provider.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698