1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
pub mod size;
pub mod voxel;

use {Size, Voxel};
use model::size::parse_size;
use model::voxel::parse_voxels;
use nom::le_u32;

/// A renderable voxel Model
#[derive(Debug, PartialEq)]
pub struct Model {
    /// The size of the model in voxels
    pub size: Size,
    /// The voxels to be displayed.
    pub voxels: Vec<Voxel>,
}

named!(parse_model <&[u8], Model>, do_parse!(
  size: parse_size     >>
  voxels: parse_voxels >>
  (Model { size: size, voxels: voxels })
));

named!(parse_models <&[u8], Vec<Model> >, do_parse!(
  take!(12)             >>
  model_count: le_u32 >>
  models: many_m_n!(model_count as usize, model_count as usize, parse_model) >>
  (models)
));

named!(pub extract_models <&[u8], Vec<Model> >, switch!(peek!(take!(4)),
    b"PACK" => call!(parse_models) |
    b"SIZE" => map!(parse_model, |m| vec!(m))
));

//TODO add model tests here