Maraiah/maraiah/map/medi.rs

72 lines
1.6 KiB
Rust
Raw Normal View History

2019-04-01 00:39:47 -07:00
//! `Light` type.
2019-04-01 01:50:05 -07:00
use super::pnts;
2019-06-13 18:09:07 -07:00
use crate::{bin::OptU16,
err::*,
fixed::{Angle, Fixed, Unit},
xfer::TransferMode};
2019-04-01 00:39:47 -07:00
/// Reads a `medi` chunk.
pub fn read(b: &[u8]) -> ResultS<(Media, usize)>
{
2019-07-05 20:21:11 -07:00
read_data! {
endian: BIG, buf: b, size: 32, start: 0, data {
let mtype = u16[0] enum MediaType;
let flags = u8[3] flag MediaFlags;
let control = u16[4];
let dir = Angle[6];
let mag = Unit[8];
let hei_lo = Unit[10];
let hei_hi = Unit[12];
let orig = pnts::read_o[14; 4];
let hei_nrm = Unit[18];
let min_lt = Fixed[20];
let texture = OptU16[24];
let xfer = u16[26] enum TransferMode;
}
}
2019-04-01 00:39:47 -07:00
2019-07-05 20:21:11 -07:00
Ok((Media{mtype, flags, control, dir, mag, hei_lo, hei_hi, orig, hei_nrm,
min_lt, texture, xfer}, 32))
2019-04-01 00:39:47 -07:00
}
/// A media, as in a part of a polygon which goes up the middle of the wall.
#[cfg_attr(feature = "serde_obj", derive(serde::Serialize))]
2019-06-21 18:34:10 -07:00
#[derive(Clone, Debug, Eq, PartialEq)]
2019-06-25 03:52:21 -07:00
pub struct Media {
2019-07-05 20:21:11 -07:00
pub mtype: MediaType,
pub flags: MediaFlags,
pub control: u16,
pub dir: Angle,
pub mag: Unit,
pub hei_lo: Unit,
pub hei_hi: Unit,
pub orig: pnts::Point,
pub hei_nrm: Unit,
pub min_lt: Fixed,
pub texture: OptU16,
pub xfer: TransferMode,
2019-04-01 00:39:47 -07:00
}
c_enum! {
2019-07-05 20:21:11 -07:00
/// The liquid type of a `Media`.
#[cfg_attr(feature = "serde_obj", derive(serde::Serialize))]
pub enum MediaType: u16 {
Water = 0,
Lava = 1,
Goo = 2,
Sewage = 3,
Jjaro = 4,
}
2019-04-01 00:39:47 -07:00
}
c_bitfield! {
2019-07-05 20:21:11 -07:00
/// Flags for `Media`.
#[cfg_attr(feature = "serde_obj", derive(serde::Serialize))]
pub struct MediaFlags: u8 {
OBSTRUCT = 0,
}
2019-04-01 06:05:06 -07:00
}
2019-04-01 00:39:47 -07:00
// EOF