use bytemuck::AnyBitPattern;
use core::ffi::{c_float, c_int, c_uint};
use log::error;
const MMAP_MAGIC: u32 = 0x4d4d4150; const MMAP_VERSION: u32 = 15;
#[derive(Debug, AnyBitPattern, Copy, Clone)]
#[repr(C)]
pub struct DtMeshHeader {
magic: c_int,
version: c_int,
pub x: c_int,
pub y: c_int,
pub layer: c_int,
pub user_id: c_uint,
pub poly_count: c_int,
pub vert_count: c_int,
pub max_link_count: c_int,
pub detail_mesh_count: c_int,
pub detail_vert_count: c_int,
pub detail_tri_count: c_int,
pub bv_node_count: c_int,
pub off_mesh_con_count: c_int,
pub off_mesh_base: c_int,
pub walkable_height: c_float,
pub walkable_radius: c_float,
pub walkable_climb: c_float,
pub bmin: [c_float; 3],
pub bmax: [c_float; 3],
pub bv_quant_factor: c_float,
}
#[derive(Debug, AnyBitPattern, Copy, Clone)]
#[repr(C)]
pub struct MmapTileHeader {
mmap_magic: u32,
dt_version: u32,
mmap_version: u32,
size: u32,
uses_liquids: u32,
}
impl MmapTileHeader {
pub fn from_bytes(buffer: &[u8]) -> Result<Self, ()> {
let header = *bytemuck::from_bytes::<MmapTileHeader>(&buffer);
if header.mmap_magic != MMAP_MAGIC {
return Err(error!(
"Invalid MMAP_MAGIC: {}, current: {}",
header.mmap_magic, MMAP_MAGIC
));
}
if header.mmap_version != MMAP_VERSION {
return Err(error!(
"Invalid MMAP_VERSION: {}, current: {}",
header.mmap_version, MMAP_VERSION
));
}
Ok(header)
}
}
impl DtMeshHeader {
pub fn from_bytes(buffer: &[u8]) -> Result<Self, ()> {
Ok(*bytemuck::from_bytes::<DtMeshHeader>(&buffer))
}
}