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 15 matching lines...) Expand all Loading... |
26 | 26 |
27 std::vector<float> HmdVector3ToWebVR(const vr::HmdVector3_t& vec) { | 27 std::vector<float> HmdVector3ToWebVR(const vr::HmdVector3_t& vec) { |
28 std::vector<float> out; | 28 std::vector<float> out; |
29 out.resize(3); | 29 out.resize(3); |
30 out[0] = vec.v[0]; | 30 out[0] = vec.v[0]; |
31 out[1] = vec.v[1]; | 31 out[1] = vec.v[1]; |
32 out[2] = vec.v[2]; | 32 out[2] = vec.v[2]; |
33 return out; | 33 return out; |
34 } | 34 } |
35 | 35 |
| 36 std::string GetOpenVRString(vr::IVRSystem* vr_system, |
| 37 vr::TrackedDeviceProperty prop) { |
| 38 std::string out; |
| 39 |
| 40 vr::TrackedPropertyError error = vr::TrackedProp_Success; |
| 41 char openvr_string[vr::k_unMaxPropertyStringSize]; |
| 42 vr_system->GetStringTrackedDeviceProperty( |
| 43 vr::k_unTrackedDeviceIndex_Hmd, prop, openvr_string, |
| 44 vr::k_unMaxPropertyStringSize, &error); |
| 45 |
| 46 if (error == vr::TrackedProp_Success) |
| 47 out = openvr_string; |
| 48 |
| 49 return out; |
| 50 } |
| 51 |
| 52 std::vector<float> HmdMatrix34ToWebVRTransformMatrix( |
| 53 const vr::HmdMatrix34_t& mat) { |
| 54 std::vector<float> transform; |
| 55 transform.resize(16); |
| 56 transform[0] = mat.m[0][0]; |
| 57 transform[1] = mat.m[1][0]; |
| 58 transform[2] = mat.m[2][0]; |
| 59 transform[3] = 0.0f; |
| 60 transform[4] = mat.m[0][1]; |
| 61 transform[5] = mat.m[1][1]; |
| 62 transform[6] = mat.m[2][1]; |
| 63 transform[7] = 0.0f; |
| 64 transform[8] = mat.m[0][2]; |
| 65 transform[9] = mat.m[1][2]; |
| 66 transform[10] = mat.m[2][2]; |
| 67 transform[11] = 0.0f; |
| 68 transform[12] = mat.m[0][3]; |
| 69 transform[13] = mat.m[1][3]; |
| 70 transform[14] = mat.m[2][3]; |
| 71 transform[15] = 1.0f; |
| 72 return transform; |
| 73 } |
| 74 |
36 } // namespace | 75 } // namespace |
37 | 76 |
38 namespace device { | 77 namespace device { |
39 | 78 |
40 OpenVRDevice::OpenVRDevice() {} | 79 OpenVRDevice::OpenVRDevice() {} |
41 OpenVRDevice::~OpenVRDevice() {} | 80 OpenVRDevice::~OpenVRDevice() {} |
42 | 81 |
43 void OpenVRDevice::CreateVRDisplayInfo( | 82 void OpenVRDevice::CreateVRDisplayInfo( |
44 const base::Callback<void(mojom::VRDisplayInfoPtr)>& on_created) { | 83 const base::Callback<void(mojom::VRDisplayInfoPtr)>& on_created) { |
45 vr::EVRInitError init_error; | 84 vr::EVRInitError init_error; |
46 auto vr_system = | 85 auto vr_system = |
47 vr::VR_Init(&init_error, vr::EVRApplicationType::VRApplication_Scene); | 86 vr::VR_Init(&init_error, vr::EVRApplicationType::VRApplication_Scene); |
48 | 87 |
49 if (init_error != vr::VRInitError_None) { | 88 if (init_error != vr::VRInitError_None) { |
50 LOG(ERROR) << vr::VR_GetVRInitErrorAsEnglishDescription(init_error); | 89 LOG(ERROR) << vr::VR_GetVRInitErrorAsEnglishDescription(init_error); |
51 on_created.Run(nullptr); | 90 on_created.Run(nullptr); |
52 return; | 91 return; |
53 } | 92 } |
54 | 93 |
55 mojom::VRDisplayInfoPtr device = mojom::VRDisplayInfo::New(); | 94 mojom::VRDisplayInfoPtr device = mojom::VRDisplayInfo::New(); |
56 device->index = id(); | 95 device->index = id(); |
| 96 device->displayName = |
| 97 GetOpenVRString(vr_system, vr::Prop_ManufacturerName_String) + " " + |
| 98 GetOpenVRString(vr_system, vr::Prop_ModelNumber_String); |
57 device->capabilities = mojom::VRDisplayCapabilities::New(); | 99 device->capabilities = mojom::VRDisplayCapabilities::New(); |
58 device->capabilities->hasPosition = true; | 100 device->capabilities->hasPosition = true; |
59 device->capabilities->hasExternalDisplay = true; | 101 device->capabilities->hasExternalDisplay = true; |
60 device->capabilities->canPresent = false; | 102 device->capabilities->canPresent = false; |
61 | 103 |
62 device->leftEye = mojom::VREyeParameters::New(); | 104 device->leftEye = mojom::VREyeParameters::New(); |
63 device->rightEye = mojom::VREyeParameters::New(); | 105 device->rightEye = mojom::VREyeParameters::New(); |
64 mojom::VREyeParametersPtr& left_eye = device->leftEye; | 106 mojom::VREyeParametersPtr& left_eye = device->leftEye; |
65 mojom::VREyeParametersPtr& right_eye = device->rightEye; | 107 mojom::VREyeParametersPtr& right_eye = device->rightEye; |
66 | 108 |
(...skipping 16 matching lines...) Expand all Loading... |
83 right_eye->offset[1] = 0.0; | 125 right_eye->offset[1] = 0.0; |
84 right_eye->offset[2] = 0.0; | 126 right_eye->offset[2] = 0.0; |
85 | 127 |
86 uint32_t width, height; | 128 uint32_t width, height; |
87 vr_system->GetRecommendedRenderTargetSize(&width, &height); | 129 vr_system->GetRecommendedRenderTargetSize(&width, &height); |
88 left_eye->renderWidth = width; | 130 left_eye->renderWidth = width; |
89 left_eye->renderHeight = height; | 131 left_eye->renderHeight = height; |
90 right_eye->renderWidth = left_eye->renderWidth; | 132 right_eye->renderWidth = left_eye->renderWidth; |
91 right_eye->renderHeight = left_eye->renderHeight; | 133 right_eye->renderHeight = left_eye->renderHeight; |
92 | 134 |
| 135 device->stageParameters = mojom::VRStageParameters::New(); |
| 136 vr::HmdMatrix34_t mat = |
| 137 vr_system->GetSeatedZeroPoseToStandingAbsoluteTrackingPose(); |
| 138 device->stageParameters->standingTransform = |
| 139 HmdMatrix34ToWebVRTransformMatrix(mat); |
| 140 |
| 141 vr::IVRChaperone* chaperone = vr::VRChaperone(); |
| 142 if (chaperone) { |
| 143 chaperone->GetPlayAreaSize(&device->stageParameters->sizeX, |
| 144 &device->stageParameters->sizeZ); |
| 145 } else { |
| 146 device->stageParameters->sizeX = 0.0f; |
| 147 device->stageParameters->sizeZ = 0.0f; |
| 148 } |
| 149 |
93 render_loop_ = std::make_unique<OpenVRRenderLoop>(vr_system); | 150 render_loop_ = std::make_unique<OpenVRRenderLoop>(vr_system); |
94 | 151 |
95 on_created.Run(std::move(device)); | 152 on_created.Run(std::move(device)); |
96 } | 153 } |
97 | 154 |
98 void OpenVRDevice::RequestPresent(mojom::VRSubmitFrameClientPtr submit_client, | 155 void OpenVRDevice::RequestPresent(mojom::VRSubmitFrameClientPtr submit_client, |
99 const base::Callback<void(bool)>& callback) { | 156 const base::Callback<void(bool)>& callback) { |
100 callback.Run(false); | 157 callback.Run(false); |
101 // We don't support presentation currently. | 158 // We don't support presentation currently. |
102 } | 159 } |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
192 base::TimeDelta time = base::TimeDelta::FromSecondsD(2.0); | 249 base::TimeDelta time = base::TimeDelta::FromSecondsD(2.0); |
193 | 250 |
194 device::mojom::VRPosePtr pose = getPose(); | 251 device::mojom::VRPosePtr pose = getPose(); |
195 Sleep(11); // TODO (billorr): Use real vsync timing instead of a sleep (this | 252 Sleep(11); // TODO (billorr): Use real vsync timing instead of a sleep (this |
196 // sleep just throttles vsyncs so we don't fill message queues). | 253 // sleep just throttles vsyncs so we don't fill message queues). |
197 callback.Run(std::move(pose), time, frame, | 254 callback.Run(std::move(pose), time, frame, |
198 device::mojom::VRVSyncProvider::Status::SUCCESS); | 255 device::mojom::VRVSyncProvider::Status::SUCCESS); |
199 } | 256 } |
200 | 257 |
201 } // namespace device | 258 } // namespace device |
OLD | NEW |