source-engine/inputsystem/novint.cpp
FluorescentCIAAfricanAmerican 3bf9df6b27 1
2020-04-22 12:56:21 -04:00

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);
}