+ improved Mouse emulation (fixed buttons, use Wiimote orientation to calculate absolute quantity of movement)

+ fixed menu pointer orientation
This commit is contained in:
ekeeke31 2009-04-21 15:20:15 +00:00
parent a5ac9544a8
commit 3f6925dc8a
5 changed files with 48 additions and 32 deletions

View File

@ -211,8 +211,8 @@ uint32 mouse_read()
case 5: /* Buttons state */
if (input.pad[mouse.Port] & INPUT_A) temp |= 0x01;
if (input.pad[mouse.Port] & INPUT_B) temp |= 0x02;
if (input.pad[mouse.Port] & INPUT_C) temp |= 0x04;
if (input.pad[mouse.Port] & INPUT_C) temp |= 0x02;
if (input.pad[mouse.Port] & INPUT_B) temp |= 0x04;
if (input.pad[mouse.Port] & INPUT_START) temp |= 0x08;
break;

View File

@ -162,10 +162,6 @@ int FileSortCallback(const void *f1, const void *f2)
****************************************************************************/
int FileSelector(unsigned char *buffer)
{
#ifdef HW_RVL
int x,y;
gui_butn *button;
#endif
short p;
int ret,i,yoffset,string_offset;
int go_up = 0;
@ -174,6 +170,12 @@ int FileSelector(unsigned char *buffer)
char fname[MAXPATHLEN];
FILE *xml,*snap;
#ifdef HW_RVL
int x,y;
gui_butn *button;
struct orient_t orient;
#endif
/* Initialize Menu */
gui_menu *m = &menu_browser;
GUI_InitMenu(m);
@ -295,7 +297,8 @@ int FileSelector(unsigned char *buffer)
y = m_input.ir.y;
/* draw wiimote pointer */
gxResetAngle(m_input.ir.angle);
WPAD_Orientation(0,&orient);
gxResetAngle(orient.roll);
gxDrawTexture(w_pointer, x-w_pointer->width/2, y-w_pointer->height/2, w_pointer->width, w_pointer->height,255);
gxResetAngle(0.0);

View File

@ -714,6 +714,7 @@ int GUI_WindowPrompt(gui_menu *parent, char *title, char *items[], u8 nb_items)
#ifdef HW_RVL
int x,y;
struct orient_t orient;
#endif
/* initialize data */
@ -817,7 +818,8 @@ int GUI_WindowPrompt(gui_menu *parent, char *title, char *items[], u8 nb_items)
y = m_input.ir.y;
/* draw wiimote pointer */
gxResetAngle(m_input.ir.angle);
WPAD_Orientation(0,&orient);
gxResetAngle(orient.roll);
gxDrawTexture(w_pointer,x-w_pointer->width/2,y-w_pointer->height/2,w_pointer->width,w_pointer->height,255);
gxResetAngle(0.0);
@ -943,6 +945,7 @@ int GUI_RunMenu(gui_menu *menu)
#ifdef HW_RVL
int i,x,y;
struct orient_t orient;
#endif
@ -966,7 +969,8 @@ int GUI_RunMenu(gui_menu *menu)
y = m_input.ir.y;
/* draw wiimote pointer */
gxResetAngle(m_input.ir.angle);
WPAD_Orientation(0,&orient);
gxResetAngle(orient.roll);
gxDrawTexture(w_pointer, x-w_pointer->width/2, y-w_pointer->height/2, w_pointer->width, w_pointer->height,255);
gxResetAngle(0.0);

View File

@ -242,9 +242,7 @@ static void pad_update(s8 num, u8 i)
*******************************/
#ifdef HW_RVL
#define PI 3.14159265f
s8 WPAD_StickX(u8 chan,u8 right)
static s8 WPAD_StickX(u8 chan,u8 right)
{
float mag = 0.0;
float ang = 0.0;
@ -281,13 +279,13 @@ s8 WPAD_StickX(u8 chan,u8 right)
/* calculate X value (angle need to be converted into radian) */
if (mag > 1.0) mag = 1.0;
else if (mag < -1.0) mag = -1.0;
double val = mag * sin(PI * ang/180.0f);
double val = mag * sin(M_PI * ang/180.0f);
return (s8)(val * 128.0f);
}
s8 WPAD_StickY(u8 chan, u8 right)
static s8 WPAD_StickY(u8 chan, u8 right)
{
float mag = 0.0;
float ang = 0.0;
@ -324,7 +322,7 @@ s8 WPAD_StickY(u8 chan, u8 right)
/* calculate X value (angle need to be converted into radian) */
if (mag > 1.0) mag = 1.0;
else if (mag < -1.0) mag = -1.0;
double val = mag * cos(PI * ang/180.0f);
double val = mag * cos(M_PI * ang/180.0f);
return (s8)(val * 128.0f);
}
@ -394,8 +392,8 @@ static void wpad_config(u8 num, u8 exp, u8 padtype)
}
}
float old_x = 0.0;
float old_y = 0.0;
/*float old_x = 0.0;
float old_y = 0.0;*/
static void wpad_update(s8 num, u8 i, u32 exp)
{
@ -412,6 +410,9 @@ static void wpad_update(s8 num, u8 i, u32 exp)
y = WPAD_StickY(num,0);
}
/* IR structure */
struct ir_t ir;
/* retrieve current key mapping */
u32 *wpad_keymap = config.wpad_keymap[exp + (3 * num)];
@ -446,7 +447,6 @@ static void wpad_update(s8 num, u8 i, u32 exp)
if (exp != WPAD_EXP_CLASSIC)
{
/* wiimote IR */
struct ir_t ir;
WPAD_IR(num, &ir);
if (ir.valid)
{
@ -474,7 +474,6 @@ static void wpad_update(s8 num, u8 i, u32 exp)
if (exp != WPAD_EXP_CLASSIC)
{
/* wiimote IR */
struct ir_t ir;
WPAD_IR(num, &ir);
if (ir.valid)
{
@ -485,21 +484,30 @@ static void wpad_update(s8 num, u8 i, u32 exp)
}
}
/* MOUSE quantity of movement (-256,256) */
/* MOUSE quantity of movement (-255,255) */
else if (input.dev[i] == DEVICE_MOUSE)
{
/* analog stick */
input.analog[2][0] = x * 2 / sensitivity;
input.analog[2][1] = 0 - y * 2 / sensitivity;
/* by default, use analog stick values */
input.analog[2][0] = (x * 2) / sensitivity;
input.analog[2][1] = - (y * 2) / sensitivity;
if (exp != WPAD_EXP_CLASSIC)
{
/* wiimote IR */
struct ir_t ir;
WPAD_IR(num, &ir);
if (ir.valid)
{
input.analog[2][0] = ir.x - old_x;
/* get wiimote orientation */
struct orient_t orient;
WPAD_Orientation(num,&orient);
/* horizontal axis (yaw is between -180 and 180 degrees) */
input.analog[2][0] = ((int)orient.yaw * 255) / 90;
/* vertical axis (pitch is between -180 and 180 degrees) */
input.analog[2][1] = ((int)orient.pitch * 255) / 90;
/*input.analog[2][0] = ir.x - old_x;
if (input.analog[2][0] > 256)
{
input.analog[2][0] = 256;
@ -529,19 +537,23 @@ static void wpad_update(s8 num, u8 i, u32 exp)
else
{
old_y = ir.y;
}
}*/
if (p & WPAD_BUTTON_B) input.pad[i] |= INPUT_B;
}
else
/* else
{
old_x += input.analog[2][0];
old_y += input.analog[2][1];
}
*/
}
if (!config.invert_mouse) input.analog[2][1] = 0 - input.analog[2][1];
/* Invert Y coordinate */
if (!config.invert_mouse)
{
input.analog[2][1] = -input.analog[2][1];
}
}
/* GAMEPAD directional buttons */

View File

@ -52,7 +52,4 @@ extern void gx_input_config(u8 num, u8 type, u8 padtype);
extern void gx_input_updateEmu(void);
extern void gx_input_updateMenu(u32 cnt);
extern s8 WPAD_StickX(u8 chan,u8 right);
extern s8 WPAD_StickY(u8 chan,u8 right);
#endif