e2r 0.10.0

experimental rendering engine in rust
Documentation
extern crate glutin;

use interface::i_ui::{ IUi, InputFiltered, KeyCode, Coord, State };

pub struct XformInput {
    _moving_avg: u32,
}

impl Default for XformInput {

    fn default() -> Self {
        XformInput {
            _moving_avg: 1, //todo
        }
    }

}

impl IUi for XformInput {
    
    type EventInput = glutin::Event;
    type EventInputFiltered = InputFiltered;

    fn new() -> Self {
        Default::default()
    }
    
    fn process_input_events( & mut self, e: & [ Self::EventInput ], win_offset: (i32,i32), win_size: (u32,u32) ) -> Vec< InputFiltered > {
        let filtered = e.iter()
            .map( |x| InputFiltered::from( ( x, win_offset, win_size ) ) )
            .filter( |x| if let &InputFiltered::Ignored = x { false } else { true } )
            .inspect( |x| { trace!("{:?}", x); () } )
            .collect();
        filtered
    }
}


///convert glutin::Event into i_ui::InputFiltered
impl< 'a > From< (& 'a glutin::Event, (i32,i32), (u32,u32) )> for InputFiltered {
    fn from( input: (& 'a glutin::Event, (i32,i32), (u32,u32) ) ) -> Self {
        let e = input.0;
        let win_offset = input.1;
        let win_size = input.2;
        match e {
            &glutin::Event::WindowEvent{ ref event, .. } => match event {
                &glutin::WindowEvent::CloseRequested => {
                    InputFiltered::Button { key: KeyCode::Close, state: State::Press }
                },
                &glutin::WindowEvent::Resized( logical_size ) => { //todo
                    InputFiltered::Ignored
                },
                &glutin::WindowEvent::ReceivedCharacter(x) => {
                    match x {
                        'a' | 'A' => InputFiltered::Button { key: KeyCode::A, state: State::Press },
                        'b' | 'B' => InputFiltered::Button { key: KeyCode::B, state: State::Press },
                        'c' | 'C' => InputFiltered::Button { key: KeyCode::C, state: State::Press },
                        'd' | 'D' => InputFiltered::Button { key: KeyCode::D, state: State::Press },
                        'e' | 'E' => InputFiltered::Button { key: KeyCode::E, state: State::Press },
                        'f' | 'F' => InputFiltered::Button { key: KeyCode::F, state: State::Press },
                        'g' | 'G' => InputFiltered::Button { key: KeyCode::G, state: State::Press },
                        'h' | 'H' => InputFiltered::Button { key: KeyCode::H, state: State::Press },
                        'i' | 'I' => InputFiltered::Button { key: KeyCode::I, state: State::Press },
                        'j' | 'J' => InputFiltered::Button { key: KeyCode::J, state: State::Press },
                        'k' | 'K' => InputFiltered::Button { key: KeyCode::K, state: State::Press },
                        'l' | 'L' => InputFiltered::Button { key: KeyCode::L, state: State::Press },
                        'm' | 'M' => InputFiltered::Button { key: KeyCode::M, state: State::Press },
                        'n' | 'N' => InputFiltered::Button { key: KeyCode::N, state: State::Press },
                        'o' | 'O' => InputFiltered::Button { key: KeyCode::O, state: State::Press },
                        'p' | 'P' => InputFiltered::Button { key: KeyCode::P, state: State::Press },
                        'q' | 'Q' => InputFiltered::Button { key: KeyCode::Q, state: State::Press },
                        'r' | 'R' => InputFiltered::Button { key: KeyCode::R, state: State::Press },
                        's' | 'S' => InputFiltered::Button { key: KeyCode::S, state: State::Press },
                        't' | 'T' => InputFiltered::Button { key: KeyCode::T, state: State::Press },
                        'u' | 'U' => InputFiltered::Button { key: KeyCode::U, state: State::Press },
                        'v' | 'V' => InputFiltered::Button { key: KeyCode::V, state: State::Press },
                        'w' | 'W' => InputFiltered::Button { key: KeyCode::W, state: State::Press },
                        'x' | 'X' => InputFiltered::Button { key: KeyCode::X, state: State::Press },
                        'y' | 'Y' => InputFiltered::Button { key: KeyCode::Y, state: State::Press },
                        'z' | 'Z' => InputFiltered::Button { key: KeyCode::Z, state: State::Press },
                        '0' => InputFiltered::Button { key: KeyCode::Num0, state: State::Press },
                        '1' => InputFiltered::Button { key: KeyCode::Num1, state: State::Press },
                        '2' => InputFiltered::Button { key: KeyCode::Num2, state: State::Press },
                        '3' => InputFiltered::Button { key: KeyCode::Num3, state: State::Press },
                        '4' => InputFiltered::Button { key: KeyCode::Num4, state: State::Press },
                        '5' => InputFiltered::Button { key: KeyCode::Num5, state: State::Press },
                        '6' => InputFiltered::Button { key: KeyCode::Num6, state: State::Press },
                        '7' => InputFiltered::Button { key: KeyCode::Num7, state: State::Press },
                        '8' => InputFiltered::Button { key: KeyCode::Num8, state: State::Press },
                        '9' => InputFiltered::Button { key: KeyCode::Num9, state: State::Press },
                        ' ' => InputFiltered::Button { key: KeyCode::Space, state: State::Press },
                        _ => {
                            trace!("key events ignored: {:?}", e );
                            InputFiltered::Ignored
                        },
                    }
                },
                // issues: conversion from measured analog reading to physical or logical screen unit
                &glutin::WindowEvent::AxisMotion { ref axis, ref value, .. } => {
                    // info!("mouse input: {:?}, {:?}", axis, value );
                    let ( coord, val ) = match axis {
                        &0 => {
                            // println!("window mouse event x: {}, win offset: {:?}", *value as f32, win_offset );
                            ( Coord::X, *value as f32 - win_offset.0 as f32 )
                        },
                        &1 => {
                            ( Coord::Y, *value as f32 - win_offset.1 as f32 )
                        },
                        _ => {
                            ( Coord::Z, *value as f32 )
                        },
                    };
                    InputFiltered::MouseCoord( coord, val )
                },
                // &glutin::WindowEvent::CursorMoved { ref device_id, ref position/*logical pos*/, .. } => {
                //     info!("mouse input: {:?}", position );
                //     InputFiltered::MouseCoord2( position.x as f32 - win_offset.0 as f32,
                //                                 position.y as f32 - win_offset.1 as f32 )
                // },
                &glutin::WindowEvent::KeyboardInput { ref input, .. } => {
                    match input {
                        &glutin::KeyboardInput {
                            ref state,
                            ref virtual_keycode,
                            ..
                        } => {
                            // trace!("probing: {:?}", input );
                            let k = match virtual_keycode {
                                &Some(glutin::VirtualKeyCode::Left) => Some( KeyCode::Left ),
                                &Some(glutin::VirtualKeyCode::Right) => Some( KeyCode::Right ),
                                &Some(glutin::VirtualKeyCode::Up) => Some( KeyCode::Up ),
                                &Some(glutin::VirtualKeyCode::Down) => Some( KeyCode::Down ),
                                _ => None,
                            };
                            let s = match state {
                                &glutin::ElementState::Pressed => State::Press,
                                _ => State::Release,
                            };
                            if let Some( x ) = k {
                                InputFiltered::Button { key: x, state: s }
                            } else {
                                InputFiltered::Ignored
                            }
                        },
                    }
                },
                &glutin::WindowEvent::MouseInput { ref state, ref button, .. } => {
                    let k = match button {
                        &glutin::MouseButton::Left  => {
                            Some( KeyCode::MouseL )
                        },
                        &glutin::MouseButton::Right  => {
                            Some( KeyCode::MouseR )
                        },
                        _ => None
                    };
                    let s = match state {
                        &glutin::ElementState::Pressed => State::Press,
                        _ => State::Release,
                    };
                    if let Some( x ) = k {
                        InputFiltered::Button { key: x, state: s }
                    } else {
                        InputFiltered::Ignored
                    }
                },
                _ => {
                    trace!("events input ignored: {:?}", e );
                    InputFiltered::Ignored
                },
            },
            _ => InputFiltered::Ignored
        }
    }
}