|
21 | 21 |
|
22 | 22 | #include "fg_common_ogc.h"
|
23 | 23 |
|
| 24 | +#include <wiiuse/wpad.h> |
| 25 | + |
24 | 26 | void fgPlatformJoystickRawRead(SFG_Joystick *joy, int *buttons, float *axes)
|
25 | 27 | {
|
26 |
| - fgWarning("%s() : not implemented", __func__); |
| 28 | + *buttons = 0; |
| 29 | + |
| 30 | + if (joy->id < MAX_GC_JOYSTICKS) { |
| 31 | + u16 btns = PAD_ButtonsHeld(joy->id); |
| 32 | + if (btns & PAD_BUTTON_A) *buttons |= 0x1; |
| 33 | + if (btns & PAD_BUTTON_B) *buttons |= 0x2; |
| 34 | + if (btns & PAD_BUTTON_X) *buttons |= 0x4; |
| 35 | + if (btns & PAD_BUTTON_Y) *buttons |= 0x8; |
| 36 | + if (btns & PAD_TRIGGER_L) *buttons |= 0x10; |
| 37 | + if (btns & PAD_TRIGGER_R) *buttons |= 0x20; |
| 38 | + if (btns & PAD_TRIGGER_Z) *buttons |= 0x40; |
| 39 | + if (btns & PAD_BUTTON_MENU) *buttons |= 0x80; |
| 40 | + if (btns & PAD_BUTTON_START) *buttons |= 0x100; |
| 41 | + axes[0] = PAD_StickX(joy->id) / 127.0; |
| 42 | + axes[1] = PAD_StickY(joy->id) / 127.0; |
| 43 | + axes[2] = PAD_SubStickX(joy->id) / 127.0; |
| 44 | + axes[3] = PAD_SubStickY(joy->id) / 127.0; |
| 45 | + return; |
| 46 | + } |
| 47 | + |
| 48 | +#ifdef __wii__ |
| 49 | + int id = joy->id - MAX_GC_JOYSTICKS; |
| 50 | + if (id < MAX_WII_JOYSTICKS) { |
| 51 | + WPADData *data = WPAD_Data(id); |
| 52 | + u32 btns = data->btns_h; |
| 53 | + axes[0] = 0.0; |
| 54 | + axes[1] = 0.0; |
| 55 | + if (btns & WPAD_BUTTON_LEFT) axes[0] = -1.0; |
| 56 | + if (btns & WPAD_BUTTON_RIGHT) axes[0] = 1.0; |
| 57 | + if (btns & WPAD_BUTTON_UP) axes[1] = 1.0; |
| 58 | + if (btns & WPAD_BUTTON_DOWN) axes[1] = -1.0; |
| 59 | + |
| 60 | + if (btns & WPAD_BUTTON_1) *buttons |= 0x1; |
| 61 | + if (btns & WPAD_BUTTON_2) *buttons |= 0x2; |
| 62 | + if (btns & WPAD_BUTTON_A) *buttons |= 0x4; |
| 63 | + if (btns & WPAD_BUTTON_B) *buttons |= 0x8; |
| 64 | + if (btns & WPAD_BUTTON_MINUS) *buttons |= 0x10; |
| 65 | + if (btns & WPAD_BUTTON_PLUS) *buttons |= 0x20; |
| 66 | + if (btns & WPAD_BUTTON_HOME) *buttons |= 0x40; |
| 67 | + } |
| 68 | +#endif |
27 | 69 | }
|
28 | 70 |
|
29 | 71 | void fgPlatformJoystickOpen(SFG_Joystick *joy)
|
30 | 72 | {
|
31 |
| - fgWarning("%s() : not implemented", __func__); |
| 73 | + fgWarning("%s() called for joystick %d", __func__, joy->id); |
| 74 | + joy->error = GL_FALSE; |
| 75 | + if (joy->id < MAX_GC_JOYSTICKS) { |
| 76 | + sprintf(joy->name, "GameCube #%d", joy->id); |
| 77 | + joy->num_axes = 4; |
| 78 | + joy->num_buttons = 8; |
| 79 | + } else { |
| 80 | + sprintf(joy->name, "Wiimote #%d", joy->id - MAX_GC_JOYSTICKS); |
| 81 | + joy->num_axes = 2; |
| 82 | + joy->num_buttons = 7; |
| 83 | + } |
| 84 | + |
| 85 | + for (int i = 0; i < joy->num_axes; i++) { |
| 86 | + joy->center[i] = 0.0; |
| 87 | + joy->max[i] = 1.0; |
| 88 | + joy->min[i] = -1.0; |
| 89 | + joy->dead_band[i] = 0.0; |
| 90 | + joy->saturate[i] = 1.0; |
| 91 | + } |
32 | 92 | }
|
33 | 93 |
|
34 | 94 | void fgPlatformJoystickInit(SFG_Joystick *fgJoystick[], int ident)
|
35 | 95 | {
|
36 |
| - fgWarning("%s() : not implemented", __func__); |
| 96 | + static bool initialized = false; |
| 97 | + if (!initialized) { |
| 98 | + initialized = true; |
| 99 | + |
| 100 | + PAD_Init(); |
| 101 | + /* WPAD is initialized in fgPlatformMainLoopPreliminaryWork(), since |
| 102 | + * it's used for mouse emulation as well. */ |
| 103 | + } |
| 104 | + |
| 105 | + fgWarning("%s called for ident %d\n", __func__, ident); |
| 106 | + if (ident < MAX_OGC_JOYSTICKS) { |
| 107 | + SFG_Joystick *joy = fgJoystick[ident]; |
| 108 | + joy->id = ident; |
| 109 | + joy->error = GL_FALSE; |
| 110 | + } |
37 | 111 | }
|
38 | 112 |
|
39 | 113 | void fgPlatformJoystickClose(int ident)
|
|
0 commit comments