crayon/video/assets/
mesh_loader.rs

1use bincode;
2use std::io::Cursor;
3use std::sync::Arc;
4
5use crate::errors::*;
6use crate::res::utils::prelude::ResourceLoader;
7use crate::utils::double_buf::DoubleBuf;
8
9use super::super::backends::frame::{Command, Frame};
10use super::mesh::*;
11
12pub const MAGIC: [u8; 8] = [b'V', b'M', b'S', b'H', b' ', 0, 0, 1];
13
14#[derive(Clone)]
15pub struct MeshLoader {
16    frames: Arc<DoubleBuf<Frame>>,
17}
18
19impl MeshLoader {
20    pub(crate) fn new(frames: Arc<DoubleBuf<Frame>>) -> Self {
21        MeshLoader { frames }
22    }
23}
24
25impl ResourceLoader for MeshLoader {
26    type Handle = MeshHandle;
27    type Intermediate = (MeshParams, Option<MeshData>);
28    type Resource = MeshParams;
29
30    fn load(&self, handle: Self::Handle, bytes: &[u8]) -> Result<Self::Intermediate> {
31        if bytes[0..8] != MAGIC[..] {
32            bail!("[MeshLoader] MAGIC number not match.");
33        }
34
35        let mut file = Cursor::new(&bytes[8..]);
36        let params: MeshParams = bincode::deserialize_from(&mut file)?;
37        let data = bincode::deserialize_from(&mut file)?;
38
39        info!(
40            "[MeshLoader] load {:?}. (Verts: {}, Indxes: {})",
41            handle, params.num_verts, params.num_idxes
42        );
43
44        Ok((params, Some(data)))
45    }
46
47    fn create(&self, handle: Self::Handle, item: Self::Intermediate) -> Result<Self::Resource> {
48        info!("[MeshLoader] create {:?}.", handle);
49        item.0.validate(item.1.as_ref())?;
50        let cmd = Command::CreateMesh(Box::new((handle, item.0.clone(), item.1)));
51        self.frames.write().cmds.push(cmd);
52        Ok(item.0)
53    }
54
55    fn delete(&self, handle: Self::Handle, _: Self::Resource) {
56        info!("[MeshLoader] delete {:?}.", handle);
57        let cmd = Command::DeleteMesh(handle);
58        self.frames.write().cmds.push(cmd);
59    }
60}