Files
OpenRA/BluntDx/JoystickState.h
chrisf 206df3514e lets do this properly.
git-svn-id: svn://svn.ijw.co.nz/svn/OpenRa@1144 993157c7-ee19-0410-b2c4-bb4e9862e678
2007-07-10 02:24:10 +00:00

159 lines
2.8 KiB
C++

#pragma once
namespace BluntDirectX { namespace DirectInput {
#define joy_axis_limit 1000
#pragma unmanaged
int CALLBACK EnumDevicesCb( const DIDEVICEINSTANCE* inst, void* data )
{
DIDEVICEINSTANCE* pdata = (DIDEVICEINSTANCE*)data;
memcpy( pdata, inst, sizeof( DIDEVICEINSTANCE ) );
return DIENUM_STOP;
}
int CALLBACK EnumDeviceObjectsCb( const DIDEVICEOBJECTINSTANCE* inst, void* data )
{
IDirectInputDevice8* dev = (IDirectInputDevice8*) data;
DIPROPRANGE p;
p.diph.dwSize = sizeof(DIPROPRANGE);
p.diph.dwHeaderSize = sizeof(DIPROPHEADER);
p.diph.dwHow = DIPH_BYID;
p.diph.dwObj = inst->dwType;
p.lMin = -joy_axis_limit;
p.lMax = joy_axis_limit;
HRESULT hr;
if (FAILED(hr = dev->SetProperty( DIPROP_RANGE, &p.diph )))
return DIENUM_STOP;
return DIENUM_CONTINUE;
}
IDirectInputDevice8* CreateAndConfigureJoystick( IDirectInput8* di )
{
DIDEVICEINSTANCE inst;
memset( &inst, 0, sizeof(inst) );
di->EnumDevices( DI8DEVCLASS_GAMECTRL, EnumDevicesCb, (void*)&inst, DIEDFL_ATTACHEDONLY );
if (inst.dwSize == 0)
return nullptr;
IDirectInputDevice8* dev;
HRESULT hr = di->CreateDevice( inst.guidInstance, &dev, NULL );
if (FAILED(hr))
return nullptr;
hr = dev->EnumObjects( EnumDeviceObjectsCb, (void*)dev, DIDFT_AXIS );
if (FAILED(hr)) {
dev->Release();
return nullptr;
}
dev->SetDataFormat( &c_dfDIJoystick );
return dev;
}
#pragma managed
public ref class JoystickState
{
private:
DIJOYSTATE* pstate;
internal:
JoystickState(DIJOYSTATE* state)
{
DIJOYSTATE* p = new DIJOYSTATE;
pstate = p;
memcpy( pstate, state, sizeof( DIJOYSTATE ) );
}
public:
~JoystickState()
{
delete pstate;
}
property float x
{
float get()
{
return (float)pstate->lX / joy_axis_limit;
}
}
property float y
{
float get()
{
return (float)pstate->lY / joy_axis_limit;
}
}
property float z
{
float get()
{
return (float)pstate->lZ / joy_axis_limit;
}
}
property float rx
{
float get()
{
return (float)pstate->lRx / joy_axis_limit;
}
}
property float ry
{
float get()
{
return (float)pstate->lRy / joy_axis_limit;
}
}
property float rz
{
float get()
{
return (float)pstate->lRz / joy_axis_limit;
}
}
property float u
{
float get()
{
return (float)pstate->rglSlider[0] / joy_axis_limit;
}
}
property float v
{
float get()
{
return (float)pstate->rglSlider[1] / joy_axis_limit;
}
}
property int pov
{
int get()
{
return pstate->rgdwPOV[0];
}
}
bool button( int button )
{
return (pstate->rgbButtons[button] & 0x80) != 0;
}
};
}}