61 lines
1.4 KiB
Rust
61 lines
1.4 KiB
Rust
|
//! `Object` type.
|
||
|
|
||
|
use crate::{err::*, fixed::{Angle, Unit}};
|
||
|
use bitflags::bitflags;
|
||
|
|
||
|
/// Reads an `OBJS` chunk.
|
||
|
pub fn read(b: &[u8]) -> ResultS<(Object, usize)>
|
||
|
{
|
||
|
read_data! {
|
||
|
endian: BIG, buf: b, size: 16, start: 0, data {
|
||
|
let group = u16[0];
|
||
|
let index = u16[2];
|
||
|
let angle = Angle[4];
|
||
|
let poly = u16[6];
|
||
|
let pos_x = Unit[8];
|
||
|
let pos_y = Unit[10];
|
||
|
let pos_z = Unit[12];
|
||
|
let flags = u16[14];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
let bias = flags & 0xF0_00;
|
||
|
let flags = flags & 0x0F_FF;
|
||
|
let bias = bias >> 12;
|
||
|
let flags = flag_ok!(ObjectFlags, flags)?;
|
||
|
|
||
|
Ok((Object{group, index, angle, poly, pos_x, pos_y, pos_z, flags, bias}, 16))
|
||
|
}
|
||
|
|
||
|
/// An object in the world.
|
||
|
#[cfg_attr(feature = "serde_obj", derive(serde::Serialize))]
|
||
|
#[derive(Clone, Debug, Eq, PartialEq)]
|
||
|
pub struct Object
|
||
|
{
|
||
|
pub group: u16,
|
||
|
pub index: u16,
|
||
|
pub angle: Angle,
|
||
|
pub poly: u16,
|
||
|
pub pos_x: Unit,
|
||
|
pub pos_y: Unit,
|
||
|
pub pos_z: Unit,
|
||
|
pub flags: ObjectFlags,
|
||
|
pub bias: u16,
|
||
|
}
|
||
|
|
||
|
bitflags! {
|
||
|
/// Flags for `Object`.
|
||
|
#[cfg_attr(feature = "serde_obj", derive(serde::Serialize))]
|
||
|
pub struct ObjectFlags: u16
|
||
|
{
|
||
|
const INVISIBLE = 1;
|
||
|
const CEILING = 1 << 1;
|
||
|
const BLIND = 1 << 2;
|
||
|
const DEAF = 1 << 3;
|
||
|
const FLOATING = 1 << 4;
|
||
|
const NET_ONLY = 1 << 5;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// EOF
|