| 158 | } |
| 159 | |
| 160 | void ovrHmdStruct::UpdateHmdDesc() |
| 161 | { |
| 162 | HmdDesc.Type = ovrHmd_CV1; |
| 163 | |
| 164 | // Get HMD name |
| 165 | vr::VRSystem()->GetStringTrackedDeviceProperty(vr::k_unTrackedDeviceIndex_Hmd, vr::Prop_ModelNumber_String, HmdDesc.ProductName, 64); |
| 166 | vr::VRSystem()->GetStringTrackedDeviceProperty(vr::k_unTrackedDeviceIndex_Hmd, vr::Prop_ManufacturerName_String, HmdDesc.Manufacturer, 64); |
| 167 | |
| 168 | // Some games require a fake product name |
| 169 | if (UseHack(HACK_FAKE_PRODUCT_NAME)) |
| 170 | strcpy_s(HmdDesc.ProductName, 64, "Oculus Rift"); |
| 171 | |
| 172 | // TODO: Get HID information |
| 173 | HmdDesc.VendorId = 0; |
| 174 | HmdDesc.ProductId = 0; |
| 175 | |
| 176 | // Get serial number |
| 177 | vr::VRSystem()->GetStringTrackedDeviceProperty(vr::k_unTrackedDeviceIndex_Hmd, vr::Prop_SerialNumber_String, HmdDesc.SerialNumber, 24); |
| 178 | |
| 179 | // TODO: Get firmware version |
| 180 | HmdDesc.FirmwareMajor = 0; |
| 181 | HmdDesc.FirmwareMinor = 0; |
| 182 | |
| 183 | // Get capabilities |
| 184 | HmdDesc.AvailableHmdCaps = 0; |
| 185 | HmdDesc.DefaultHmdCaps = 0; |
| 186 | HmdDesc.AvailableTrackingCaps = ovrTrackingCap_Orientation | ovrTrackingCap_Position; |
| 187 | if (!vr::VRSystem()->GetBoolTrackedDeviceProperty(vr::k_unTrackedDeviceIndex_Hmd, vr::Prop_WillDriftInYaw_Bool)) |
| 188 | HmdDesc.AvailableTrackingCaps |= ovrTrackingCap_MagYawCorrection; |
| 189 | HmdDesc.DefaultTrackingCaps = ovrTrackingCap_Orientation | ovrTrackingCap_MagYawCorrection | ovrTrackingCap_Position; |
| 190 | |
| 191 | // Get the render target size |
| 192 | ovrSizei size; |
| 193 | vr::VRSystem()->GetRecommendedRenderTargetSize((uint32_t*)&size.w, (uint32_t*)&size.h); |
| 194 | |
| 195 | // Update the render descriptors |
| 196 | for (int eye = 0; eye < ovrEye_Count; eye++) |
| 197 | { |
| 198 | ovrEyeRenderDesc& desc = RenderDesc[eye]; |
| 199 | |
| 200 | OVR::FovPort eyeFov; |
| 201 | vr::VRSystem()->GetProjectionRaw((vr::EVREye)eye, &eyeFov.LeftTan, &eyeFov.RightTan, &eyeFov.DownTan, &eyeFov.UpTan); |
| 202 | eyeFov.LeftTan *= -1.0f; |
| 203 | eyeFov.DownTan *= -1.0f; |
| 204 | |
| 205 | desc.Eye = (ovrEyeType)eye; |
| 206 | desc.Fov = eyeFov; |
| 207 | |
| 208 | desc.DistortedViewport = OVR::Recti(eye == ovrEye_Left ? 0 : size.w, 0, size.w, size.h); |
| 209 | desc.PixelsPerTanAngleAtCenter = OVR::Vector2f(size.w * (MATH_FLOAT_PIOVER4 / eyeFov.GetHorizontalFovRadians()), |
| 210 | size.h * (MATH_FLOAT_PIOVER4 / eyeFov.GetVerticalFovRadians())); |
| 211 | |
| 212 | if (UseHack(HACK_RECONSTRUCT_EYE_MATRIX)) |
| 213 | { |
| 214 | float ipd = vr::VRSystem()->GetFloatTrackedDeviceProperty(vr::k_unTrackedDeviceIndex_Hmd, vr::Prop_UserIpdMeters_Float); |
| 215 | desc.HmdToEyePose.Orientation = OVR::Quatf::Identity(); |
| 216 | desc.HmdToEyePose.Position.x = (eye == ovrEye_Left) ? -ipd / 2.0f : ipd / 2.0f; |
| 217 | } |