mirror of
				https://github.com/coop-deluxe/sm64coopdx.git
				synced 2025-10-30 08:01:01 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			75 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			75 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#include "dynos.cpp.h"
 | 
						|
extern "C" {
 | 
						|
#include "pc/controller/controller_api.h"
 | 
						|
}
 | 
						|
 | 
						|
static bool DynOS_Opt_ControllerIsKeyDown(s32 aCont, s32 aKey) {
 | 
						|
#ifdef HAVE_SDL2
 | 
						|
    // Keyboard
 | 
						|
    if (aCont == 0 && aKey >= 0 && aKey < SDL_NUM_SCANCODES) {
 | 
						|
        return SDL_GetKeyboardState(NULL)[aKey];
 | 
						|
    }
 | 
						|
 | 
						|
    // Game Controller
 | 
						|
    else if (aKey >= 0x1000) {
 | 
						|
 | 
						|
        // Button
 | 
						|
        s32 _Button = (aKey - 0x1000);
 | 
						|
        if (_Button < SDL_CONTROLLER_BUTTON_MAX) {
 | 
						|
            return SDL_GameControllerGetButton(SDL_GameControllerOpen(aCont - 1), SDL_GameControllerButton(_Button));
 | 
						|
        }
 | 
						|
 | 
						|
        // Axis
 | 
						|
        s32 _Axis = (aKey - 0x1000 - SDL_CONTROLLER_BUTTON_MAX);
 | 
						|
        if (_Axis < SDL_CONTROLLER_AXIS_MAX * 2) {
 | 
						|
            s32 _AxisValue = SDL_GameControllerGetAxis(SDL_GameControllerOpen(aCont - 1), SDL_GameControllerAxis(_Axis / 2));
 | 
						|
            if (_Axis & 1) return (_AxisValue < (SHRT_MIN / 2));
 | 
						|
            else           return (_AxisValue > (SHRT_MAX / 2));
 | 
						|
        }
 | 
						|
    }
 | 
						|
    // Invalid
 | 
						|
#endif
 | 
						|
    return false;
 | 
						|
}
 | 
						|
 | 
						|
#define MAX_CONTS 8
 | 
						|
bool DynOS_Opt_ControllerUpdate(DynosOption *aOpt, void *aData) {
 | 
						|
#ifdef HAVE_SDL2
 | 
						|
    if (aOpt->mType == DOPT_BIND) {
 | 
						|
        OSContPad *pad = (OSContPad *) aData;
 | 
						|
        for (s32 _Cont = 0; _Cont < MAX_CONTS; ++_Cont)
 | 
						|
        for (s32 _Bind = 0; _Bind < 3; ++_Bind) {
 | 
						|
            pad->button |= aOpt->mBind.mMask * DynOS_Opt_ControllerIsKeyDown(_Cont, aOpt->mBind.mBinds[_Bind]);
 | 
						|
        }
 | 
						|
    }
 | 
						|
#endif
 | 
						|
    return false;
 | 
						|
}
 | 
						|
 | 
						|
#define MAX_GKEYS (SDL_CONTROLLER_BUTTON_MAX + SDL_CONTROLLER_AXIS_MAX * 2)
 | 
						|
s32 sBindingState = 0; // 0 = No bind, 1 = Wait for all keys released, 2 = Return first pressed key
 | 
						|
s32 DynOS_Opt_ControllerGetKeyPressed() {
 | 
						|
#ifdef HAVE_SDL2
 | 
						|
 | 
						|
    // Keyboard
 | 
						|
    for (s32 _Key = 0; _Key < SDL_NUM_SCANCODES; ++_Key) {
 | 
						|
        if (DynOS_Opt_ControllerIsKeyDown(0, _Key)) {
 | 
						|
            if (sBindingState == 1) return VK_INVALID;
 | 
						|
            return _Key;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    // Game Controller
 | 
						|
    for (s32 _Cont = 1; _Cont < MAX_CONTS; ++_Cont)
 | 
						|
    for (s32 _Key = 0; _Key < MAX_GKEYS; ++_Key) {
 | 
						|
        if (DynOS_Opt_ControllerIsKeyDown(_Cont, _Key + 0x1000)) {
 | 
						|
            if (sBindingState == 1) return VK_INVALID;
 | 
						|
            return _Key + 0x1000;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    // No key
 | 
						|
    sBindingState = 2;
 | 
						|
#endif
 | 
						|
    return VK_INVALID;
 | 
						|
}
 |