type xmodel [display="XModel"] { i32 name_ptr [ui, readonly, display="Name Ptr"]; u8 num_bones [ui, readonly, display="Num Bones"]; u8 num_root_bones [ui, readonly, display="Num Root Bones"]; u8 num_surfaces [ui, readonly, display="Num Surfaces"]; i8 lod_ramp_type [ui, readonly, display="LOD Ramp Type"]; // Model surfaces pointers (4 LODs) i32 model_surfs_ptr_0 [ui, readonly, display="Model Surfs Ptr LOD0"]; i32 model_surfs_ptr_1 [ui, readonly, display="Model Surfs Ptr LOD1"]; i32 model_surfs_ptr_2 [ui, readonly, display="Model Surfs Ptr LOD2"]; i32 model_surfs_ptr_3 [ui, readonly, display="Model Surfs Ptr LOD3"]; // LOD info (4 floats = 16 bytes) lod_info = read(16) [ui, readonly, display="LOD Info"]; i32 coll_surfs_ptr [ui, readonly, display="Coll Surfs Ptr"]; i32 num_coll_surfs [ui, readonly, display="Num Coll Surfs"]; i32 contents [ui, readonly, display="Contents"]; i32 bone_info_ptr [ui, readonly, display="Bone Info Ptr"]; // Bounds (6 floats = 24 bytes for mins + maxs) bounds = read(24) [ui, readonly, display="Bounds"]; // Radius (float) radius = read(4) [ui, readonly, display="Radius"]; i32 phys_preset_ptr [ui, readonly, display="Phys Preset Ptr"]; i32 phys_collmap_ptr [ui, readonly, display="Phys Collmap Ptr"]; u16 flags [ui, readonly, display="Flags"]; skip(2); // padding // Parse inline name if (name_ptr == -1) { name = cstring() [ui, readonly, display="Name"]; _name = name; } // Note: Full XModel inline parsing would require: // - XModelSurfs for each LOD // - XBoneInfo array // - Collision surfaces // - Physics preset // - Physics collision map // These are complex nested structures }