crayon/video/assets/
mesh_loader.rs1use 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}