138 lines
3.9 KiB
C++
138 lines
3.9 KiB
C++
|
//========= 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);
|
||
|
|
||
|
}
|