snes9xgx/source/ngc/gui/gui_trigger.cpp

287 lines
6.4 KiB
C++
Raw Normal View History

2009-03-11 18:28:37 +01:00
/****************************************************************************
2009-04-10 10:12:37 +02:00
* libwiigui
2009-03-11 18:28:37 +01:00
*
2009-04-10 10:12:37 +02:00
* Tantric 2009
2009-03-11 18:28:37 +01:00
*
* gui_trigger.cpp
*
* GUI class definitions
***************************************************************************/
#include "gui.h"
2009-11-04 22:27:04 +01:00
#include <ogc/lwp_watchdog.h>
#include <gctypes.h>
2009-03-11 18:28:37 +01:00
2009-11-04 22:27:04 +01:00
static u64 prev[4];
static u64 now[4];
static u32 delay[4];
2009-03-11 18:28:37 +01:00
/**
* Constructor for the GuiTrigger class.
*/
GuiTrigger::GuiTrigger()
{
chan = -1;
2009-10-13 02:48:00 +02:00
memset(&wpaddata, 0, sizeof(WPADData));
2009-03-11 18:28:37 +01:00
memset(&pad, 0, sizeof(PADData));
2009-10-13 02:48:00 +02:00
wpad = &wpaddata;
2009-03-11 18:28:37 +01:00
}
/**
* Destructor for the GuiTrigger class.
*/
GuiTrigger::~GuiTrigger()
{
}
/**
* Sets a simple trigger. Requires:
* - Element is selected
* - Trigger button is pressed
*/
void GuiTrigger::SetSimpleTrigger(s32 ch, u32 wiibtns, u16 gcbtns)
{
type = TRIGGER_SIMPLE;
chan = ch;
2009-10-13 02:48:00 +02:00
wpaddata.btns_d = wiibtns;
2009-03-11 18:28:37 +01:00
pad.btns_d = gcbtns;
}
2009-04-10 10:12:37 +02:00
/**
* Sets a held trigger. Requires:
* - Element is selected
* - Trigger button is pressed and held
*/
void GuiTrigger::SetHeldTrigger(s32 ch, u32 wiibtns, u16 gcbtns)
{
type = TRIGGER_HELD;
chan = ch;
2009-10-13 02:48:00 +02:00
wpaddata.btns_h = wiibtns;
2009-04-10 10:12:37 +02:00
pad.btns_h = gcbtns;
}
2009-03-11 18:28:37 +01:00
/**
* Sets a button trigger. Requires:
* - Trigger button is pressed
*/
void GuiTrigger::SetButtonOnlyTrigger(s32 ch, u32 wiibtns, u16 gcbtns)
{
type = TRIGGER_BUTTON_ONLY;
chan = ch;
2009-10-13 02:48:00 +02:00
wpaddata.btns_d = wiibtns;
2009-03-11 18:28:37 +01:00
pad.btns_d = gcbtns;
}
/**
* Sets a button trigger. Requires:
* - Trigger button is pressed
* - Parent window is in focus
*/
void GuiTrigger::SetButtonOnlyInFocusTrigger(s32 ch, u32 wiibtns, u16 gcbtns)
{
type = TRIGGER_BUTTON_ONLY_IN_FOCUS;
chan = ch;
2009-10-13 02:48:00 +02:00
wpaddata.btns_d = wiibtns;
2009-03-11 18:28:37 +01:00
pad.btns_d = gcbtns;
}
/****************************************************************************
* WPAD_Stick
*
* Get X/Y value from Wii Joystick (classic, nunchuk) input
***************************************************************************/
2009-10-15 08:51:38 +02:00
s8 GuiTrigger::WPAD_Stick(u8 stick, int axis)
2009-03-11 18:28:37 +01:00
{
#ifdef HW_RVL
float mag = 0.0;
float ang = 0.0;
2009-10-13 02:48:00 +02:00
switch (wpad->exp.type)
2009-03-11 18:28:37 +01:00
{
case WPAD_EXP_NUNCHUK:
case WPAD_EXP_GUITARHERO3:
2009-10-15 08:51:38 +02:00
if (stick == 0)
2009-03-11 18:28:37 +01:00
{
2009-10-13 02:48:00 +02:00
mag = wpad->exp.nunchuk.js.mag;
ang = wpad->exp.nunchuk.js.ang;
2009-03-11 18:28:37 +01:00
}
break;
case WPAD_EXP_CLASSIC:
2009-10-15 08:51:38 +02:00
if (stick == 0)
2009-03-11 18:28:37 +01:00
{
2009-10-13 02:48:00 +02:00
mag = wpad->exp.classic.ljs.mag;
ang = wpad->exp.classic.ljs.ang;
2009-03-11 18:28:37 +01:00
}
else
{
2009-10-13 02:48:00 +02:00
mag = wpad->exp.classic.rjs.mag;
ang = wpad->exp.classic.rjs.ang;
2009-03-11 18:28:37 +01:00
}
break;
default:
break;
}
/* calculate x/y 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;
if(axis == 0) // x-axis
val = mag * sin((PI * ang)/180.0f);
else // y-axis
val = mag * cos((PI * ang)/180.0f);
return (s8)(val * 128.0f);
#else
return 0;
#endif
}
2009-10-15 08:51:38 +02:00
s8 GuiTrigger::WPAD_StickX(u8 stick)
{
return WPAD_Stick(stick, 0);
}
s8 GuiTrigger::WPAD_StickY(u8 stick)
{
return WPAD_Stick(stick, 1);
}
2009-03-11 18:28:37 +01:00
bool GuiTrigger::Left()
{
u32 wiibtn = GCSettings.WiimoteOrientation ? WPAD_BUTTON_UP : WPAD_BUTTON_LEFT;
2009-10-13 02:48:00 +02:00
if((wpad->btns_d | wpad->btns_h) & (wiibtn | WPAD_CLASSIC_BUTTON_LEFT)
2009-03-11 18:28:37 +01:00
|| (pad.btns_d | pad.btns_h) & PAD_BUTTON_LEFT
|| pad.stickX < -PADCAL
2009-11-04 22:27:04 +01:00
|| WPAD_StickX(0) < -PADCAL)
2009-03-11 18:28:37 +01:00
{
2009-10-13 02:48:00 +02:00
if(wpad->btns_d & (wiibtn | WPAD_CLASSIC_BUTTON_LEFT)
2009-03-11 18:28:37 +01:00
|| pad.btns_d & PAD_BUTTON_LEFT)
{
2009-11-04 22:27:04 +01:00
prev[chan] = gettime();
delay[chan] = SCROLLL_DELAY_INITIAL; // reset scroll delay
2009-03-11 18:28:37 +01:00
return true;
}
2009-11-04 22:27:04 +01:00
now[chan] = gettime();
if(diff_usec(prev[chan], now[chan]) > delay[chan])
2009-03-11 18:28:37 +01:00
{
2009-11-04 22:27:04 +01:00
prev[chan] = now[chan];
if(delay[chan] == SCROLLL_DELAY_INITIAL)
delay[chan] = SCROLL_DELAY_LOOP;
else if(delay[chan] > SCROLL_DELAY_DECREASE)
delay[chan] -= SCROLL_DELAY_DECREASE;
2009-03-11 18:28:37 +01:00
return true;
}
}
return false;
}
bool GuiTrigger::Right()
{
u32 wiibtn = GCSettings.WiimoteOrientation ? WPAD_BUTTON_DOWN : WPAD_BUTTON_RIGHT;
2009-10-13 02:48:00 +02:00
if((wpad->btns_d | wpad->btns_h) & (wiibtn | WPAD_CLASSIC_BUTTON_RIGHT)
2009-03-11 18:28:37 +01:00
|| (pad.btns_d | pad.btns_h) & PAD_BUTTON_RIGHT
|| pad.stickX > PADCAL
2009-11-04 22:27:04 +01:00
|| WPAD_StickX(0) > PADCAL)
2009-03-11 18:28:37 +01:00
{
2009-10-13 02:48:00 +02:00
if(wpad->btns_d & (wiibtn | WPAD_CLASSIC_BUTTON_RIGHT)
2009-03-11 18:28:37 +01:00
|| pad.btns_d & PAD_BUTTON_RIGHT)
{
2009-11-04 22:27:04 +01:00
prev[chan] = gettime();
delay[chan] = SCROLLL_DELAY_INITIAL; // reset scroll delay
2009-03-11 18:28:37 +01:00
return true;
}
2009-11-04 22:27:04 +01:00
now[chan] = gettime();
if(diff_usec(prev[chan], now[chan]) > delay[chan])
2009-03-11 18:28:37 +01:00
{
2009-11-04 22:27:04 +01:00
prev[chan] = now[chan];
if(delay[chan] == SCROLLL_DELAY_INITIAL)
delay[chan] = SCROLL_DELAY_LOOP;
else if(delay[chan] > SCROLL_DELAY_DECREASE)
delay[chan] -= SCROLL_DELAY_DECREASE;
2009-03-11 18:28:37 +01:00
return true;
}
}
return false;
}
bool GuiTrigger::Up()
{
u32 wiibtn = GCSettings.WiimoteOrientation ? WPAD_BUTTON_RIGHT : WPAD_BUTTON_UP;
2009-10-13 02:48:00 +02:00
if((wpad->btns_d | wpad->btns_h) & (wiibtn | WPAD_CLASSIC_BUTTON_UP)
2009-03-11 18:28:37 +01:00
|| (pad.btns_d | pad.btns_h) & PAD_BUTTON_UP
|| pad.stickY > PADCAL
2009-11-04 22:27:04 +01:00
|| WPAD_StickY(0) > PADCAL)
2009-03-11 18:28:37 +01:00
{
2009-10-13 02:48:00 +02:00
if(wpad->btns_d & (wiibtn | WPAD_CLASSIC_BUTTON_UP)
2009-03-11 18:28:37 +01:00
|| pad.btns_d & PAD_BUTTON_UP)
{
2009-11-04 22:27:04 +01:00
prev[chan] = gettime();
delay[chan] = SCROLLL_DELAY_INITIAL; // reset scroll delay
2009-03-11 18:28:37 +01:00
return true;
}
2009-11-04 22:27:04 +01:00
now[chan] = gettime();
if(diff_usec(prev[chan], now[chan]) > delay[chan])
2009-03-11 18:28:37 +01:00
{
2009-11-04 22:27:04 +01:00
prev[chan] = now[chan];
if(delay[chan] == SCROLL_DELAY_INITIAL)
delay[chan] = SCROLL_DELAY_LOOP;
else if(delay[chan] > SCROLL_DELAY_DECREASE)
delay[chan] -= SCROLL_DELAY_DECREASE;
2009-03-11 18:28:37 +01:00
return true;
}
}
return false;
}
bool GuiTrigger::Down()
{
u32 wiibtn = GCSettings.WiimoteOrientation ? WPAD_BUTTON_LEFT : WPAD_BUTTON_DOWN;
2009-10-13 02:48:00 +02:00
if((wpad->btns_d | wpad->btns_h) & (wiibtn | WPAD_CLASSIC_BUTTON_DOWN)
2009-03-11 18:28:37 +01:00
|| (pad.btns_d | pad.btns_h) & PAD_BUTTON_DOWN
|| pad.stickY < -PADCAL
2009-11-04 22:27:04 +01:00
|| WPAD_StickY(0) < -PADCAL)
2009-03-11 18:28:37 +01:00
{
2009-10-13 02:48:00 +02:00
if(wpad->btns_d & (wiibtn | WPAD_CLASSIC_BUTTON_DOWN)
2009-03-11 18:28:37 +01:00
|| pad.btns_d & PAD_BUTTON_DOWN)
{
2009-11-04 22:27:04 +01:00
prev[chan] = gettime();
delay[chan] = SCROLLL_DELAY_INITIAL; // reset scroll delay
2009-03-11 18:28:37 +01:00
return true;
}
2009-11-04 22:27:04 +01:00
now[chan] = gettime();
if(diff_usec(prev[chan], now[chan]) > delay[chan])
2009-03-11 18:28:37 +01:00
{
2009-11-04 22:27:04 +01:00
prev[chan] = now[chan];
if(delay[chan] == SCROLLL_DELAY_INITIAL)
delay[chan] = SCROLL_DELAY_LOOP;
else if(delay[chan] > SCROLL_DELAY_DECREASE)
delay[chan] -= SCROLL_DELAY_DECREASE;
2009-03-11 18:28:37 +01:00
return true;
}
}
return false;
}