diff options
Diffstat (limited to 'inputsystem/novint.cpp')
| -rw-r--r-- | inputsystem/novint.cpp | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/inputsystem/novint.cpp b/inputsystem/novint.cpp new file mode 100644 index 0000000..32bd481 --- /dev/null +++ b/inputsystem/novint.cpp @@ -0,0 +1,138 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//===========================================================================// + +#include "inputsystem.h" +#include "key_translation.h" +#include "inputsystem/ButtonCode.h" +#include "inputsystem/AnalogCode.h" +#include "tier1/convar.h" + +typedef void*(*NovintGetIHaptics_t)(void); +typedef bool (*NovintAttemptHWND_t)(void *hWnd); +typedef void (*NovintDisableHWND_t)(void); +typedef void (*NovintPollDevices_t)(void); +typedef bool (*NovintButtonState_t)(int nDevice, + int &down, + int &pressed, + int &released); +typedef int (*NovintDeviceCount_t)(); +typedef int (*NovintButtonCount_t)(int nDevice); +typedef bool (__cdecl *NovintMouseModeCallback_t) (void); +typedef void (*NovintInputActive_t)(bool bGameInput); +typedef __int64 (*NovintGetDeviceID_t)(int nDevice); + +NovintGetIHaptics_t NovintGetIHaptics = NULL; +NovintAttemptHWND_t NovintAttemptHWND = NULL; +NovintDisableHWND_t NovintDisableHWND = NULL; +NovintPollDevices_t NovintPollDevices = NULL; +NovintButtonState_t NovintButtonState = NULL; +NovintDeviceCount_t NovintDeviceCount = NULL; +NovintButtonCount_t NovintButtonCount = NULL; +NovintInputActive_t NovintInputActive = NULL; +NovintGetDeviceID_t NovintGetDeviceID = NULL; + +static CInputSystem *pNovintInputSystem = 0; + +static bool bNovintPure = false; + +bool __cdecl NovintDevicesInputMode(void) +{ + if(pNovintInputSystem) + { + return !bNovintPure; + } + return false; +} + +void *CInputSystem::GetHapticsInterfaceAddress(void)const +{ + if( NovintGetIHaptics ) + return NovintGetIHaptics(); + + return NULL; +} + +void CInputSystem::AttachWindowToNovintDevices( void * hWnd ) +{ + if( NovintAttemptHWND ) + NovintAttemptHWND( hWnd ); +} + +void CInputSystem::DetachWindowFromNovintDevices(void) +{ + if( NovintDisableHWND ) + NovintDisableHWND(); +} + +void CInputSystem::InitializeNovintDevices() +{ + pNovintInputSystem = this; + // assume no novint devices + m_bNovintDevices = false; + m_nNovintDeviceCount = 0; + + if(!m_pNovintDLL) + return; + + NovintGetIHaptics = (NovintGetIHaptics_t)GetProcAddress( (HMODULE)m_pNovintDLL, "NovintGetIHaptics" ); + NovintAttemptHWND = (NovintAttemptHWND_t)GetProcAddress( (HMODULE)m_pNovintDLL, "NovintAttemptHWND" ); + NovintDisableHWND = (NovintDisableHWND_t)GetProcAddress( (HMODULE)m_pNovintDLL, "NovintDisableHWND" ); + NovintPollDevices = (NovintPollDevices_t)GetProcAddress( (HMODULE)m_pNovintDLL, "NovintPollDevices" ); + NovintButtonState = (NovintButtonState_t)GetProcAddress( (HMODULE)m_pNovintDLL, "NovintButtonState" ); + NovintDeviceCount = (NovintDeviceCount_t)GetProcAddress( (HMODULE)m_pNovintDLL, "NovintDeviceCount" ); + NovintButtonCount = (NovintButtonCount_t)GetProcAddress( (HMODULE)m_pNovintDLL, "NovintButtonCount" ); + NovintGetDeviceID = (NovintGetDeviceID_t)GetProcAddress( (HMODULE)m_pNovintDLL, "NovintGetDeviceID" ); + NovintInputActive = (NovintInputActive_t)GetProcAddress( (HMODULE)m_pNovintDLL, "NovintInputActive" ); + + + m_nNovintDeviceCount = NovintDeviceCount(); + + if( m_nNovintDeviceCount > 0 ) + m_bNovintDevices = true; +} + +void CInputSystem::PollNovintDevices() +{ + if( NovintPollDevices ) + NovintPollDevices(); + + for ( int i = 0; i < m_nNovintDeviceCount; i++ ) + { + UpdateNovintDeviceButtonState(i); + } +} + +void CInputSystem::UpdateNovintDeviceButtonState(int nDevice) +{ + int nDown; + int nPressed; + int nReleased; + if(NovintButtonState(nDevice, nDown, nPressed, nReleased)) + { + for ( int i = 0; i < 4; i++ ) + { + ButtonCode_t code = (ButtonCode_t)( NOVINT_FIRST + ( nDevice * 4 ) + i ); + + if( nPressed & (1 << i) ) + { + PostButtonPressedEvent(IE_ButtonPressed, m_nLastSampleTick, code, KEY_NONE); + } + + if( nReleased & (1 << i) ) + { + PostButtonReleasedEvent(IE_ButtonReleased, m_nLastSampleTick, code, KEY_NONE); + } + } + } +} + +void CInputSystem::SetNovintPure( bool bPure ) +{ + bNovintPure = bPure; + if(NovintInputActive) + NovintInputActive(bNovintPure); + +}
\ No newline at end of file |