diff options
Diffstat (limited to 'LibOVR/Src/OVR_Linux_HMDDevice.cpp')
-rw-r--r-- | LibOVR/Src/OVR_Linux_HMDDevice.cpp | 408 |
1 files changed, 0 insertions, 408 deletions
diff --git a/LibOVR/Src/OVR_Linux_HMDDevice.cpp b/LibOVR/Src/OVR_Linux_HMDDevice.cpp deleted file mode 100644 index 633e665..0000000 --- a/LibOVR/Src/OVR_Linux_HMDDevice.cpp +++ /dev/null @@ -1,408 +0,0 @@ -/************************************************************************************ - -Filename : OVR_Linux_HMDDevice.h -Content : Linux HMDDevice implementation -Created : June 17, 2013 -Authors : Brant Lewis - -Copyright : Copyright 2013 Oculus VR, Inc. All Rights reserved. - -Licensed under the Oculus VR SDK License Version 2.0 (the "License"); -you may not use the Oculus VR SDK except in compliance with the License, -which is provided at the time of installation or download, or which -otherwise accompanies this software in either electronic or hard copy form. - -You may obtain a copy of the License at - -http://www.oculusvr.com/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, the Oculus VR SDK -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -*************************************************************************************/ - -#include "OVR_Linux_HMDDevice.h" - -#include "OVR_Linux_DeviceManager.h" - -#include "OVR_Profile.h" - -#include <X11/Xlib.h> -#include <X11/extensions/Xinerama.h> - -namespace OVR { namespace Linux { - -//------------------------------------------------------------------------------------- - -HMDDeviceCreateDesc::HMDDeviceCreateDesc(DeviceFactory* factory, const String& displayDeviceName, long dispId) - : DeviceCreateDesc(factory, Device_HMD), - DisplayDeviceName(displayDeviceName), - DesktopX(0), DesktopY(0), Contents(0), EyeToScreenDistance(0), - HResolution(0), VResolution(0), HScreenSize(0), VScreenSize(0), - DisplayId(dispId) -{ - DeviceId = DisplayDeviceName; - for (int i=0; i<4; i++) - DistortionK[i] = 0; -} - -HMDDeviceCreateDesc::HMDDeviceCreateDesc(const HMDDeviceCreateDesc& other) - : DeviceCreateDesc(other.pFactory, Device_HMD), - DeviceId(other.DeviceId), DisplayDeviceName(other.DisplayDeviceName), - DesktopX(other.DesktopX), DesktopY(other.DesktopY), Contents(other.Contents), - HResolution(other.HResolution), VResolution(other.VResolution), - HScreenSize(other.HScreenSize), VScreenSize(other.VScreenSize), - DisplayId(other.DisplayId), EyeToScreenDistance(other.EyeToScreenDistance) -{ - for (int i=0; i<4; i++) - DistortionK[i] = other.DistortionK[i]; -} - -HMDDeviceCreateDesc::MatchResult HMDDeviceCreateDesc::MatchDevice(const DeviceCreateDesc& other, - DeviceCreateDesc** pcandidate) const -{ - if ((other.Type != Device_HMD) || (other.pFactory != pFactory)) - return Match_None; - - // There are several reasons we can come in here: - // a) Matching this HMD Monitor created desc to OTHER HMD Monitor desc - // - Require exact device DeviceId/DeviceName match - // b) Matching SensorDisplayInfo created desc to OTHER HMD Monitor desc - // - This DeviceId is empty; becomes candidate - // c) Matching this HMD Monitor created desc to SensorDisplayInfo desc - // - This other.DeviceId is empty; becomes candidate - - const HMDDeviceCreateDesc& s2 = (const HMDDeviceCreateDesc&) other; - - if ((DeviceId == s2.DeviceId) && - (DisplayId == s2.DisplayId)) - { - // Non-null DeviceId may match while size is different if screen size was overwritten - // by SensorDisplayInfo in prior iteration. - if (!DeviceId.IsEmpty() || - ((HScreenSize == s2.HScreenSize) && - (VScreenSize == s2.VScreenSize)) ) - { - *pcandidate = 0; - return Match_Found; - } - } - - - // DisplayInfo takes precedence, although we try to match it first. - if ((HResolution == s2.HResolution) && - (VResolution == s2.VResolution) && - (HScreenSize == s2.HScreenSize) && - (VScreenSize == s2.VScreenSize)) - { - if (DeviceId.IsEmpty() && !s2.DeviceId.IsEmpty()) - { - *pcandidate = const_cast<DeviceCreateDesc*>((const DeviceCreateDesc*)this); - return Match_Candidate; - } - - *pcandidate = 0; - return Match_Found; - } - - // SensorDisplayInfo may override resolution settings, so store as candidate. - if (s2.DeviceId.IsEmpty()) - { - *pcandidate = const_cast<DeviceCreateDesc*>((const DeviceCreateDesc*)this); - return Match_Candidate; - } - // OTHER HMD Monitor desc may initialize DeviceName/Id - else if (DeviceId.IsEmpty()) - { - *pcandidate = const_cast<DeviceCreateDesc*>((const DeviceCreateDesc*)this); - return Match_Candidate; - } - - return Match_None; -} - - -bool HMDDeviceCreateDesc::UpdateMatchedCandidate(const DeviceCreateDesc& other, - bool* newDeviceFlag) -{ - // This candidate was the the "best fit" to apply sensor DisplayInfo to. - OVR_ASSERT(other.Type == Device_HMD); - - const HMDDeviceCreateDesc& s2 = (const HMDDeviceCreateDesc&) other; - - // Force screen size on resolution from SensorDisplayInfo. - // We do this because USB detection is more reliable as compared to HDMI EDID, - // which may be corrupted by splitter reporting wrong monitor - if (s2.DeviceId.IsEmpty()) - { - HScreenSize = s2.HScreenSize; - VScreenSize = s2.VScreenSize; - Contents |= Contents_Screen; - - if (s2.Contents & HMDDeviceCreateDesc::Contents_Distortion) - { - memcpy(DistortionK, s2.DistortionK, sizeof(float)*4); - Contents |= Contents_Distortion; - } - DeviceId = s2.DeviceId; - DisplayId = s2.DisplayId; - DisplayDeviceName = s2.DisplayDeviceName; - if (newDeviceFlag) *newDeviceFlag = true; - } - else if (DeviceId.IsEmpty()) - { - DeviceId = s2.DeviceId; - DisplayId = s2.DisplayId; - DisplayDeviceName = s2.DisplayDeviceName; - - // ScreenSize and Resolution are NOT assigned here, since they may have - // come from a sensor DisplayInfo (which has precedence over HDMI). - - if (newDeviceFlag) *newDeviceFlag = true; - } - else - { - if (newDeviceFlag) *newDeviceFlag = false; - } - - return true; -} - -bool HMDDeviceCreateDesc::MatchDevice(const String& path) -{ - return DeviceId.CompareNoCase(path) == 0; -} - -//------------------------------------------------------------------------------------- -// ***** HMDDeviceFactory - -HMDDeviceFactory HMDDeviceFactory::Instance; - -void HMDDeviceFactory::EnumerateDevices(EnumerateVisitor& visitor) -{ - // For now we'll assume the Rift DK1 is attached in extended monitor mode. Ultimately we need to - // use XFree86 to enumerate X11 screens in case the Rift is attached as a separate screen. We also - // need to be able to read the EDID manufacturer product code to be able to differentiate between - // Rift models. - - bool foundHMD = false; - - Display* display = XOpenDisplay(NULL); - if (display && XineramaIsActive(display)) - { - int numberOfScreens; - XineramaScreenInfo* screens = XineramaQueryScreens(display, &numberOfScreens); - - for (int i = 0; i < numberOfScreens; i++) - { - XineramaScreenInfo screenInfo = screens[i]; - - if (screenInfo.width == 1280 && screenInfo.height == 800) - { - String deviceName = "OVR0001"; - - HMDDeviceCreateDesc hmdCreateDesc(this, deviceName, i); - hmdCreateDesc.SetScreenParameters(screenInfo.x_org, screenInfo.y_org, 1280, 800, 0.14976f, 0.0936f); - - OVR_DEBUG_LOG_TEXT(("DeviceManager - HMD Found %s - %d\n", - deviceName.ToCStr(), i)); - - // Notify caller about detected device. This will call EnumerateAddDevice - // if the this is the first time device was detected. - visitor.Visit(hmdCreateDesc); - foundHMD = true; - break; - } - } - - XFree(screens); - } - - - // Real HMD device is not found; however, we still may have a 'fake' HMD - // device created via SensorDeviceImpl::EnumerateHMDFromSensorDisplayInfo. - // Need to find it and set 'Enumerated' to true to avoid Removal notification. - if (!foundHMD) - { - Ptr<DeviceCreateDesc> hmdDevDesc = getManager()->FindDevice("", Device_HMD); - if (hmdDevDesc) - hmdDevDesc->Enumerated = true; - } -} - -DeviceBase* HMDDeviceCreateDesc::NewDeviceInstance() -{ - return new HMDDevice(this); -} - -bool HMDDeviceCreateDesc::Is7Inch() const -{ - return (strstr(DeviceId.ToCStr(), "OVR0001") != 0) || (Contents & Contents_7Inch); -} - -Profile* HMDDeviceCreateDesc::GetProfileAddRef() const -{ - // Create device may override profile name, so get it from there is possible. - ProfileManager* profileManager = GetManagerImpl()->GetProfileManager(); - ProfileType profileType = GetProfileType(); - const char * profileName = pDevice ? - ((HMDDevice*)pDevice)->GetProfileName() : - profileManager->GetDefaultProfileName(profileType); - - return profileName ? - profileManager->LoadProfile(profileType, profileName) : - profileManager->GetDeviceDefaultProfile(profileType); -} - - -bool HMDDeviceCreateDesc::GetDeviceInfo(DeviceInfo* info) const -{ - if ((info->InfoClassType != Device_HMD) && - (info->InfoClassType != Device_None)) - return false; - - bool is7Inch = Is7Inch(); - - OVR_strcpy(info->ProductName, DeviceInfo::MaxNameLength, - is7Inch ? "Oculus Rift DK1" : - ((HResolution >= 1920) ? "Oculus Rift DK HD" : "Oculus Rift DK1-Prototype") ); - OVR_strcpy(info->Manufacturer, DeviceInfo::MaxNameLength, "Oculus VR"); - info->Type = Device_HMD; - info->Version = 0; - - // Display detection. - if (info->InfoClassType == Device_HMD) - { - HMDInfo* hmdInfo = static_cast<HMDInfo*>(info); - - hmdInfo->DesktopX = DesktopX; - hmdInfo->DesktopY = DesktopY; - hmdInfo->HResolution = HResolution; - hmdInfo->VResolution = VResolution; - hmdInfo->HScreenSize = HScreenSize; - hmdInfo->VScreenSize = VScreenSize; - hmdInfo->VScreenCenter = VScreenSize * 0.5f; - hmdInfo->InterpupillaryDistance = 0.064f; // Default IPD; should be configurable. - hmdInfo->LensSeparationDistance = 0.0635f; - - // Obtain IPD from profile. - Ptr<Profile> profile = *GetProfileAddRef(); - - if (profile) - { - hmdInfo->InterpupillaryDistance = profile->GetIPD(); - // TBD: Switch on EyeCup type. - } - - if (Contents & Contents_Distortion) - { - memcpy(hmdInfo->DistortionK, DistortionK, sizeof(float)*4); - hmdInfo->EyeToScreenDistance = EyeToScreenDistance; - } - else - { - if (is7Inch) - { - // 7" screen. - hmdInfo->DistortionK[0] = 1.0f; - hmdInfo->DistortionK[1] = 0.22f; - hmdInfo->DistortionK[2] = 0.24f; - hmdInfo->EyeToScreenDistance = 0.041f; - } - else - { - hmdInfo->DistortionK[0] = 1.0f; - hmdInfo->DistortionK[1] = 0.18f; - hmdInfo->DistortionK[2] = 0.115f; - - if (HResolution == 1920) - hmdInfo->EyeToScreenDistance = 0.040f; - else - hmdInfo->EyeToScreenDistance = 0.0387f; - } - } - - hmdInfo->ChromaAbCorrection[0] = 0.996f; - hmdInfo->ChromaAbCorrection[1] = -0.004f; - hmdInfo->ChromaAbCorrection[2] = 1.014f; - hmdInfo->ChromaAbCorrection[3] = 0.0f; - - OVR_strcpy(hmdInfo->DisplayDeviceName, sizeof(hmdInfo->DisplayDeviceName), - DisplayDeviceName.ToCStr()); - hmdInfo->DisplayId = DisplayId; - } - - return true; -} - -//------------------------------------------------------------------------------------- -// ***** HMDDevice - -HMDDevice::HMDDevice(HMDDeviceCreateDesc* createDesc) - : OVR::DeviceImpl<OVR::HMDDevice>(createDesc, 0) -{ -} -HMDDevice::~HMDDevice() -{ -} - -bool HMDDevice::Initialize(DeviceBase* parent) -{ - pParent = parent; - - // Initialize user profile to default for device. - ProfileManager* profileManager = GetManager()->GetProfileManager(); - ProfileName = profileManager->GetDefaultProfileName(getDesc()->GetProfileType()); - - return true; -} -void HMDDevice::Shutdown() -{ - ProfileName.Clear(); - pCachedProfile.Clear(); - pParent.Clear(); -} - -Profile* HMDDevice::GetProfile() const -{ - if (!pCachedProfile) - pCachedProfile = *getDesc()->GetProfileAddRef(); - return pCachedProfile.GetPtr(); -} - -const char* HMDDevice::GetProfileName() const -{ - return ProfileName.ToCStr(); -} - -bool HMDDevice::SetProfileName(const char* name) -{ - pCachedProfile.Clear(); - if (!name) - { - ProfileName.Clear(); - return 0; - } - if (GetManager()->GetProfileManager()->HasProfile(getDesc()->GetProfileType(), name)) - { - ProfileName = name; - return true; - } - return false; -} - -OVR::SensorDevice* HMDDevice::GetSensor() -{ - // Just return first sensor found since we have no way to match it yet. - OVR::SensorDevice* sensor = GetManager()->EnumerateDevices<SensorDevice>().CreateDevice(); - if (sensor) - sensor->SetCoordinateFrame(SensorDevice::Coord_HMD); - return sensor; -} - -}} // namespace OVR::Linux - - |