use super::utils::RGBA;
use crate::core::factory::Handle;
mod action_evaluator;
pub(crate) mod gamepad;
#[doc(hidden)]
pub mod input_manager;
mod records;
#[doc(hidden)]
pub mod action;
#[doc(hidden)]
pub mod device;
#[doc(hidden)]
pub mod device_class;
#[doc(hidden)]
pub mod input_trigger;
mod seat;
#[doc(hidden)]
pub mod utils;
pub use action::Action;
pub use action::ActionBindingDescription;
pub use action::ActionHandle;
pub use device::DeviceHandle;
pub use input_manager::InputActionError;
pub use input_manager::InputManager;
pub use input_trigger::TriggerHandle;
use math::Quaternion;
use math::Vector2;
use math::Vector3;
pub use seat::SeatHandle;
use self::action::InputValue;
#[derive(Copy, Clone, PartialEq, Eq, Debug)]
pub enum Types {
Boolean,
Unicode,
Float,
Int,
Vector2,
Vector3,
Quaternion,
Rgba,
}
#[derive(Debug, Copy, Clone, PartialEq)]
pub enum Value {
Bool(bool),
Unicode(char),
Float(f32),
Int(i32),
Rgba(RGBA),
Vector2(Vector2),
Vector3(Vector3),
Quaternion(Quaternion),
}
impl From<bool> for Value {
fn from(val: bool) -> Self {
Value::Bool(val)
}
}
impl From<char> for Value {
fn from(val: char) -> Self {
Value::Unicode(val)
}
}
impl From<f32> for Value {
fn from(val: f32) -> Self {
Value::Float(val)
}
}
impl From<i32> for Value {
fn from(val: i32) -> Self {
Value::Int(val)
}
}
impl From<RGBA> for Value {
fn from(val: RGBA) -> Self {
Value::Rgba(val)
}
}
impl From<Vector2> for Value {
fn from(val: Vector2) -> Self {
Value::Vector2(val)
}
}
impl From<Vector3> for Value {
fn from(val: Vector3) -> Self {
Value::Vector3(val)
}
}
impl From<Quaternion> for Value {
fn from(val: Quaternion) -> Self {
Value::Quaternion(val)
}
}
impl Value {
pub fn is_default(&self) -> bool {
match self {
Value::Bool(v) => !v,
Value::Unicode(v) => *v == '\0',
Value::Float(v) => *v == 0.0,
Value::Int(v) => *v == 0,
Value::Rgba(v) => v.r == 0.0 && v.g == 0.0 && v.b == 0.0 && v.a == 0.0,
Value::Vector2(v) => v.x == 0.0 && v.y == 0.0,
Value::Vector3(v) => v.x == 0.0 && v.y == 0.0 && v.z == 0.0,
Value::Quaternion(v) => *v == Quaternion::identity(),
}
}
}
impl From<Value> for Types {
fn from(val: Value) -> Self {
match val {
Value::Bool(_) => Types::Boolean,
Value::Unicode(_) => Types::Unicode,
Value::Float(_) => Types::Float,
Value::Int(_) => Types::Int,
Value::Rgba(_) => Types::Rgba,
Value::Vector2(_) => Types::Vector2,
Value::Vector3(_) => Types::Vector3,
Value::Quaternion(_) => Types::Quaternion,
}
}
}
impl Types {
pub fn default_value(&self) -> Value {
match self {
Types::Boolean => Value::Bool(false),
Types::Unicode => Value::Unicode('\0'),
Types::Float => Value::Float(0.0),
Types::Int => Value::Int(0),
Types::Rgba => Value::Rgba(RGBA::new(0.0, 0.0, 0.0, 1.0)),
Types::Vector2 => Value::Vector2(Vector2::new(0.0, 0.0)),
Types::Vector3 => Value::Vector3(Vector3::new(0.0, 0.0, 0.0)),
Types::Quaternion => Value::Quaternion(Quaternion::identity()),
}
}
}
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub enum Function {
Boolean,
Threshold,
Linear,
Sphere,
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, Default)]
pub enum TickPolicy {
#[default]
OnChange,
WhileActive,
Always,
}
pub trait Extract<T: InputValue> {
fn extract(&self) -> T;
}
impl Extract<bool> for Value {
fn extract(&self) -> bool {
match self {
Value::Bool(value) => *value,
_ => panic!("Wrong type"),
}
}
}
impl Extract<Vector2> for Value {
fn extract(&self) -> Vector2 {
match self {
Value::Vector2(value) => *value,
_ => panic!("Wrong type"),
}
}
}
impl Extract<Vector3> for Value {
fn extract(&self) -> Vector3 {
match self {
Value::Vector3(value) => *value,
_ => panic!("Wrong type"),
}
}
}
#[derive(Copy, Clone, Debug, PartialEq)]
pub struct ValueMapping {
pub(crate) function: Function,
pub(crate) value: Value,
}
impl ValueMapping {
pub fn new<V: Into<Value>>(function: Function, value: V) -> Self {
Self {
function,
value: value.into(),
}
}
pub fn function(mut self, function: Function) -> Self {
self.function = function;
self
}
pub fn value(mut self, value: Value) -> Self {
self.value = value;
self
}
}
impl From<bool> for ValueMapping {
fn from(val: bool) -> Self {
ValueMapping::new(Function::Linear, val)
}
}
impl From<Vector2> for ValueMapping {
fn from(val: Vector2) -> Self {
ValueMapping::new(Function::Linear, val)
}
}
impl From<Vector3> for ValueMapping {
fn from(val: Vector3) -> Self {
ValueMapping::new(Function::Linear, val)
}
}
impl From<Quaternion> for ValueMapping {
fn from(val: Quaternion) -> Self {
ValueMapping::new(Function::Linear, val)
}
}
impl From<f32> for ValueMapping {
fn from(val: f32) -> Self {
ValueMapping::new(Function::Linear, val)
}
}
impl From<Value> for ValueMapping {
fn from(val: Value) -> Self {
ValueMapping::new(Function::Linear, val)
}
}
#[derive(Clone, Debug)]
pub struct ActionEvent {
seat_handle: SeatHandle,
handle: Handle,
value: Value,
}
impl ActionEvent {
pub fn new(seat_handle: SeatHandle, handle: Handle, value: Value) -> Self {
Self {
seat_handle,
handle,
value,
}
}
pub fn seat_handle(&self) -> SeatHandle {
self.seat_handle
}
pub fn handle(&self) -> Handle {
self.handle
}
pub fn value(&self) -> Value {
self.value
}
}