📄 input_device_directinput.cpp
字号:
//
// Microsoft monkey #1: "I got this cool idea. We simply just do a memcpy from the driver
// to the directinput application and returns offsets into the struct that changed"
//
// Microsoft monkey #2: "Aw cool man. That's like.. even better than the MAPI API I did back
// in 1994.. Brilliant"
//
// Monkey #1 and #2 laughs evilly
for (unsigned int i=0; i<num_events; i++)
{
CL_InputEvent event;
event.device = CL_InputDevice(this);
event.mouse_pos = window->mouse_pos;
event.left_alt = window->left_alt_down;
event.right_alt = window->right_alt_down;
event.left_ctrl = window->left_ctrl_down;
event.right_ctrl = window->right_ctrl_down;
event.left_shift = window->left_shift_down;
event.right_shift = window->right_shift_down;
event.repeat_count = 0;
if (buffer[i].dwOfs == FIELD_OFFSET(DIJOYSTATE2, lX))
{
// X Axis position event
event.type = CL_InputEvent::axis_moved;
event.id = 0;
event.axis_pos = float(buffer[i].dwData)/(0xffff/2)-1.0f;
sig_axis_move.call(event);
}
else if (buffer[i].dwOfs == FIELD_OFFSET(DIJOYSTATE2, lY))
{
// Y Axis position event
event.type = CL_InputEvent::axis_moved;
event.id = 1;
event.axis_pos = float(buffer[i].dwData)/(0xffff/2)-1.0f;
sig_axis_move.call(event);
}
else if (buffer[i].dwOfs == FIELD_OFFSET(DIJOYSTATE2, lZ))
{
// Z Axis position event
event.type = CL_InputEvent::axis_moved;
event.id = 2;
event.axis_pos = float(buffer[i].dwData)/(0xffff/2)-1.0f;
sig_axis_move.call(event);
}
else if (buffer[i].dwOfs == FIELD_OFFSET(DIJOYSTATE2, rglSlider[0]))
{
// extra 1 axis position event
event.type = CL_InputEvent::axis_moved;
event.id = 3;
event.axis_pos = float(buffer[i].dwData)/(0xffff/2)-1.0f;
sig_axis_move.call(event);
}
else if (buffer[i].dwOfs == FIELD_OFFSET(DIJOYSTATE2, rglSlider[1]))
{
// extra 2 axis position event
event.type = CL_InputEvent::axis_moved;
event.id = 4;
event.axis_pos = float(buffer[i].dwData)/(0xffff/2)-1.0f;
sig_axis_move.call(event);
}
else if (buffer[i].dwOfs >= FIELD_OFFSET(DIJOYSTATE2, rgbButtons) && buffer[i].dwOfs < FIELD_OFFSET(DIJOYSTATE2, rgbButtons)+128)
{
// Button event
int button_index = buffer[i].dwOfs - FIELD_OFFSET(DIJOYSTATE2, rgbButtons);
event.id = button_index;
if (LOBYTE(buffer[i].dwData)) // If high bit of lower byte is set, key is down
{
event.type = CL_InputEvent::pressed;
sig_key_down.call(event);
}
else
{
event.type = CL_InputEvent::released;
sig_key_up.call(event);
}
}
else if (buffer[i].dwOfs >= FIELD_OFFSET(DIJOYSTATE2, rgdwPOV) && buffer[i].dwOfs < FIELD_OFFSET(DIJOYSTATE2, rgdwPOV)+4*sizeof(DWORD))
{
// Hat event:
int hat_index = (buffer[i].dwOfs - FIELD_OFFSET(DIJOYSTATE2, rgdwPOV)) / sizeof(DWORD);
bool centered = (LOWORD(buffer[i].dwData) == 0xFFFF);
int direction = buffer[i].dwData / DI_DEGREES;
if (centered) direction = -1;
event.type = CL_InputEvent::axis_moved;
event.id = 32 + hat_index;
event.axis_pos = float(direction);
sig_axis_move.call(event);
}
else if (buffer[i].dwOfs == FIELD_OFFSET(DIJOYSTATE2, lRx))
{
// X Axis rotation event
event.type = CL_InputEvent::axis_moved;
event.id = 5;
event.axis_pos = float(buffer[i].dwData)/(0xffff/2)-1.0f;
sig_axis_move.call(event);
}
else if (buffer[i].dwOfs == FIELD_OFFSET(DIJOYSTATE2, lRy))
{
// Y Axis rotation event
event.type = CL_InputEvent::axis_moved;
event.id = 6;
event.axis_pos = float(buffer[i].dwData)/(0xffff/2)-1.0f;
sig_axis_move.call(event);
}
else if (buffer[i].dwOfs == FIELD_OFFSET(DIJOYSTATE2, lRz))
{
// Z Axis rotation event
event.type = CL_InputEvent::axis_moved;
event.id = 7;
event.axis_pos = float(buffer[i].dwData)/(0xffff/2)-1.0f;
sig_axis_move.call(event);
}
else if (buffer[i].dwOfs == FIELD_OFFSET(DIJOYSTATE2, lVX))
{
// X Axis velocity event
event.type = CL_InputEvent::axis_moved;
event.id = 8;
event.axis_pos = float(buffer[i].dwData)/(0xffff/2)-1.0f;
sig_axis_move.call(event);
}
else if (buffer[i].dwOfs == FIELD_OFFSET(DIJOYSTATE2, lVY))
{
// Y Axis velocity event
event.type = CL_InputEvent::axis_moved;
event.id = 9;
event.axis_pos = float(buffer[i].dwData)/(0xffff/2)-1.0f;
sig_axis_move.call(event);
}
else if (buffer[i].dwOfs == FIELD_OFFSET(DIJOYSTATE2, lVZ))
{
// Z Axis velocity event
event.type = CL_InputEvent::axis_moved;
event.id = 10;
event.axis_pos = float(buffer[i].dwData)/(0xffff/2)-1.0f;
sig_axis_move.call(event);
}
else if (buffer[i].dwOfs == FIELD_OFFSET(DIJOYSTATE2, lVRx))
{
// X Axis angular velocity event
event.type = CL_InputEvent::axis_moved;
event.id = 11;
event.axis_pos = float(buffer[i].dwData)/(0xffff/2)-1.0f;
sig_axis_move.call(event);
}
else if (buffer[i].dwOfs == FIELD_OFFSET(DIJOYSTATE2, lVRy))
{
// Y Axis angular velocity event
event.type = CL_InputEvent::axis_moved;
event.id = 12;
event.axis_pos = float(buffer[i].dwData)/(0xffff/2)-1.0f;
sig_axis_move.call(event);
}
else if (buffer[i].dwOfs == FIELD_OFFSET(DIJOYSTATE2, lVRz))
{
// Z Axis angular velocity event
event.type = CL_InputEvent::axis_moved;
event.id = 13;
event.axis_pos = float(buffer[i].dwData)/(0xffff/2)-1.0f;
sig_axis_move.call(event);
}
else if (buffer[i].dwOfs == FIELD_OFFSET(DIJOYSTATE2, rglVSlider[0]))
{
// extra 1 axis velocity event
event.type = CL_InputEvent::axis_moved;
event.id = 14;
event.axis_pos = float(buffer[i].dwData)/(0xffff/2)-1.0f;
sig_axis_move.call(event);
}
else if (buffer[i].dwOfs == FIELD_OFFSET(DIJOYSTATE2, rglVSlider[1]))
{
// extra 2 axis velocity event
event.type = CL_InputEvent::axis_moved;
event.id = 15;
event.axis_pos = float(buffer[i].dwData)/(0xffff/2)-1.0f;
sig_axis_move.call(event);
}
else if (buffer[i].dwOfs == FIELD_OFFSET(DIJOYSTATE2, lAX))
{
// X Axis acceleration event
event.type = CL_InputEvent::axis_moved;
event.id = 16;
event.axis_pos = float(buffer[i].dwData)/(0xffff/2)-1.0f;
sig_axis_move.call(event);
}
else if (buffer[i].dwOfs == FIELD_OFFSET(DIJOYSTATE2, lAY))
{
// Y Axis acceleration event
event.type = CL_InputEvent::axis_moved;
event.id = 17;
event.axis_pos = float(buffer[i].dwData)/(0xffff/2)-1.0f;
sig_axis_move.call(event);
}
else if (buffer[i].dwOfs == FIELD_OFFSET(DIJOYSTATE2, lAZ))
{
// Z Axis acceleration event
event.type = CL_InputEvent::axis_moved;
event.id = 18;
event.axis_pos = float(buffer[i].dwData)/(0xffff/2)-1.0f;
sig_axis_move.call(event);
}
else if (buffer[i].dwOfs == FIELD_OFFSET(DIJOYSTATE2, lARx))
{
// X Axis angular acceleration event
event.type = CL_InputEvent::axis_moved;
event.id = 19;
event.axis_pos = float(buffer[i].dwData)/(0xffff/2)-1.0f;
sig_axis_move.call(event);
}
else if (buffer[i].dwOfs == FIELD_OFFSET(DIJOYSTATE2, lARy))
{
// Y Axis angular acceleration event
event.type = CL_InputEvent::axis_moved;
event.id = 20;
event.axis_pos = float(buffer[i].dwData)/(0xffff/2)-1.0f;
sig_axis_move.call(event);
}
else if (buffer[i].dwOfs == FIELD_OFFSET(DIJOYSTATE2, lARz))
{
// Z Axis angular acceleration event
event.type = CL_InputEvent::axis_moved;
event.id = 21;
event.axis_pos = float(buffer[i].dwData)/(0xffff/2)-1.0f;
sig_axis_move.call(event);
}
else if (buffer[i].dwOfs == FIELD_OFFSET(DIJOYSTATE2, rglASlider[0]))
{
// extra 1 axis acceleration event
event.type = CL_InputEvent::axis_moved;
event.id = 22;
event.axis_pos = float(buffer[i].dwData)/(0xffff/2)-1.0f;
sig_axis_move.call(event);
}
else if (buffer[i].dwOfs == FIELD_OFFSET(DIJOYSTATE2, rglASlider[1]))
{
// extra 2 axis acceleration event
event.type = CL_InputEvent::axis_moved;
event.id = 23;
event.axis_pos = float(buffer[i].dwData)/(0xffff/2)-1.0f;
sig_axis_move.call(event);
}
else if (buffer[i].dwOfs == FIELD_OFFSET(DIJOYSTATE2, lFX))
{
// X Axis force event
event.type = CL_InputEvent::axis_moved;
event.id = 24;
event.axis_pos = float(buffer[i].dwData)/(0xffff/2)-1.0f;
sig_axis_move.call(event);
}
else if (buffer[i].dwOfs == FIELD_OFFSET(DIJOYSTATE2, lFY))
{
// Y Axis force event
event.type = CL_InputEvent::axis_moved;
event.id = 25;
event.axis_pos = float(buffer[i].dwData)/(0xffff/2)-1.0f;
sig_axis_move.call(event);
}
else if (buffer[i].dwOfs == FIELD_OFFSET(DIJOYSTATE2, lFZ))
{
// Z Axis force event
event.type = CL_InputEvent::axis_moved;
event.id = 26;
event.axis_pos = float(buffer[i].dwData)/(0xffff/2)-1.0f;
sig_axis_move.call(event);
}
else if (buffer[i].dwOfs == FIELD_OFFSET(DIJOYSTATE2, lFRx))
{
// X Axis torque event
event.type = CL_InputEvent::axis_moved;
event.id = 27;
event.axis_pos = float(buffer[i].dwData)/(0xffff/2)-1.0f;
sig_axis_move.call(event);
}
else if (buffer[i].dwOfs == FIELD_OFFSET(DIJOYSTATE2, lFRy))
{
// Y Axis torque event
event.type = CL_InputEvent::axis_moved;
event.id = 28;
event.axis_pos = float(buffer[i].dwData)/(0xffff/2)-1.0f;
sig_axis_move.call(event);
}
else if (buffer[i].dwOfs == FIELD_OFFSET(DIJOYSTATE2, lFRz))
{
// Z Axis torque event
event.type = CL_InputEvent::axis_moved;
event.id = 29;
event.axis_pos = float(buffer[i].dwData)/(0xffff/2)-1.0f;
sig_axis_move.call(event);
}
else if (buffer[i].dwOfs == FIELD_OFFSET(DIJOYSTATE2, rglFSlider[0]))
{
// extra 1 axis force event
event.type = CL_InputEvent::axis_moved;
event.id = 30;
event.axis_pos = float(buffer[i].dwData)/(0xffff/2)-1.0f;
sig_axis_move.call(event);
}
else if (buffer[i].dwOfs == FIELD_OFFSET(DIJOYSTATE2, rglFSlider[1]))
{
// extra 2 axis force event
event.type = CL_InputEvent::axis_moved;
event.id = 31;
event.axis_pos = float(buffer[i].dwData)/(0xffff/2)-1.0f;
sig_axis_move.call(event);
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -