use core::mem::{offset_of, size_of};
use crate::{
ScsContext, ScsPadding, ScsResult, ScsSdkInitParamsV100, ScsString, ScsU8, ScsU32,
ScsValueBool, ScsValueFloat, ScsValueType, make_version,
};
pub const SCS_INPUT_VERSION_1_00: ScsU32 = make_version(1, 0);
pub const SCS_INPUT_VERSION_CURRENT: ScsU32 = SCS_INPUT_VERSION_1_00;
pub const SCS_INPUT_EUT2_GAME_VERSION_1_00: ScsU32 = make_version(1, 0);
pub const SCS_INPUT_EUT2_GAME_VERSION_CURRENT: ScsU32 = SCS_INPUT_EUT2_GAME_VERSION_1_00;
pub const SCS_INPUT_ATS_GAME_VERSION_1_00: ScsU32 = make_version(1, 0);
pub const SCS_INPUT_ATS_GAME_VERSION_CURRENT: ScsU32 = SCS_INPUT_ATS_GAME_VERSION_1_00;
pub type ScsInputDeviceType = ScsU32;
pub const SCS_INPUT_DEVICE_TYPE_INVALID: ScsInputDeviceType = 0;
pub const SCS_INPUT_DEVICE_TYPE_GENERIC: ScsInputDeviceType = 1;
pub const SCS_INPUT_DEVICE_TYPE_SEMANTICAL: ScsInputDeviceType = 2;
pub const SCS_INPUT_MAX_INPUT_COUNT: ScsU32 = 400;
pub const SCS_INPUT_EVENT_CALLBACK_FLAG_FIRST_IN_FRAME: ScsU32 = 0x0000_0001;
pub const SCS_INPUT_EVENT_CALLBACK_FLAG_FIRST_AFTER_ACTIVATION: ScsU32 = 0x0000_0002;
#[repr(C)]
pub struct ScsInputInitParams {
_private: [u8; 0],
}
#[repr(C)]
pub struct ScsInputDeviceInput {
pub name: ScsString,
pub display_name: ScsString,
pub value_type: ScsValueType,
pub padding: ScsPadding,
}
pub type ScsInputActiveCallback = unsafe extern "system" fn(active: ScsU8, context: ScsContext);
#[repr(C)]
#[derive(Clone, Copy)]
pub union ScsInputEventValue {
pub value_bool: ScsValueBool,
pub value_float: ScsValueFloat,
pub sizing_for_future_extensions: [f32; 6],
}
#[repr(C)]
#[derive(Clone, Copy)]
pub struct ScsInputEvent {
pub input_index: ScsU32,
pub value: ScsInputEventValue,
}
pub type ScsInputEventCallback = unsafe extern "system" fn(
event_info: *mut ScsInputEvent,
flags: ScsU32,
context: ScsContext,
) -> ScsResult;
#[repr(C)]
pub struct ScsInputDevice {
pub name: ScsString,
pub display_name: ScsString,
pub type_: ScsInputDeviceType,
pub input_count: ScsU32,
pub inputs: *const ScsInputDeviceInput,
pub callback_context: ScsContext,
pub input_active_callback: Option<ScsInputActiveCallback>,
pub input_event_callback: ScsInputEventCallback,
}
pub type ScsInputRegisterDevice =
unsafe extern "system" fn(device_info: *const ScsInputDevice) -> ScsResult;
#[repr(C)]
pub struct ScsInputInitParamsV100 {
pub common: ScsSdkInitParamsV100,
pub register_device: ScsInputRegisterDevice,
}
const _: [(); 24] = [(); size_of::<ScsInputDeviceInput>()];
const _: [(); 24] = [(); size_of::<ScsInputEventValue>()];
const _: [(); 28] = [(); size_of::<ScsInputEvent>()];
const _: [(); 56] = [(); size_of::<ScsInputDevice>()];
const _: [(); 40] = [(); size_of::<ScsInputInitParamsV100>()];
const _: [(); 0] = [(); offset_of!(ScsInputDeviceInput, name)];
const _: [(); 8] = [(); offset_of!(ScsInputDeviceInput, display_name)];
const _: [(); 16] = [(); offset_of!(ScsInputDeviceInput, value_type)];
const _: [(); 20] = [(); offset_of!(ScsInputDeviceInput, padding)];
const _: [(); 4] = [(); offset_of!(ScsInputEvent, value)];
const _: [(); 0] = [(); offset_of!(ScsInputDevice, name)];
const _: [(); 8] = [(); offset_of!(ScsInputDevice, display_name)];
const _: [(); 16] = [(); offset_of!(ScsInputDevice, type_)];
const _: [(); 20] = [(); offset_of!(ScsInputDevice, input_count)];
const _: [(); 24] = [(); offset_of!(ScsInputDevice, inputs)];
const _: [(); 32] = [(); offset_of!(ScsInputDevice, callback_context)];
const _: [(); 40] = [(); offset_of!(ScsInputDevice, input_active_callback)];
const _: [(); 48] = [(); offset_of!(ScsInputDevice, input_event_callback)];
const _: [(); 0] = [(); offset_of!(ScsInputInitParamsV100, common)];
const _: [(); 32] = [(); offset_of!(ScsInputInitParamsV100, register_device)];
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn input_constants_match_the_sdk_1_14_headers() {
assert_eq!(SCS_INPUT_VERSION_CURRENT, make_version(1, 0));
assert_eq!(SCS_INPUT_EUT2_GAME_VERSION_CURRENT, make_version(1, 0));
assert_eq!(SCS_INPUT_ATS_GAME_VERSION_CURRENT, make_version(1, 0));
assert_eq!(SCS_INPUT_MAX_INPUT_COUNT, 400);
assert_eq!(SCS_INPUT_DEVICE_TYPE_GENERIC, 1);
assert_eq!(SCS_INPUT_DEVICE_TYPE_SEMANTICAL, 2);
}
}