Keyboard Wiimote emulation cleanup, phase one

git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4665 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
bztdlinux 2009-12-09 16:33:32 +00:00
parent 0fa1f968c7
commit 828bf052f0
3 changed files with 48 additions and 30 deletions

View File

@ -63,6 +63,13 @@ std::vector<InputCommon::CONTROLLER_INFO> joyinfo;
InputCommon::CONTROLLER_STATE_NEW PadState[4];
InputCommon::CONTROLLER_MAPPING_NEW PadMapping[4];
// Shake emulation
ShakeData::ShakeData() {
Shake = 0;
Roll = 0;
Pitch = 0;
}
// Keyboard input
KeyboardWiimote g_Wiimote_kbd;
KeyboardNunchuck g_NunchuckExt;

View File

@ -171,6 +171,15 @@ struct SIR
int Distance;
};
class ShakeData
{
public:
ShakeData();
int Shake;
int Roll, Pitch;
};
// Keyboard input
struct KeyboardWiimote
{
@ -190,6 +199,7 @@ struct KeyboardWiimote
// Raw X and Y coordinate and processed X and Y coordinates
SIR IR;
ShakeData shakeData;
};
extern KeyboardWiimote g_Wiimote_kbd;
struct KeyboardNunchuck
@ -207,6 +217,7 @@ struct KeyboardNunchuck
SHAKE,
LAST_CONSTANT
};
ShakeData shakeData;
};
extern KeyboardNunchuck g_NunchuckExt;
struct KeyboardClassicController

View File

@ -430,21 +430,19 @@ Y |. .|| Z
*/
// Global declarations for FillReportAcc: These variables are global
// For the shake function, Wiimote: wm = 0, Nunchuck: wm = 1
int Shake[] = {0, 0};
int Roll = 0, Pitch = 0;
void StartShake(ShakeData &shakeData) {
shakeData.Shake = 1;
}
// Single shake of all three directions
void SingleShake(int &_x, int &_y, int &_z, int wm)
// Single shake step of all three directions
void SingleShake(int &_x, int &_y, int &_z, ShakeData &shakeData)
{
#ifdef _WIN32
if (Shake[wm] == 0)
{
if((wm == 0 && IsKey(g_Wiimote_kbd.SHAKE)) || (wm == 1 && IsKey(g_NunchuckExt.SHAKE)))
Shake[wm] = 1;
}
switch(Shake[wm])
// if (shakeData.Shake == 0)
// {
// if((wm == 0 && IsKey(g_Wiimote_kbd.SHAKE)) || (wm == 1 && IsKey(g_NunchuckExt.SHAKE)))
// Shake[wm] = 1;
// }
switch(shakeData.Shake)
{
case 1:
case 3:
@ -474,11 +472,10 @@ void SingleShake(int &_x, int &_y, int &_z, int wm)
_z = 0x80;
break;
default:
Shake[wm] = -1;
shakeData.Shake = -1;
break;
}
Shake[wm]++;
#endif
shakeData.Shake++;
//if (Shake[wm] != 0) DEBUG_LOG(WIIMOTE, "Shake: %i - 0x%02x, 0x%02x, 0x%02x", Shake[wm], _x, _y, _z);
}
@ -614,16 +611,16 @@ void Tilt(int &_x, int &_y, int &_z)
// Select input method and return the x, y, x values
if (g_Config.Tilt.Type == g_Config.Tilt.KEYBOARD)
TiltWiimoteKeyboard(Roll, Pitch);
TiltWiimoteKeyboard(g_Wiimote_kbd.shakeData.Roll, g_Wiimote_kbd.shakeData.Pitch);
else if (g_Config.Tilt.Type == g_Config.Tilt.TRIGGER || g_Config.Tilt.Type == g_Config.Tilt.ANALOG1 || g_Config.Tilt.Type == g_Config.Tilt.ANALOG2)
TiltWiimoteGamepad(Roll, Pitch);
TiltWiimoteGamepad(g_Wiimote_kbd.shakeData.Roll, g_Wiimote_kbd.shakeData.Pitch);
// Adjust angles, it's only needed if both roll and pitch is used together
if (g_Config.Tilt.Range.Roll != 0 && g_Config.Tilt.Range.Pitch != 0)
AdjustAngles(Roll, Pitch);
AdjustAngles(g_Wiimote_kbd.shakeData.Roll, g_Wiimote_kbd.shakeData.Pitch);
// Calculate the accelerometer value from this tilt angle
PitchDegreeToAccelerometer(Roll, Pitch, _x, _y, _z);
PitchDegreeToAccelerometer(g_Wiimote_kbd.shakeData.Roll, g_Wiimote_kbd.shakeData.Pitch, _x, _y, _z);
//DEBUG_LOG(WIIMOTE, "Roll:%i, Pitch:%i, _x:%u, _y:%u, _z:%u", Roll, Pitch, _x, _y, _z);
}
@ -657,15 +654,17 @@ void FillReportAcc(wm_accel& _acc)
// Check that Dolphin is in focus
if (IsFocus())
{
// Shake the Wiimote
SingleShake(acc_x, acc_y, acc_z, 0);
// Check for shake button
if(IsKey(g_Wiimote_kbd.SHAKE)) StartShake(g_Wiimote_kbd.shakeData);
// Step the shake simulation one step
SingleShake(acc_x, acc_y, acc_z, g_Wiimote_kbd.shakeData);
// Tilt Wiimote, allow the shake function to interrupt it
if (Shake[0] == 0) Tilt(acc_x, acc_y, acc_z);
if (g_Wiimote_kbd.shakeData.Shake == 0) Tilt(acc_x, acc_y, acc_z);
// Boundary check
if (acc_x > 0xFF) acc_x = 0xFF;
else if (_acc.x < 0x00) acc_x = 0x00;
else if (acc_x < 0x00) acc_x = 0x00;
if (acc_y > 0xFF) acc_y = 0xFF;
else if (acc_y < 0x00) acc_y = 0x00;
if (acc_z > 0xFF) acc_z = 0xFF;
@ -812,8 +811,8 @@ void FillReportIR(wm_ir_extended& _ir0, wm_ir_extended& _ir1)
int x0 = 1023 - g_Config.iIRLeft - g_Config.iIRWidth * MouseX - SENSOR_BAR_WIDTH / 2;
int x1 = x0 + SENSOR_BAR_WIDTH;
RotateIRDot(Roll, x0, y0);
RotateIRDot(Roll, x1, y1);
RotateIRDot(g_Wiimote_kbd.shakeData.Roll, x0, y0);
RotateIRDot(g_Wiimote_kbd.shakeData.Roll, x1, y1);
// Converted to IR data
_ir0.x = x0 & 0xff; _ir0.xHi = x0 >> 8;
@ -889,8 +888,8 @@ void FillReportIRBasic(wm_ir_basic& _ir0, wm_ir_basic& _ir1)
int x1 = 1023 - g_Config.iIRLeft - g_Config.iIRWidth * MouseX - SENSOR_BAR_WIDTH / 2;
int x2 = x1 + SENSOR_BAR_WIDTH;
RotateIRDot(Roll, x1, y1);
RotateIRDot(Roll, x2, y2);
RotateIRDot(g_Wiimote_kbd.shakeData.Roll, x1, y1);
RotateIRDot(g_Wiimote_kbd.shakeData.Roll, x2, y2);
/* As with the extented report we settle with emulating two out of four
possible objects the only difference is that we don't report any size of
@ -967,8 +966,9 @@ void FillReportExtension(wm_extension& _ext)
int ext_ay = g_nu.cal_zero.y;
int ext_az = g_nu.cal_zero.z + g_nu.cal_g.z;
// Shake the Wiimote
SingleShake(ext_ax, ext_ay, ext_az, 1);
if(IsKey(g_NunchuckExt.SHAKE)) StartShake(g_NunchuckExt.shakeData);
// Shake the Nunchuk one frame
SingleShake(ext_ax, ext_ay, ext_az, g_NunchuckExt.shakeData);
_ext.ax = ext_ax;
_ext.ay = ext_ay;