1 // Copyright 2019 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "device/vr/windows_mixed_reality/wrappers/wmr_input_source.h" 6 7 #include <windows.ui.input.spatial.h> 8 #include <wrl.h> 9 10 #include <cstdint> 11 12 #include "base/logging.h" 13 #include "device/vr/windows_mixed_reality/wrappers/wmr_pointer_source_pose.h" 14 15 using SourceHandedness = 16 ABI::Windows::UI::Input::Spatial::SpatialInteractionSourceHandedness; 17 using SourceKind = 18 ABI::Windows::UI::Input::Spatial::SpatialInteractionSourceKind; 19 20 using ABI::Windows::UI::Input::Spatial::ISpatialInteractionController; 21 using ABI::Windows::UI::Input::Spatial::ISpatialInteractionSource; 22 using Microsoft::WRL::ComPtr; 23 24 namespace device { 25 WMRControllerImpl(ComPtr<ISpatialInteractionController> controller)26WMRControllerImpl::WMRControllerImpl( 27 ComPtr<ISpatialInteractionController> controller) 28 : controller_(controller) { 29 DCHECK(controller_); 30 } 31 32 WMRControllerImpl::~WMRControllerImpl() = default; 33 ProductId()34uint16_t WMRControllerImpl::ProductId() { 35 uint16_t id = 0; 36 HRESULT hr = controller_->get_ProductId(&id); 37 DCHECK(SUCCEEDED(hr)); 38 return id; 39 } 40 VendorId()41uint16_t WMRControllerImpl::VendorId() { 42 uint16_t id = 0; 43 HRESULT hr = controller_->get_VendorId(&id); 44 DCHECK(SUCCEEDED(hr)); 45 return id; 46 } 47 48 ABI::Windows::UI::Input::Spatial::ISpatialInteractionSource* GetRawPtr() const49WMRInputSource::GetRawPtr() const { 50 // This should only ever be used by the real implementation, so by default 51 // make sure it's not called. 52 NOTREACHED(); 53 return nullptr; 54 } 55 WMRInputSourceImpl(ComPtr<ISpatialInteractionSource> source)56WMRInputSourceImpl::WMRInputSourceImpl(ComPtr<ISpatialInteractionSource> source) 57 : source_(source) { 58 DCHECK(source_); 59 source_.As(&source2_); 60 source_.As(&source3_); 61 } 62 63 WMRInputSourceImpl::~WMRInputSourceImpl() = default; 64 65 WMRInputSourceImpl::WMRInputSourceImpl(const WMRInputSourceImpl& other) = 66 default; 67 Id() const68uint32_t WMRInputSourceImpl::Id() const { 69 uint32_t val; 70 HRESULT hr = source_->get_Id(&val); 71 DCHECK(SUCCEEDED(hr)); 72 return val; 73 } 74 Kind() const75SourceKind WMRInputSourceImpl::Kind() const { 76 SourceKind val; 77 HRESULT hr = source_->get_Kind(&val); 78 DCHECK(SUCCEEDED(hr)); 79 return val; 80 } 81 IsPointingSupported() const82bool WMRInputSourceImpl::IsPointingSupported() const { 83 if (!source2_) 84 return false; 85 boolean val; 86 HRESULT hr = source2_->get_IsPointingSupported(&val); 87 DCHECK(SUCCEEDED(hr)); 88 return val; 89 } 90 Controller() const91std::unique_ptr<WMRController> WMRInputSourceImpl::Controller() const { 92 if (!source2_) 93 return nullptr; 94 ComPtr<ISpatialInteractionController> controller; 95 HRESULT hr = source2_->get_Controller(&controller); 96 if (SUCCEEDED(hr)) 97 return std::make_unique<WMRControllerImpl>(controller); 98 99 return nullptr; 100 } 101 Handedness() const102SourceHandedness WMRInputSourceImpl::Handedness() const { 103 if (!source3_) 104 return SourceHandedness::SpatialInteractionSourceHandedness_Unspecified; 105 SourceHandedness val; 106 HRESULT hr = source3_->get_Handedness(&val); 107 DCHECK(SUCCEEDED(hr)); 108 return val; 109 } 110 GetRawPtr() const111ISpatialInteractionSource* WMRInputSourceImpl::GetRawPtr() const { 112 return source_.Get(); 113 } 114 } // namespace device 115