diff --git a/native/controller.cpp b/native/controller.cpp index a1b756c..f9ae654 100644 --- a/native/controller.cpp +++ b/native/controller.cpp @@ -10,7 +10,7 @@ void CallbackHandler::OnGamepadTextInputDismissed( GamepadTextInputDismissed_t * //side never needs to know the actual values. So we just store the full 64-bit values locally and pass back //0-based index values which easily fit into a regular int. class steamHandleMap{ - //TODO: figure out templating or whatever so I can make typed versions of this like in Haxe (steamHandleMap) + //TODO: figure out templating or whatever so I can make typed versions of this like in Haxe (steamHandleMap) // all the steam handle typedefs are just renamed uint64's, but this could always change so to be 100% super safe I should // figure out the templating stuff. @@ -60,28 +60,38 @@ class steamHandleMap{ static steamHandleMap mapControllers; -HL_PRIM bool HL_NAME(init_controllers)(){ - if (!SteamController()) return false; +HL_PRIM bool HL_NAME(init_controllers)(bool explicitlyCallRunFrame){ + if (!SteamInput()) return false; - bool result = SteamController()->Init(); + bool result = SteamInput()->Init(explicitlyCallRunFrame); if( result ) mapControllers.init(); return result; } -DEFINE_PRIM(_BOOL, init_controllers, _NO_ARG); +DEFINE_PRIM(_BOOL, init_controllers, _BOOL); HL_PRIM bool HL_NAME(shutdown_controllers)(){ - bool result = SteamController()->Shutdown(); + bool result = SteamInput()->Shutdown(); if (result) mapControllers.init(); return result; } DEFINE_PRIM(_BOOL, shutdown_controllers, _NO_ARG); +HL_PRIM void HL_NAME(run_frame_controllers)(){ + SteamInput()->RunFrame(false); +} +DEFINE_PRIM(_VOID, run_frame_controllers, _NO_ARG); + +HL_PRIM bool HL_NAME(new_data_available_controllers)(){ + return SteamInput()->BNewDataAvailable(); +} +DEFINE_PRIM(_BOOL, new_data_available_controllers, _NO_ARG); + HL_PRIM bool HL_NAME(show_binding_panel)(int controller){ - ControllerHandle_t c_handle = controller != -1 ? mapControllers.get(controller) : STEAM_CONTROLLER_HANDLE_ALL_CONTROLLERS; + InputHandle_t c_handle = controller != -1 ? mapControllers.get(controller) : STEAM_INPUT_HANDLE_ALL_CONTROLLERS; - return SteamController()->ShowBindingPanel(c_handle); + return SteamInput()->ShowBindingPanel(c_handle); } DEFINE_PRIM(_BOOL, show_binding_panel, _I32); @@ -105,13 +115,13 @@ HL_PRIM vbyte *HL_NAME(get_entered_gamepad_text_input)(){ DEFINE_PRIM(_BYTES, get_entered_gamepad_text_input, _NO_ARG); HL_PRIM varray *HL_NAME(get_connected_controllers)(varray *arr){ - SteamController()->RunFrame(); + SteamInput()->RunFrame(); - ControllerHandle_t handles[STEAM_CONTROLLER_MAX_COUNT]; - int result = SteamController()->GetConnectedControllers(handles); + InputHandle_t handles[STEAM_INPUT_MAX_COUNT]; + int result = SteamInput()->GetConnectedControllers(handles); if( !arr ) - arr = hl_alloc_array(&hlt_i32, STEAM_CONTROLLER_MAX_COUNT); + arr = hl_alloc_array(&hlt_i32, STEAM_INPUT_MAX_COUNT); int *cur = hl_aptr(arr, int); for(int i = 0; i < result; i++) { int index = mapControllers.find(handles[i]); @@ -120,7 +130,7 @@ HL_PRIM varray *HL_NAME(get_connected_controllers)(varray *arr){ cur[i] = index; } - for (int i = result; i < STEAM_CONTROLLER_MAX_COUNT; i++) + for (int i = result; i < STEAM_INPUT_MAX_COUNT; i++) cur[i] = -1; return arr; @@ -128,26 +138,26 @@ HL_PRIM varray *HL_NAME(get_connected_controllers)(varray *arr){ DEFINE_PRIM(_ARR, get_connected_controllers, _ARR); HL_PRIM int HL_NAME(get_action_set_handle)(vbyte *actionSetName){ - return (int)SteamController()->GetActionSetHandle((char*)actionSetName); + return (int)SteamInput()->GetActionSetHandle((char*)actionSetName); } DEFINE_PRIM(_I32, get_action_set_handle, _BYTES); HL_PRIM int HL_NAME(get_digital_action_handle)(vbyte *actionName){ - return (int)SteamController()->GetDigitalActionHandle((char*)actionName); + return (int)SteamInput()->GetDigitalActionHandle((char*)actionName); } DEFINE_PRIM(_I32, get_digital_action_handle, _BYTES); HL_PRIM int HL_NAME(get_analog_action_handle)(vbyte *actionName){ - return (int)SteamController()->GetAnalogActionHandle((char*)actionName); + return (int)SteamInput()->GetAnalogActionHandle((char*)actionName); } DEFINE_PRIM(_I32, get_analog_action_handle, _BYTES); //----------------------------------------------------------------------------------------------------------- HL_PRIM int HL_NAME(get_digital_action_data)(int controllerHandle, int actionHandle){ - ControllerHandle_t c_handle = controllerHandle != -1 ? mapControllers.get(controllerHandle) : STEAM_CONTROLLER_HANDLE_ALL_CONTROLLERS; - ControllerDigitalActionHandle_t a_handle = actionHandle; + InputHandle_t c_handle = controllerHandle != -1 ? mapControllers.get(controllerHandle) : STEAM_INPUT_HANDLE_ALL_CONTROLLERS; + InputDigitalActionHandle_t a_handle = actionHandle; - ControllerDigitalActionData_t data = SteamController()->GetDigitalActionData(c_handle, a_handle); + InputDigitalActionData_t data = SteamInput()->GetDigitalActionData(c_handle, a_handle); int result = 0; @@ -175,10 +185,10 @@ typedef struct { } analog_action_data; HL_PRIM void HL_NAME(get_analog_action_data)(int controllerHandle, int actionHandle, analog_action_data *data){ - ControllerHandle_t c_handle = controllerHandle != -1 ? mapControllers.get(controllerHandle) : STEAM_CONTROLLER_HANDLE_ALL_CONTROLLERS; - ControllerAnalogActionHandle_t a_handle = actionHandle; + InputHandle_t c_handle = controllerHandle != -1 ? mapControllers.get(controllerHandle) : STEAM_INPUT_HANDLE_ALL_CONTROLLERS; + InputAnalogActionHandle_t a_handle = actionHandle; - ControllerAnalogActionData_t d = SteamController()->GetAnalogActionData(c_handle, a_handle); + InputAnalogActionData_t d = SteamInput()->GetAnalogActionData(c_handle, a_handle); data->bActive = d.bActive; data->eMode = d.eMode; @@ -188,18 +198,18 @@ HL_PRIM void HL_NAME(get_analog_action_data)(int controllerHandle, int actionHan DEFINE_PRIM(_VOID, get_analog_action_data, _I32 _I32 _OBJ(_BOOL _I32 _F64 _F64)); HL_PRIM varray *HL_NAME(get_digital_action_origins)(int controllerHandle, int actionSetHandle, int digitalActionHandle){ - ControllerHandle_t c_handle = mapControllers.get(controllerHandle); - ControllerActionSetHandle_t s_handle = actionSetHandle; - ControllerDigitalActionHandle_t a_handle = digitalActionHandle; + InputHandle_t c_handle = mapControllers.get(controllerHandle); + InputActionSetHandle_t s_handle = actionSetHandle; + InputDigitalActionHandle_t a_handle = digitalActionHandle; - EControllerActionOrigin origins[STEAM_CONTROLLER_MAX_ORIGINS]; - for(int i = 0; i < STEAM_CONTROLLER_MAX_ORIGINS; i++) - origins[i] = k_EControllerActionOrigin_None; + EInputActionOrigin origins[STEAM_INPUT_MAX_ORIGINS]; + for(int i = 0; i < STEAM_INPUT_MAX_ORIGINS; i++) + origins[i] = k_EInputActionOrigin_None; - int result = SteamController()->GetDigitalActionOrigins(c_handle, s_handle, a_handle, origins); + int result = SteamInput()->GetDigitalActionOrigins(c_handle, s_handle, a_handle, origins); varray *arr = hl_alloc_array(&hlt_i32, result); int *cur = hl_aptr(arr, int); - for(int i = 0; i < STEAM_CONTROLLER_MAX_ORIGINS; i++) + for(int i = 0; i < STEAM_INPUT_MAX_ORIGINS; i++) cur[i] = origins[i]; return arr; } @@ -207,20 +217,20 @@ DEFINE_PRIM(_ARR, get_digital_action_origins, _I32 _I32 _I32); //----------------------------------------------------------------------------------------------------------- HL_PRIM varray *HL_NAME(get_analog_action_origins)(int controllerHandle, int actionSetHandle, int analogActionHandle){ - ControllerHandle_t c_handle = mapControllers.get(controllerHandle); - ControllerActionSetHandle_t s_handle = actionSetHandle; - ControllerAnalogActionHandle_t a_handle = analogActionHandle; + InputHandle_t c_handle = mapControllers.get(controllerHandle); + InputActionSetHandle_t s_handle = actionSetHandle; + InputAnalogActionHandle_t a_handle = analogActionHandle; - EControllerActionOrigin origins[STEAM_CONTROLLER_MAX_ORIGINS]; + EInputActionOrigin origins[STEAM_INPUT_MAX_ORIGINS]; //Initialize the whole thing to None to avoid garbage - for(int i = 0; i < STEAM_CONTROLLER_MAX_ORIGINS; i++) - origins[i] = k_EControllerActionOrigin_None; + for(int i = 0; i < STEAM_INPUT_MAX_ORIGINS; i++) + origins[i] = k_EInputActionOrigin_None; - int result = SteamController()->GetAnalogActionOrigins(c_handle, s_handle, a_handle, origins); + int result = SteamInput()->GetAnalogActionOrigins(c_handle, s_handle, a_handle, origins); varray *arr = hl_alloc_array(&hlt_i32, result); int *cur = hl_aptr(arr, int); - for(int i = 0; i < STEAM_CONTROLLER_MAX_ORIGINS; i++) + for(int i = 0; i < STEAM_INPUT_MAX_ORIGINS; i++) cur[i] = origins[i]; return arr; } @@ -230,12 +240,12 @@ DEFINE_PRIM(_ARR, get_analog_action_origins, _I32 _I32 _I32); HL_PRIM vbyte *HL_NAME(get_glyph_for_action_origin)(int origin){ if (!CheckInit()) return NULL; - if (origin >= k_EControllerActionOrigin_Count) + if (origin >= k_EInputActionOrigin_Count) return NULL; - EControllerActionOrigin eOrigin = static_cast(origin); + EInputActionOrigin eOrigin = static_cast(origin); - const char * result = SteamController()->GetGlyphForActionOrigin(eOrigin); + const char * result = SteamInput()->GetGlyphForActionOrigin_Legacy(eOrigin); return (vbyte*)result; } DEFINE_PRIM(_BYTES, get_glyph_for_action_origin, _I32); @@ -244,34 +254,34 @@ DEFINE_PRIM(_BYTES, get_glyph_for_action_origin, _I32); HL_PRIM vbyte *HL_NAME(get_string_for_action_origin)(int origin){ if (!CheckInit()) return NULL; - if (origin >= k_EControllerActionOrigin_Count) + if (origin >= k_EInputActionOrigin_Count) return NULL; - EControllerActionOrigin eOrigin = static_cast(origin); + EInputActionOrigin eOrigin = static_cast(origin); - const char * result = SteamController()->GetStringForActionOrigin(eOrigin); + const char * result = SteamInput()->GetStringForActionOrigin(eOrigin); return (vbyte*)result; } DEFINE_PRIM(_BYTES, get_string_for_action_origin, _I32); //----------------------------------------------------------------------------------------------------------- HL_PRIM void HL_NAME(activate_action_set)(int controllerHandle, int actionSetHandle){ - ControllerHandle_t c_handle = controllerHandle != -1 ? mapControllers.get(controllerHandle) : STEAM_CONTROLLER_HANDLE_ALL_CONTROLLERS; - ControllerActionSetHandle_t a_handle = actionSetHandle; + InputHandle_t c_handle = controllerHandle != -1 ? mapControllers.get(controllerHandle) : STEAM_INPUT_HANDLE_ALL_CONTROLLERS; + InputActionSetHandle_t a_handle = actionSetHandle; - SteamController()->ActivateActionSet(c_handle, a_handle); + SteamInput()->ActivateActionSet(c_handle, a_handle); } DEFINE_PRIM(_VOID, activate_action_set, _I32 _I32); //----------------------------------------------------------------------------------------------------------- HL_PRIM int HL_NAME(get_current_action_set)(int controllerHandle){ - ControllerHandle_t c_handle = controllerHandle != -1 ? mapControllers.get(controllerHandle) : STEAM_CONTROLLER_HANDLE_ALL_CONTROLLERS; - return (int)SteamController()->GetCurrentActionSet(c_handle); + InputHandle_t c_handle = controllerHandle != -1 ? mapControllers.get(controllerHandle) : STEAM_INPUT_HANDLE_ALL_CONTROLLERS; + return (int)SteamInput()->GetCurrentActionSet(c_handle); } DEFINE_PRIM(_I32, get_current_action_set, _I32); HL_PRIM void HL_NAME(trigger_haptic_pulse)(int controllerHandle, int targetPad, int durationMicroSec){ - ControllerHandle_t c_handle = controllerHandle != -1 ? mapControllers.get(controllerHandle) : STEAM_CONTROLLER_HANDLE_ALL_CONTROLLERS; + InputHandle_t c_handle = controllerHandle != -1 ? mapControllers.get(controllerHandle) : STEAM_INPUT_HANDLE_ALL_CONTROLLERS; ESteamControllerPad eTargetPad; switch(targetPad) { case 0: eTargetPad = k_ESteamControllerPad_Left; @@ -280,12 +290,12 @@ HL_PRIM void HL_NAME(trigger_haptic_pulse)(int controllerHandle, int targetPad, } unsigned short usDurationMicroSec = durationMicroSec; - SteamController()->TriggerHapticPulse(c_handle, eTargetPad, usDurationMicroSec); + SteamInput()->Legacy_TriggerHapticPulse(c_handle, eTargetPad, usDurationMicroSec); } DEFINE_PRIM(_VOID, trigger_haptic_pulse, _I32 _I32 _I32); HL_PRIM void HL_NAME(trigger_repeated_haptic_pulse)(int controllerHandle, int targetPad, int durationMicroSec, int offMicroSec, int repeat, int flags){ - ControllerHandle_t c_handle = controllerHandle != -1 ? mapControllers.get(controllerHandle) : STEAM_CONTROLLER_HANDLE_ALL_CONTROLLERS; + InputHandle_t c_handle = controllerHandle != -1 ? mapControllers.get(controllerHandle) : STEAM_INPUT_HANDLE_ALL_CONTROLLERS; ESteamControllerPad eTargetPad; switch(targetPad) { case 0: eTargetPad = k_ESteamControllerPad_Left; @@ -297,19 +307,19 @@ HL_PRIM void HL_NAME(trigger_repeated_haptic_pulse)(int controllerHandle, int ta unsigned short unRepeat = repeat; unsigned short nFlags = flags; - SteamController()->TriggerRepeatedHapticPulse(c_handle, eTargetPad, usDurationMicroSec, usOffMicroSec, unRepeat, nFlags); + SteamInput()->Legacy_TriggerRepeatedHapticPulse(c_handle, eTargetPad, usDurationMicroSec, usOffMicroSec, unRepeat, nFlags); } DEFINE_PRIM(_VOID, trigger_repeated_haptic_pulse, _I32 _I32 _I32 _I32 _I32 _I32); HL_PRIM void HL_NAME(trigger_vibration)(int controllerHandle, int leftSpeed, int rightSpeed){ - ControllerHandle_t c_handle = controllerHandle != -1 ? mapControllers.get(controllerHandle) : STEAM_CONTROLLER_HANDLE_ALL_CONTROLLERS; - SteamController()->TriggerVibration(c_handle, (unsigned short)leftSpeed, (unsigned short)rightSpeed); + InputHandle_t c_handle = controllerHandle != -1 ? mapControllers.get(controllerHandle) : STEAM_INPUT_HANDLE_ALL_CONTROLLERS; + SteamInput()->TriggerVibration(c_handle, (unsigned short)leftSpeed, (unsigned short)rightSpeed); } DEFINE_PRIM(_VOID, trigger_vibration, _I32 _I32 _I32); HL_PRIM void HL_NAME(set_led_color)(int controllerHandle, int r, int g, int b, int flags){ - ControllerHandle_t c_handle = controllerHandle != -1 ? mapControllers.get(controllerHandle) : STEAM_CONTROLLER_HANDLE_ALL_CONTROLLERS; - SteamController()->SetLEDColor(c_handle, (uint8)r, (uint8)g, (uint8)b, (unsigned int) flags); + InputHandle_t c_handle = controllerHandle != -1 ? mapControllers.get(controllerHandle) : STEAM_INPUT_HANDLE_ALL_CONTROLLERS; + SteamInput()->SetLEDColor(c_handle, (uint8)r, (uint8)g, (uint8)b, (unsigned int) flags); } DEFINE_PRIM(_VOID, set_led_color, _I32 _I32 _I32 _I32 _I32); @@ -329,8 +339,8 @@ typedef struct { } motion_data; HL_PRIM void HL_NAME(get_motion_data)(int controllerHandle, motion_data *data){ - ControllerHandle_t c_handle = controllerHandle != -1 ? mapControllers.get(controllerHandle) : STEAM_CONTROLLER_HANDLE_ALL_CONTROLLERS; - ControllerMotionData_t d = SteamController()->GetMotionData(c_handle); + InputHandle_t c_handle = controllerHandle != -1 ? mapControllers.get(controllerHandle) : STEAM_INPUT_HANDLE_ALL_CONTROLLERS; + InputMotionData_t d = SteamInput()->GetMotionData(c_handle); data->rotQuatX = d.rotQuatX; data->rotQuatY = d.rotQuatY; @@ -346,13 +356,13 @@ HL_PRIM void HL_NAME(get_motion_data)(int controllerHandle, motion_data *data){ DEFINE_PRIM(_VOID, get_motion_data, _I32 _OBJ(_F64 _F64 _F64 _F64 _F64 _F64 _F64 _F64 _F64 _F64)); HL_PRIM bool HL_NAME(show_digital_action_origins)(int controllerHandle, int digitalActionHandle, double scale, double xPosition, double yPosition){ - ControllerHandle_t c_handle = controllerHandle != -1 ? mapControllers.get(controllerHandle) : STEAM_CONTROLLER_HANDLE_ALL_CONTROLLERS; + InputHandle_t c_handle = controllerHandle != -1 ? mapControllers.get(controllerHandle) : STEAM_INPUT_HANDLE_ALL_CONTROLLERS; return false; //SteamController()->ShowDigitalActionOrigins(c_handle, digitalActionHandle, (float)scale, (float)xPosition, (float)yPosition); } DEFINE_PRIM(_BOOL, show_digital_action_origins, _I32 _I32 _F64 _F64 _F64); HL_PRIM bool HL_NAME(show_analog_action_origins)(int controllerHandle, int analogActionHandle, double scale, double xPosition, double yPosition){ - ControllerHandle_t c_handle = controllerHandle != -1 ? mapControllers.get(controllerHandle) : STEAM_CONTROLLER_HANDLE_ALL_CONTROLLERS; + InputHandle_t c_handle = controllerHandle != -1 ? mapControllers.get(controllerHandle) : STEAM_INPUT_HANDLE_ALL_CONTROLLERS; return false; //SteamController()->ShowAnalogActionOrigins(c_handle, analogActionHandle, (float)scale, (float)xPosition, (float)yPosition); } DEFINE_PRIM(_BOOL, show_analog_action_origins, _I32 _I32 _F64 _F64 _F64); @@ -360,32 +370,32 @@ DEFINE_PRIM(_BOOL, show_analog_action_origins, _I32 _I32 _F64 _F64 _F64); //----------------------------------------------------------------------------------------------------------- HL_PRIM int HL_NAME(get_controller_max_count)(){ - return STEAM_CONTROLLER_MAX_COUNT; + return STEAM_INPUT_MAX_COUNT; } DEFINE_PRIM(_I32, get_controller_max_count, _NO_ARG); HL_PRIM int HL_NAME(get_controller_max_analog_actions)(){ - return STEAM_CONTROLLER_MAX_ANALOG_ACTIONS; + return STEAM_INPUT_MAX_ANALOG_ACTIONS; } DEFINE_PRIM(_I32, get_controller_max_analog_actions, _NO_ARG); HL_PRIM int HL_NAME(get_controller_max_digital_actions)(){ - return STEAM_CONTROLLER_MAX_DIGITAL_ACTIONS; + return STEAM_INPUT_MAX_DIGITAL_ACTIONS; } DEFINE_PRIM(_I32, get_controller_max_digital_actions, _NO_ARG); HL_PRIM int HL_NAME(get_controller_max_origins)(){ - return STEAM_CONTROLLER_MAX_ORIGINS; + return STEAM_INPUT_MAX_ORIGINS; } DEFINE_PRIM(_I32, get_controller_max_origins, _NO_ARG); HL_PRIM double HL_NAME(get_controller_min_analog_action_data)(){ - return STEAM_CONTROLLER_MIN_ANALOG_ACTION_DATA; + return STEAM_INPUT_MIN_ANALOG_ACTION_DATA; } DEFINE_PRIM(_F64, get_controller_min_analog_action_data, _NO_ARG); HL_PRIM double HL_NAME(get_controller_max_analog_action_data)(){ - return STEAM_CONTROLLER_MAX_ANALOG_ACTION_DATA; + return STEAM_INPUT_MAX_ANALOG_ACTION_DATA; } DEFINE_PRIM(_F64, get_controller_max_analog_action_data, _NO_ARG); diff --git a/steam/Controller.hx b/steam/Controller.hx index b1ebea8..0f5f035 100644 --- a/steam/Controller.hx +++ b/steam/Controller.hx @@ -267,6 +267,24 @@ class Controller active = false; } + /** + * Synchronize API state with the latest Steam Input action data available. This + * is performed automatically by SteamAPI_RunCallbacks, but for the absolute lowest + * possible latency, you call this directly before reading controller state. + */ + public inline function runFrame() { + _RunFrameControllers(); + } + + /** + * Returns true if new data has been received since the last time action data was accessed + * via GetDigitalActionData or GetAnalogActionData. The game will still need to call + * runFrame() or SteamAPI_RunCallbacks() before this to update the data stream + */ + public inline function newDataAvailable() { + return _NewDataAvailableControllers(); + } + /** * Trigger a haptic pulse in a slightly friendlier way * @param controller handle received from getConnectedControllers() @@ -447,8 +465,10 @@ class Controller private var customTrace:String->Void; - @:hlNative("steam","init_controllers") private static function _InitControllers() : Bool { return false; } + @:hlNative("steam","init_controllers") private static function _InitControllers( explicitlyCallRunFrame : Bool ) : Bool { return false; } @:hlNative("steam","shutdown_controllers") private static function _ShutdownControllers() : Bool { return false; } + @:hlNative("steam","run_frame_controllers") private static function _RunFrameControllers() : Void{}; + @:hlNative("steam","new_data_available_controllers") private static function _NewDataAvailableControllers() : Bool { return false; } @:hlNative("steam","get_connected_controllers") private static function _GetConnectedControllers( arr : hl.NativeArray ) : hl.NativeArray { return null; } @:hlNative("steam","get_digital_action_origins") private static function _GetDigitalActionOrigins( controller : Int, action : Int, digitalAction : Int ) : hl.NativeArray { return null; } @:hlNative("steam","get_entered_gamepad_text_input") private static function _GetEnteredGamepadTextInput() : hl.Bytes { return null; } @@ -485,13 +505,13 @@ class Controller init(); } - private function init() + private function init(explicitlyCallRunFrame = false) { if (active) return; // if we get this far, the dlls loaded ok and we need Steam controllers to init. // otherwise, we're trying to run the Steam version without the Steam client - active = _InitControllers(); + active = _InitControllers(explicitlyCallRunFrame); } private var max_controllers:Int = -1;