no-std enum from u8
This commit is contained in:
parent
d8b9a656dc
commit
0c6e3a9e54
4 changed files with 56 additions and 37 deletions
17
Cargo.lock
generated
17
Cargo.lock
generated
|
@ -58,7 +58,7 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "client"
|
name = "client"
|
||||||
version = "0.1.0"
|
version = "1.0.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"gilrs",
|
"gilrs",
|
||||||
"minifb",
|
"minifb",
|
||||||
|
@ -530,17 +530,6 @@ dependencies = [
|
||||||
"num-traits",
|
"num-traits",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "num-derive"
|
|
||||||
version = "0.4.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "9e6a0fd4f737c707bd9086cc16c925f294943eb62eb71499e9fd4cf71f8b9f4e"
|
|
||||||
dependencies = [
|
|
||||||
"proc-macro2",
|
|
||||||
"quote",
|
|
||||||
"syn",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "num-integer"
|
name = "num-integer"
|
||||||
version = "0.1.45"
|
version = "0.1.45"
|
||||||
|
@ -620,12 +609,10 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pirates"
|
name = "pirates"
|
||||||
version = "0.1.0"
|
version = "1.0.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"libm",
|
"libm",
|
||||||
"nalgebra",
|
"nalgebra",
|
||||||
"num-derive",
|
|
||||||
"num-traits",
|
|
||||||
"rayon",
|
"rayon",
|
||||||
"spin",
|
"spin",
|
||||||
"wee_alloc",
|
"wee_alloc",
|
||||||
|
|
|
@ -74,20 +74,19 @@ fn main() {
|
||||||
|
|
||||||
#[cfg(feature = "gamepad")]
|
#[cfg(feature = "gamepad")]
|
||||||
if let Some(gamepad) = gamepad_handle.map(|h| gilrs.gamepad(h)) {
|
if let Some(gamepad) = gamepad_handle.map(|h| gilrs.gamepad(h)) {
|
||||||
// see [ref:input_handler] for mapping info
|
|
||||||
gamepad.axis_data(Axis::LeftStickX).map(|axis| {
|
gamepad.axis_data(Axis::LeftStickX).map(|axis| {
|
||||||
analog_input(AxisRudder, axis.value());
|
analog_input(AxisRudder, axis.value());
|
||||||
});
|
});
|
||||||
if gamepad.is_pressed(Button::LeftTrigger) {
|
if gamepad.is_pressed(Button::LeftTrigger) {
|
||||||
gamepad.axis_data(Axis::LeftStickY).map(|axis| {
|
gamepad.axis_data(Axis::LeftStickY).map(|axis| {
|
||||||
analog_input(5, axis.value());
|
analog_input(AxisSail, axis.value());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if gamepad.is_pressed(Button::South) {
|
if gamepad.is_pressed(Button::South) {
|
||||||
keyboard_input(69)
|
keyboard_input(RaiseSail)
|
||||||
}
|
}
|
||||||
if gamepad.is_pressed(Button::East) {
|
if gamepad.is_pressed(Button::East) {
|
||||||
keyboard_input(81)
|
keyboard_input(LowerSail)
|
||||||
}
|
}
|
||||||
if gamepad.is_pressed(Button::RightTrigger) {
|
if gamepad.is_pressed(Button::RightTrigger) {
|
||||||
gamepad.axis_data(Axis::RightStickY).map(|axis| {
|
gamepad.axis_data(Axis::RightStickY).map(|axis| {
|
||||||
|
@ -102,10 +101,10 @@ fn main() {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if gamepad.is_pressed(Button::West) {
|
if gamepad.is_pressed(Button::West) {
|
||||||
keyboard_input(191)
|
keyboard_input(ResetCamera)
|
||||||
}
|
}
|
||||||
if gamepad.is_pressed(Button::North) {
|
if gamepad.is_pressed(Button::North) {
|
||||||
keyboard_input(82)
|
keyboard_input(ResetBoat)
|
||||||
}
|
}
|
||||||
if gamepad.is_pressed(Button::DPadLeft) {
|
if gamepad.is_pressed(Button::DPadLeft) {
|
||||||
keyboard_input(PanLeft)
|
keyboard_input(PanLeft)
|
||||||
|
@ -121,7 +120,6 @@ fn main() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// see [ref:input_handler] for mapping info
|
|
||||||
window.get_keys().iter().for_each(|key| match key {
|
window.get_keys().iter().for_each(|key| match key {
|
||||||
Key::A => keyboard_input(RudderLeft),
|
Key::A => keyboard_input(RudderLeft),
|
||||||
Key::D => keyboard_input(RudderRight),
|
Key::D => keyboard_input(RudderRight),
|
||||||
|
@ -131,10 +129,10 @@ fn main() {
|
||||||
Key::Down => keyboard_input(PanDown),
|
Key::Down => keyboard_input(PanDown),
|
||||||
Key::Left => keyboard_input(PanLeft),
|
Key::Left => keyboard_input(PanLeft),
|
||||||
Key::Right => keyboard_input(PanRight),
|
Key::Right => keyboard_input(PanRight),
|
||||||
Key::R => keyboard_input(82),
|
Key::R => keyboard_input(ResetBoat),
|
||||||
Key::Slash => keyboard_input(191),
|
Key::Slash => keyboard_input(ResetCamera),
|
||||||
Key::E => keyboard_input(69),
|
Key::E => keyboard_input(RaiseSail),
|
||||||
Key::Q => keyboard_input(81),
|
Key::Q => keyboard_input(LowerSail),
|
||||||
_ => (),
|
_ => (),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -12,8 +12,6 @@ crate-type = ["lib", "cdylib"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
libm = "0.2.7"
|
libm = "0.2.7"
|
||||||
num-derive = "0.4.0"
|
|
||||||
num-traits = "0.2.16"
|
|
||||||
spin = "0.9.8"
|
spin = "0.9.8"
|
||||||
|
|
||||||
[dependencies.rayon]
|
[dependencies.rayon]
|
||||||
|
|
|
@ -15,8 +15,6 @@ static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;
|
||||||
extern crate alloc;
|
extern crate alloc;
|
||||||
use alloc::vec::Vec;
|
use alloc::vec::Vec;
|
||||||
use noise::PerlinBuf;
|
use noise::PerlinBuf;
|
||||||
use num_traits::FromPrimitive;
|
|
||||||
use num_derive::FromPrimitive;
|
|
||||||
use core::sync::atomic::{AtomicU32, Ordering};
|
use core::sync::atomic::{AtomicU32, Ordering};
|
||||||
use libm;
|
use libm;
|
||||||
extern crate nalgebra as na;
|
extern crate nalgebra as na;
|
||||||
|
@ -118,19 +116,21 @@ fn render_frame(buffer: &mut [u32; WIDTH*HEIGHT]) {
|
||||||
};
|
};
|
||||||
while let Some(key) = INPUTS.lock().pop() {
|
while let Some(key) = INPUTS.lock().pop() {
|
||||||
use Input::*;
|
use Input::*;
|
||||||
match FromPrimitive::from_u32(key[0]).unwrap() { // [tag:input_handler]
|
let input = (key[0] as u8).try_into().ok();
|
||||||
|
if input.is_none() { continue; }
|
||||||
|
match input.unwrap() {
|
||||||
PanUp => camera[1] -= gain*10.0*camera[2], // up
|
PanUp => camera[1] -= gain*10.0*camera[2], // up
|
||||||
PanDown => camera[1] += gain*10.0*camera[2], // down
|
PanDown => camera[1] += gain*10.0*camera[2], // down
|
||||||
PanLeft => camera[0] -= gain*10.0*camera[2], // left
|
PanLeft => camera[0] -= gain*10.0*camera[2], // left
|
||||||
PanRight => camera[0] += gain*10.0*camera[2], // right
|
PanRight => camera[0] += gain*10.0*camera[2], // right
|
||||||
191 => {
|
ResetCamera => {
|
||||||
*camera = [
|
*camera = [
|
||||||
noise::lerp(camera[0], 0.00, (gain * 0.25).min(1.0)),
|
noise::lerp(camera[0], 0.00, (gain * 0.25).min(1.0)),
|
||||||
noise::lerp(camera[1], 0.00, (gain * 0.25).min(1.0)),
|
noise::lerp(camera[1], 0.00, (gain * 0.25).min(1.0)),
|
||||||
noise::lerp(camera[2], 0.18, (gain * 0.25).min(1.0)),
|
noise::lerp(camera[2], 0.18, (gain * 0.25).min(1.0)),
|
||||||
]
|
]
|
||||||
}, // reset camera (/)
|
}, // reset camera (/)
|
||||||
82 => boat.set_pos(Vector2::zeros()), // reset boat (r)
|
ResetBoat => boat.set_pos(Vector2::zeros()), // reset boat (r)
|
||||||
ZoomIn => camera[2] *= 1.0 - 0.1*gain, // +
|
ZoomIn => camera[2] *= 1.0 - 0.1*gain, // +
|
||||||
ZoomOut => camera[2] *= 1.0 + 0.1*gain, // -
|
ZoomOut => camera[2] *= 1.0 + 0.1*gain, // -
|
||||||
RudderLeft => boat.theta -= gain*10.0, // A
|
RudderLeft => boat.theta -= gain*10.0, // A
|
||||||
|
@ -139,9 +139,9 @@ fn render_frame(buffer: &mut [u32; WIDTH*HEIGHT]) {
|
||||||
AxisRudder => boat.theta += gain * (key[1] as f32 - 127.0) * 0.062, // analog rudder
|
AxisRudder => boat.theta += gain * (key[1] as f32 - 127.0) * 0.062, // analog rudder
|
||||||
AxisPanY => camera[1] -= gain * (key[1] as f32 - 127.0) * 0.1 * camera[2], // pan[y]
|
AxisPanY => camera[1] -= gain * (key[1] as f32 - 127.0) * 0.1 * camera[2], // pan[y]
|
||||||
AxisPanX => camera[0] += gain * (key[1] as f32 - 127.0) * 0.1 * camera[2], // pan[x]
|
AxisPanX => camera[0] += gain * (key[1] as f32 - 127.0) * 0.1 * camera[2], // pan[x]
|
||||||
5 => boat.sail += gain * (key[1] as f32 - 127.0) * 0.0013, // sail
|
AxisSail => boat.sail += gain * (key[1] as f32 - 127.0) * 0.0013, // sail
|
||||||
69 => boat.sail += gain * 0.062, // E
|
RaiseSail => boat.sail += gain * 0.062, // E
|
||||||
81 => boat.sail -= gain * 0.062, // Q
|
LowerSail => boat.sail -= gain * 0.062, // Q
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
boat.sail = boat.sail.clamp(0.0, 1.5);
|
boat.sail = boat.sail.clamp(0.0, 1.5);
|
||||||
|
@ -316,7 +316,34 @@ impl Boat {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(FromPrimitive)]
|
impl TryFrom<u8> for Input {
|
||||||
|
type Error = &'static str;
|
||||||
|
|
||||||
|
fn try_from(input: u8) -> Result<Self, Self::Error> {
|
||||||
|
use Input::*;
|
||||||
|
match input {
|
||||||
|
38 => Ok(PanUp),
|
||||||
|
40 => Ok(PanDown),
|
||||||
|
37 => Ok(PanLeft),
|
||||||
|
39 => Ok(PanRight),
|
||||||
|
61 => Ok(ZoomIn),
|
||||||
|
173 => Ok(ZoomOut),
|
||||||
|
65 => Ok(RudderLeft),
|
||||||
|
68 => Ok(RudderRight),
|
||||||
|
69 => Ok(RaiseSail),
|
||||||
|
81 => Ok(LowerSail),
|
||||||
|
82 => Ok(ResetBoat),
|
||||||
|
191 => Ok(ResetCamera),
|
||||||
|
0 => Ok(AxisZoom),
|
||||||
|
1 => Ok(AxisRudder),
|
||||||
|
3 => Ok(AxisPanY),
|
||||||
|
4 => Ok(AxisPanX),
|
||||||
|
5 => Ok(AxisSail),
|
||||||
|
_ => Err("unmapped")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
#[repr(u8)]
|
#[repr(u8)]
|
||||||
pub enum Input {
|
pub enum Input {
|
||||||
/// Up Arrow
|
/// Up Arrow
|
||||||
|
@ -335,8 +362,17 @@ pub enum Input {
|
||||||
RudderLeft = 65,
|
RudderLeft = 65,
|
||||||
/// D
|
/// D
|
||||||
RudderRight = 68,
|
RudderRight = 68,
|
||||||
|
/// "/"
|
||||||
|
ResetCamera = 191,
|
||||||
|
/// R
|
||||||
|
ResetBoat = 82,
|
||||||
|
/// E
|
||||||
|
RaiseSail = 69,
|
||||||
|
/// Q
|
||||||
|
LowerSail = 81,
|
||||||
AxisZoom = 0,
|
AxisZoom = 0,
|
||||||
AxisRudder = 1,
|
AxisRudder = 1,
|
||||||
AxisPanY = 3,
|
AxisPanY = 3,
|
||||||
AxisPanX = 4,
|
AxisPanX = 4,
|
||||||
|
AxisSail = 5,
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue