1use bytemuck::AnyBitPattern;
2use core::ffi::{c_float, c_int, c_uint};
3use log::error;
4
5const MMAP_MAGIC: u32 = 0x4d4d4150; const MMAP_VERSION: u32 = 15;
9#[derive(Debug, AnyBitPattern, Copy, Clone)]
10#[repr(C)]
11pub struct DtMeshHeader {
12 magic: c_int,
13 version: c_int,
15 pub x: c_int,
17 pub y: c_int,
19 pub layer: c_int,
21 pub user_id: c_uint,
23 pub poly_count: c_int,
25 pub vert_count: c_int,
27 pub max_link_count: c_int,
29 pub detail_mesh_count: c_int,
31 pub detail_vert_count: c_int,
35
36 pub detail_tri_count: c_int,
37 pub bv_node_count: c_int,
39 pub off_mesh_con_count: c_int,
41 pub off_mesh_base: c_int,
43 pub walkable_height: c_float,
45 pub walkable_radius: c_float,
47 pub walkable_climb: c_float,
49 pub bmin: [c_float; 3],
51 pub bmax: [c_float; 3],
53 pub bv_quant_factor: c_float,
57}
58
59#[derive(Debug, AnyBitPattern, Copy, Clone)]
60#[repr(C)]
61pub struct MmapTileHeader {
62 mmap_magic: u32,
63 dt_version: u32,
64 mmap_version: u32,
65 size: u32,
66 uses_liquids: u32,
67}
68
69impl MmapTileHeader {
70 pub fn from_bytes(buffer: &[u8]) -> Result<Self, ()> {
71 let header = *bytemuck::from_bytes::<MmapTileHeader>(&buffer);
72
73 if header.mmap_magic != MMAP_MAGIC {
74 return Err(error!(
75 "Invalid MMAP_MAGIC: {}, current: {}",
76 header.mmap_magic, MMAP_MAGIC
77 ));
78 }
79
80 if header.mmap_version != MMAP_VERSION {
81 return Err(error!(
82 "Invalid MMAP_VERSION: {}, current: {}",
83 header.mmap_version, MMAP_VERSION
84 ));
85 }
86
87 Ok(header)
90 }
91}
92
93impl DtMeshHeader {
94 pub fn from_bytes(buffer: &[u8]) -> Result<Self, ()> {
95 Ok(*bytemuck::from_bytes::<DtMeshHeader>(&buffer))
96 }
97}