From 85d55e42119ea80cd1cd9e9e34c05ea7d07b3a88 Mon Sep 17 00:00:00 2001 From: Lizzy Fleckenstein Date: Tue, 28 Feb 2023 18:08:41 +0100 Subject: [PATCH] Use cgmath and support BS constant --- Cargo.toml | 4 +- src/lib.rs | 5 +++ src/to_clt.rs | 56 +++++++++++++++----------- src/to_clt/hud.rs | 24 ++++++------ src/to_clt/inv.rs | 2 +- src/to_clt/media.rs | 95 +++++++++++++++++++++++++++++++++++++-------- src/to_clt/obj.rs | 50 +++++++++++++----------- src/to_clt/sky.rs | 2 +- src/to_srv.rs | 44 ++++++++++++++++----- 9 files changed, 194 insertions(+), 88 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 2bdd22b..a5461ed 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,12 +8,14 @@ all = ["client", "server", "random", "serde", "conn"] client = [] conn = ["dep:mt_rudp", "dep:thiserror"] random = ["dep:generate-random", "dep:rand"] -serde = ["dep:serde", "dep:serde_arrays", "enumset/serde"] +serde = ["dep:serde", "dep:serde_arrays", "enumset/serde", "cgmath/serde", "collision/serde"] server = [] test = ["client", "server", "random"] [dependencies] async-trait = "0.1.64" +cgmath = "0.17.0" +collision = "0.20.1" delegate = "0.9.0" enumset = { git = "https://github.com/Lymia/enumset" } generate-random = { git = "https://github.com/minetest-rust/generate-random", features = ["enumset"], optional = true } diff --git a/src/lib.rs b/src/lib.rs index 8e134c5..2c10f35 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -35,6 +35,11 @@ mod conn; #[cfg(feature = "conn")] pub use conn::*; +pub use cgmath::{Deg, Euler, Point2, Point3, Rad, Vector2, Vector3}; +pub use collision::{Aabb2, Aabb3}; + +pub const BS: f32 = 10.0; + mod to_clt; mod to_srv; diff --git a/src/to_clt.rs b/src/to_clt.rs index dae59ac..90af326 100644 --- a/src/to_clt.rs +++ b/src/to_clt.rs @@ -76,7 +76,10 @@ pub enum ToCltPkt { username: String, } = 2, AcceptAuth { - player_pos: [f32; 3], + #[mt(multiplier = "BS")] + #[mt(map_ser = "|x| Ok(x + Vector3::new(0.0, 0.5, 0.0) * BS)")] + #[mt(map_des = "|x: Point3| Ok(x - Vector3::new(0.0, 0.5, 0.0) * BS)")] + player_pos: Point3, map_seed: u64, send_interval: f32, sudo_auth_methods: EnumSet, @@ -88,12 +91,12 @@ pub enum ToCltPkt { DenySudoMode = 5, Kick(KickReason) = 10, BlockData { - pos: [i16; 3], + pos: Point3, #[mt(zstd)] block: Box, } = 32, AddNode { - pos: [i16; 3], + pos: Point3, param0: u16, param1: u8, param2: u8, @@ -115,7 +118,8 @@ pub enum ToCltPkt { map_range: u32, } = 42, AddPlayerVelocity { - vel: [f32; 3], + #[mt(multiplier = "BS")] + vel: Vector3, } = 43, MediaPush { raw_hash: String, @@ -146,22 +150,24 @@ pub enum ToCltPkt { damage_effect: bool, } = 51, MovePlayer { - pos: [f32; 3], - pitch: f32, - yaw: f32, + #[mt(multiplier = "BS")] + pos: Point3, + pitch: Deg, + yaw: Deg, } = 52, LegacyKick { #[mt(len = "Utf16")] reason: String, } = 53, Fov { - fov: f32, + fov: Deg, multiplier: bool, transition_time: f32, } = 54, DeathScreen { point_cam: bool, - point_at: [f32; 3], + #[mt(multiplier = "BS")] + point_at: Point3, } = 55, Media { n: u16, @@ -186,7 +192,8 @@ pub enum ToCltPkt { name: String, gain: f32, source: SoundSource, - pos: [f32; 3], + #[mt(multiplier = "BS")] + pos: Point3, src_obj_id: u16, #[serde(rename = "loop")] sound_loop: bool, @@ -231,9 +238,9 @@ pub enum ToCltPkt { gravity: f32, } = 69, SpawnParticle { - pos: [f32; 3], - vel: [f32; 3], - acc: [f32; 3], + pos: Point3, + vel: Vector3, + acc: Vector3, expiration_time: f32, size: f32, collide: bool, @@ -248,12 +255,13 @@ pub enum ToCltPkt { node_param2: u8, node_tile: u8, } = 70, + // TODO: support new particlespawner definitions (with tweening) AddParticleSpawner { amount: u16, duration: f32, - pos: RangeInclusive<[f32; 3]>, - vel: RangeInclusive<[f32; 3]>, - acc: RangeInclusive<[f32; 3]>, + pos: RangeInclusive>, + vel: RangeInclusive>, + acc: RangeInclusive>, expiration_time: RangeInclusive, size: RangeInclusive, collide: bool, @@ -296,15 +304,17 @@ pub enum ToCltPkt { ratio: u16, } = 80, LocalPlayerAnim { - idle: [i32; 2], - walk: [i32; 2], - dig: [i32; 2], - walk_dig: [i32; 2], + idle: RangeInclusive, + walk: RangeInclusive, + dig: RangeInclusive, + walk_dig: RangeInclusive, speed: f32, } = 81, EyeOffset { - first: [f32; 3], - third: [f32; 3], + #[mt(multiplier = "BS")] + first: Vector3, + #[mt(multiplier = "BS")] + third: Vector3, } = 82, RemoveParticleSpawner { id: u32, @@ -331,7 +341,7 @@ pub enum ToCltPkt { NodeMetasChanged { #[mt(size = "u32", zlib)] #[mt(len = "NodeMetasLen")] - changed: HashMap<[i16; 3], NodeMeta>, + changed: HashMap, NodeMeta>, } = 89, SunParams(SunParams) = 90, MoonParams(MoonParams) = 91, diff --git a/src/to_clt/hud.rs b/src/to_clt/hud.rs index 3b2a456..b0f56d9 100644 --- a/src/to_clt/hud.rs +++ b/src/to_clt/hud.rs @@ -9,17 +9,17 @@ pub enum HudStyleFlag { #[mt_derive(to = "clt", repr = "u8", tag = "attribute", content = "value")] pub enum HudChange { - Pos([f32; 2]) = 0, + Pos(Point2) = 0, Name(String), - Scale([f32; 2]), + Scale(Vector2), Text(String), Number(u32), Item(u32), Dir(u32), - Align([f32; 2]), - Offset([f32; 2]), - WorldPos([f32; 3]), - Size([i32; 2]), + Align(Vector2), + Offset(Vector2), + WorldPos(Point3), + Size(Vector2), ZIndex(i32), // this is i16 in HudAdd, minetest is weird Text2(String), Style(EnumSet), @@ -38,17 +38,17 @@ pub enum HudType { #[mt_derive(to = "clt")] pub struct HudElement { pub hud_type: HudType, - pub pos: [f32; 2], + pub pos: Point2, pub name: String, - pub scale: [f32; 2], + pub scale: Vector2, pub text: String, pub number: u32, pub item: u32, pub dir: u32, - pub align: [f32; 2], - pub offset: [f32; 2], - pub world_pos: [f32; 3], - pub size: [i32; 2], + pub align: Vector2, + pub offset: Vector2, + pub world_pos: Point3, + pub size: Vector2, pub z_index: i16, pub text_2: String, pub style: EnumSet, diff --git a/src/to_clt/inv.rs b/src/to_clt/inv.rs index 01eaa75..1a33a68 100644 --- a/src/to_clt/inv.rs +++ b/src/to_clt/inv.rs @@ -23,7 +23,7 @@ fn read_line(reader: &mut impl std::io::Read) -> Result>()?; String::from_utf8(utf8) - .map_err(|e| mt_ser::DeserializeError::Other(format!("Invalid UTF-8: {e}").into())) + .map_err(|e| mt_ser::DeserializeError::Other(format!("Invalid UTF-8: {e}"))) } #[cfg(feature = "client")] diff --git a/src/to_clt/media.rs b/src/to_clt/media.rs index c05492d..93f9f6c 100644 --- a/src/to_clt/media.rs +++ b/src/to_clt/media.rs @@ -72,11 +72,11 @@ pub enum Alpha { pub enum TileAnim { None = 0, VerticalFrame { - n_frames: [u16; 2], + n_frames: Vector2, duration: f32, }, SpriteSheet { - aspect_ratio: [u8; 2], + aspect_ratio: Vector2, duration: f32, }, } @@ -214,28 +214,89 @@ impl MtDeserialize for TileDef { } } +trait BsAabb: Sized { + fn ser(&self) -> Self; + fn des(&self) -> Self; +} + +impl BsAabb for Aabb3 { + fn ser(&self) -> Self { + collision::Aabb::mul_s(self, BS) + } + + fn des(&self) -> Self { + collision::Aabb::mul_s(self, BS) + } +} + +impl BsAabb for Vec { + fn ser(&self) -> Self { + self.iter().map(BsAabb::ser).collect() + } + + fn des(&self) -> Self { + self.iter().map(BsAabb::des).collect() + } +} + +impl BsAabb for [T; N] { + fn ser(&self) -> Self { + std::array::from_fn(|i| self[i].ser()) + } + + fn des(&self) -> Self { + std::array::from_fn(|i| self[i].des()) + } +} + +#[cfg(feature = "server")] +fn ser_bs_aabb(aabb: &T) -> Result { + Ok(aabb.ser()) +} + +#[cfg(feature = "client")] +fn des_bs_aabb(aabb: T) -> Result { + Ok(aabb.des()) +} + +#[mt_derive(to = "clt")] +pub struct MountedNodeBox { + #[mt(map_ser = "ser_bs_aabb", map_des = "des_bs_aabb")] + wall_top: Aabb3, + #[mt(map_ser = "ser_bs_aabb", map_des = "des_bs_aabb")] + wall_bottom: Aabb3, + #[mt(map_ser = "ser_bs_aabb", map_des = "des_bs_aabb")] + wall_sides: Aabb3, +} + +#[mt_derive(to = "clt")] +pub struct ConnectedNodeBox { + #[mt(map_ser = "ser_bs_aabb", map_des = "des_bs_aabb")] + fixed: Vec>, + #[mt(map_ser = "ser_bs_aabb", map_des = "des_bs_aabb")] + connect_dirs: [Vec>; 6], + #[mt(map_ser = "ser_bs_aabb", map_des = "des_bs_aabb")] + disconnect_dirs: [Vec>; 6], + #[mt(map_ser = "ser_bs_aabb", map_des = "des_bs_aabb")] + disconnect_all: Vec>, + #[mt(map_ser = "ser_bs_aabb", map_des = "des_bs_aabb")] + disconnect_sides: Vec>, +} + #[mt_derive(to = "clt", repr = "u8", tag = "type")] #[mt(const_before = "6u8")] pub enum NodeBox { Cube = 0, Fixed { - fixed: Vec>, - }, - Mounted { - wall_top: RangeInclusive<[f32; 3]>, - wall_bottom: RangeInclusive<[f32; 3]>, - wall_sides: RangeInclusive<[f32; 3]>, + #[mt(map_ser = "ser_bs_aabb", map_des = "des_bs_aabb")] + fixed: Vec>, }, + Mounted(Box), Leveled { - fixed: Vec>, - }, - Connected { - fixed: Vec>, - connect_dirs: [Vec>; 6], - disconnect_dirs: [Vec>; 6], - disconnect_all: Vec>, - disconnect_sides: Vec>, + #[mt(map_ser = "ser_bs_aabb", map_des = "des_bs_aabb")] + fixed: Vec>, }, + Connected(Box), } #[mt_derive(to = "clt")] @@ -413,7 +474,7 @@ pub struct ItemDef { pub description: String, pub inventory_image: String, pub wield_image: String, - pub wield_scale: [f32; 3], + pub wield_scale: Vector3, pub stack_max: u16, pub usable: bool, pub can_point_liquids: bool, diff --git a/src/to_clt/obj.rs b/src/to_clt/obj.rs index 1b605cc..7ce9f32 100644 --- a/src/to_clt/obj.rs +++ b/src/to_clt/obj.rs @@ -16,33 +16,33 @@ pub struct ObjProps { pub max_hp: u16, // player only pub collide_with_nodes: bool, pub weight: f32, // deprecated - pub collision_box: RangeInclusive<[f32; 3]>, - pub selection_box: RangeInclusive<[f32; 3]>, + pub collision_box: Aabb3, + pub selection_box: Aabb3, pub pointable: bool, pub visual: ObjVisual, - pub visual_size: [f32; 3], + pub visual_size: Vector3, pub textures: Vec, - pub sprite_sheet_size: [i16; 2], // in sprites - pub sprite_pos: [i16; 2], // in sprite sheet + pub sprite_sheet_size: Vector2, // in sprites + pub sprite_pos: Point2, // in sprite sheet pub visible: bool, pub make_footstep_sounds: bool, - pub rotate_speed: f32, // in radians per second + pub rotate_speed: Rad, // per second pub mesh: String, pub colors: Vec, pub collide_with_objs: bool, pub step_height: f32, pub face_rotate_dir: bool, - pub face_rotate_dir_off: f32, // in degrees + pub face_rotate_dir_off: Deg, pub backface_cull: bool, pub nametag: String, pub nametag_color: Color, - pub face_rotate_speed: f32, // in degrees per second + pub face_rotate_speed: Deg, // per second pub infotext: String, pub itemstring: String, pub glow: i8, - pub max_breath: u16, // player only - pub eye_height: f32, // player only - pub zoom_fov: f32, // in degrees. player only + pub max_breath: u16, // player only + pub eye_height: f32, // player only + pub zoom_fov: Deg, // player only pub use_texture_alpha: bool, pub dmg_texture_mod: String, // suffix pub shaded: bool, @@ -52,10 +52,13 @@ pub struct ObjProps { #[mt_derive(to = "clt")] pub struct ObjPos { - pub pos: [f32; 3], - pub vel: [f32; 3], - pub acc: [f32; 3], - pub rot: [f32; 3], + #[mt(multiplier = "BS")] + pub pos: Point3, + #[mt(multiplier = "BS")] + pub vel: Vector3, + #[mt(multiplier = "BS")] + pub acc: Vector3, + pub rot: Euler>, pub interpolate: bool, pub end: bool, pub update_interval: f32, @@ -63,7 +66,7 @@ pub struct ObjPos { #[mt_derive(to = "clt")] pub struct ObjSprite { - pub frame0: [i16; 2], + pub frame_0: Point2, pub frames: u16, pub frame_duration: f32, pub view_angle_frames: bool, @@ -71,7 +74,7 @@ pub struct ObjSprite { #[mt_derive(to = "clt")] pub struct ObjAnim { - pub frames: [i32; 2], + pub frames: Vector2, pub speed: f32, pub blend: f32, pub no_loop: bool, @@ -79,16 +82,16 @@ pub struct ObjAnim { #[mt_derive(to = "clt")] pub struct ObjBonePos { - pub pos: [f32; 3], - pub rot: [f32; 3], + pub pos: Point3, + pub rot: Euler>, } #[mt_derive(to = "clt")] pub struct ObjAttach { pub parent_id: u16, pub bone: String, - pub pos: [f32; 3], - pub rot: [f32; 3], + pub pos: Point3, + pub rot: Euler>, pub force_visible: bool, } @@ -152,8 +155,9 @@ pub struct ObjInitData { pub name: String, pub is_player: bool, pub id: u16, - pub pos: [f32; 3], - pub rot: [f32; 3], + #[mt(multiplier = "BS")] + pub pos: Point3, + pub rot: Euler>, pub hp: u16, #[mt(len = "u8")] pub msgs: Vec, diff --git a/src/to_clt/sky.rs b/src/to_clt/sky.rs index c9cb642..d0e0263 100644 --- a/src/to_clt/sky.rs +++ b/src/to_clt/sky.rs @@ -188,5 +188,5 @@ pub struct CloudParams { pub ambient_color: Color, pub height: f32, pub thickness: f32, - pub speed: [f32; 2], + pub speed: Vector2, } diff --git a/src/to_srv.rs b/src/to_srv.rs index dc9a342..0611bb9 100644 --- a/src/to_srv.rs +++ b/src/to_srv.rs @@ -14,14 +14,34 @@ pub enum Key { Zoom, } +#[cfg(feature = "client")] +fn ser_cast_err() -> mt_ser::SerializeError { + mt_ser::SerializeError::Other("cast failed".into()) +} + +#[cfg(feature = "server")] +fn des_cast_err() -> mt_ser::DeserializeError { + mt_ser::DeserializeError::Other("cast failed".into()) +} + #[mt_derive(to = "srv")] pub struct PlayerPos { - pub pos_100: [i32; 3], - pub vel_100: [i32; 3], - pub pitch_100: i32, - pub yaw_100: i32, + #[mt(multiplier = "100.0 * BS")] + #[mt(map_ser = "|x| x.cast::().ok_or_else(ser_cast_err)")] + #[mt(map_des = "|x: Point3| x.cast::().ok_or_else(des_cast_err)")] + pub pos: Point3, + #[mt(multiplier = "100.0 * BS")] + #[mt(map_ser = "|x| x.cast::().ok_or_else(ser_cast_err)")] + #[mt(map_des = "|x: Vector3| x.cast::().ok_or_else(des_cast_err)")] + pub vel: Vector3, + #[mt(map_ser = "|x| Ok(x.0 as i32)", map_des = "|x: i32| Ok(Deg(x as f32))")] + pub pitch: Deg, + #[mt(map_ser = "|x| Ok(x.0 as i32)", map_des = "|x: i32| Ok(Deg(x as f32))")] + pub yaw: Deg, pub keys: EnumSet, - pub fov_80: u8, + #[mt(multiplier = "80.0")] + #[mt(map_ser = "|x| Ok(x.0 as u8)", map_des = "|x: u8| Ok(Rad(x as f32))")] + pub fov: Rad, pub wanted_range: u8, } @@ -39,8 +59,13 @@ pub enum Interaction { #[mt(const_before = "0u8")] // version pub enum PointedThing { None = 0, - Node { under: [i16; 3], above: [i16; 3] }, - Obj { obj: u16 }, + Node { + under: Point3, + above: Point3, + }, + Obj { + obj: u16, + }, } #[mt_derive(to = "srv", repr = "u16", tag = "type", content = "data")] @@ -49,8 +74,7 @@ pub enum ToSrvPkt { Init { serialize_version: u8, #[mt(const_before = "1u16")] // supported compression - min_proto_version: u16, - max_proto_version: u16, + proto_version: RangeInclusive, player_name: String, #[mt(default)] send_full_item_meta: bool, @@ -71,7 +95,7 @@ pub enum ToSrvPkt { PlayerPos(PlayerPos) = 35, GotBlocks { #[mt(len = "u8")] - blocks: Vec<[i16; 3]>, + blocks: Vec>, } = 36, DeletedBlocks { #[mt(len = "u8")] -- 2.44.0