diff --git a/src/Window_GCWii.c b/src/Window_GCWii.c index dfcecccfd..6709956e5 100644 --- a/src/Window_GCWii.c +++ b/src/Window_GCWii.c @@ -17,6 +17,12 @@ static GXRModeObj* rmode; void* Window_XFB; + +int evctr = 0; +void countevs(int chan, const WPADData *data) { + evctr++; +} + void Window_Init(void) { // Initialise the video system VIDEO_Init(); @@ -53,6 +59,7 @@ void Window_Init(void) { #if defined HW_RVL WPAD_Init(); + WPAD_SetDataFormat(0, WPAD_FMT_BTNS_ACC_IR); #elif defined HW_DOL PAD_Init(); #endif @@ -80,31 +87,101 @@ void Window_Close(void) { /* TODO implement */ } +#if defined HW_RVL + +int dragCursorX = 0; +int dragCursorY = 0; +cc_bool dragOn = false; + +#endif + #if defined HW_RVL void Window_ProcessEvents(double delta) { /* TODO implement */ + int x, y; + Cursor_GetRawPos(&x, &y); + WPAD_ScanPads(); u32 mods = WPAD_ButtonsDown(0) | WPAD_ButtonsHeld(0); - - Input_SetNonRepeatable(KeyBinds[KEYBIND_PLACE_BLOCK], mods & WPAD_BUTTON_1); - Input_SetNonRepeatable(KeyBinds[KEYBIND_DELETE_BLOCK], mods & WPAD_BUTTON_2); - - Input_SetNonRepeatable(KeyBinds[KEYBIND_JUMP], mods & WPAD_BUTTON_A); - Input_SetNonRepeatable(KeyBinds[KEYBIND_CHAT], mods & WPAD_BUTTON_B); - Input_SetNonRepeatable(KeyBinds[KEYBIND_INVENTORY], mods & WPAD_BUTTON_PLUS); - - Input_SetNonRepeatable(IPT_ENTER, mods & WPAD_BUTTON_HOME); - Input_SetNonRepeatable(IPT_ESCAPE, mods & WPAD_BUTTON_MINUS); - - Input_SetNonRepeatable(KeyBinds[KEYBIND_LEFT], mods & WPAD_BUTTON_LEFT); - Input_SetNonRepeatable(IPT_LEFT, mods & WPAD_BUTTON_LEFT); - Input_SetNonRepeatable(KeyBinds[KEYBIND_RIGHT], mods & WPAD_BUTTON_RIGHT); - Input_SetNonRepeatable(IPT_RIGHT, mods & WPAD_BUTTON_RIGHT); - - Input_SetNonRepeatable(KeyBinds[KEYBIND_FORWARD], mods & WPAD_BUTTON_UP); - Input_SetNonRepeatable(IPT_UP, mods & WPAD_BUTTON_UP); - Input_SetNonRepeatable(KeyBinds[KEYBIND_BACK], mods & WPAD_BUTTON_DOWN); - Input_SetNonRepeatable(IPT_DOWN, mods & WPAD_BUTTON_DOWN); + + u32 res; + WPAD_Probe(0, &res); + + if (res == WPAD_EXP_NUNCHUK) { + WPADData *wd = WPAD_Data(0); + joystick_t analog = wd->exp.nunchuk.js; + + Input_SetNonRepeatable(KeyBinds[KEYBIND_PLACE_BLOCK], mods & WPAD_NUNCHUK_BUTTON_C); + Input_SetNonRepeatable(KeyBinds[KEYBIND_DELETE_BLOCK], mods & WPAD_NUNCHUK_BUTTON_Z); + + Input_SetNonRepeatable(KeyBinds[KEYBIND_JUMP], mods & WPAD_BUTTON_A); + Input_SetNonRepeatable(KeyBinds[KEYBIND_CHAT], mods & WPAD_BUTTON_1); + Input_SetNonRepeatable(KeyBinds[KEYBIND_INVENTORY], mods & WPAD_BUTTON_2); + + Input_SetNonRepeatable(IPT_ENTER, mods & WPAD_BUTTON_HOME); + Input_SetNonRepeatable(IPT_ESCAPE, mods & WPAD_BUTTON_MINUS); + + Input_SetNonRepeatable(KeyBinds[KEYBIND_FLY], mods & WPAD_BUTTON_LEFT); + + + if (mods & WPAD_BUTTON_RIGHT) { + Mouse_ScrollWheel(1.0*delta); + } + + Input_SetNonRepeatable(KeyBinds[KEYBIND_THIRD_PERSON], mods & WPAD_BUTTON_UP); + Input_SetNonRepeatable(KeyBinds[KEYBIND_FLY_DOWN], mods & WPAD_BUTTON_DOWN); + + const float ANGLE_DELTA = 50; + bool nunchuckUp = (analog.ang > -ANGLE_DELTA) && (analog.ang < ANGLE_DELTA) && (analog.mag > 0.5); + bool nunchuckDown = (analog.ang > 180-ANGLE_DELTA) && (analog.ang < 180+ANGLE_DELTA) && (analog.mag > 0.5); + bool nunchuckLeft = (analog.ang > -90-ANGLE_DELTA) && (analog.ang < -90+ANGLE_DELTA) && (analog.mag > 0.5); + bool nunchuckRight = (analog.ang > 90-ANGLE_DELTA) && (analog.ang < 90+ANGLE_DELTA) && (analog.mag > 0.5); + + Input_SetNonRepeatable(KeyBinds[KEYBIND_LEFT], nunchuckLeft); + Input_SetNonRepeatable(IPT_LEFT, nunchuckLeft); + Input_SetNonRepeatable(KeyBinds[KEYBIND_RIGHT], nunchuckRight); + Input_SetNonRepeatable(IPT_RIGHT, nunchuckRight); + + Input_SetNonRepeatable(KeyBinds[KEYBIND_FORWARD], nunchuckUp); + Input_SetNonRepeatable(IPT_UP, nunchuckUp); + Input_SetNonRepeatable(KeyBinds[KEYBIND_BACK], nunchuckDown); + Input_SetNonRepeatable(IPT_DOWN, nunchuckDown); + } else { + // you can't open up chat without the nunchuck like this + + Input_SetNonRepeatable(KeyBinds[KEYBIND_PLACE_BLOCK], mods & WPAD_BUTTON_1); + Input_SetNonRepeatable(KeyBinds[KEYBIND_DELETE_BLOCK], mods & WPAD_BUTTON_2); + + Input_SetNonRepeatable(KeyBinds[KEYBIND_JUMP], mods & WPAD_BUTTON_A); + Input_SetNonRepeatable(KeyBinds[KEYBIND_INVENTORY], mods & WPAD_BUTTON_PLUS); + + Input_SetNonRepeatable(IPT_ENTER, mods & WPAD_BUTTON_HOME); + Input_SetNonRepeatable(IPT_ESCAPE, mods & WPAD_BUTTON_MINUS); + + Input_SetNonRepeatable(KeyBinds[KEYBIND_LEFT], mods & WPAD_BUTTON_LEFT); + Input_SetNonRepeatable(IPT_LEFT, mods & WPAD_BUTTON_LEFT); + Input_SetNonRepeatable(KeyBinds[KEYBIND_RIGHT], mods & WPAD_BUTTON_RIGHT); + Input_SetNonRepeatable(IPT_RIGHT, mods & WPAD_BUTTON_RIGHT); + + Input_SetNonRepeatable(KeyBinds[KEYBIND_FORWARD], mods & WPAD_BUTTON_UP); + Input_SetNonRepeatable(IPT_UP, mods & WPAD_BUTTON_UP); + Input_SetNonRepeatable(KeyBinds[KEYBIND_BACK], mods & WPAD_BUTTON_DOWN); + Input_SetNonRepeatable(IPT_DOWN, mods & WPAD_BUTTON_DOWN); + } + + if (mods & WPAD_BUTTON_B) { + if (dragOn == false) { + dragCursorX = x; + dragCursorY = y; + } + + dragOn = true; + } else { + dragOn = false; + } + + Pointer_SetPosition(0, x, y); + } #elif defined HW_DOL @@ -147,8 +224,21 @@ void Window_ProcessEvents(double delta) { #endif static void Cursor_GetRawPos(int* x, int* y) { - /* TODO implement */ - *x = 0; *y = 0; + + u32 type; + + WPAD_ReadPending(WPAD_CHAN_ALL, countevs); + + int res = WPAD_Probe(0, &type); + + if(res == WPAD_ERR_NONE) { + WPADData *wd = WPAD_Data(0); + + *x = wd->ir.x; + *y = wd->ir.y; + } else { + *x = 0; *y = 0; + } } void Cursor_SetPosition(int x, int y) { /* TODO implement */ @@ -230,10 +320,25 @@ void Window_EnableRawMouse(void) { RegrabMouse(); Input_RawMode = true; } -void Window_UpdateRawMouse(void) { CentreMousePosition(); } + +#define FACTOR 2 +void Window_UpdateRawMouse(void) { + +#if defined HW_RVL + if (dragOn) { + cursorPrevX = (cursorPrevX-dragCursorX)/FACTOR+dragCursorX; + cursorPrevY = (cursorPrevY-dragCursorY)/FACTOR+dragCursorY; + + DefaultUpdateRawMouse(); + } +#elif defined HW_DOL + /* TODO implement */ +#endif +} void Window_DisableRawMouse(void) { RegrabMouse(); Input_RawMode = false; } -#endif \ No newline at end of file + +#endif