oxygengine_core/assets/protocols/
prefab.rs

1use crate::{
2    assets::{
3        asset::Asset,
4        protocol::{AssetLoadResult, AssetProtocol, AssetVariant, Meta},
5    },
6    prefab::{Prefab, PrefabScene},
7};
8use std::{any::Any, str::from_utf8};
9
10pub struct PrefabAsset(PrefabScene);
11
12impl PrefabAsset {
13    pub fn get(&self) -> &PrefabScene {
14        &self.0
15    }
16}
17
18pub struct PrefabAssetProtocol;
19
20impl AssetProtocol for PrefabAssetProtocol {
21    fn name(&self) -> &str {
22        "prefab"
23    }
24
25    fn on_load(&mut self, data: Vec<u8>) -> AssetLoadResult {
26        match PrefabScene::from_prefab_str(from_utf8(&data).unwrap()) {
27            Ok(data) => {
28                if data.dependencies.is_empty() {
29                    AssetLoadResult::Data(Box::new(PrefabAsset(data)))
30                } else {
31                    let list = data
32                        .dependencies
33                        .iter()
34                        .enumerate()
35                        .map(|(i, path)| (i.to_string(), path.to_owned()))
36                        .collect::<Vec<_>>();
37                    AssetLoadResult::Yield(Some(Box::new(data)), list)
38                }
39            }
40            Err(error) => {
41                AssetLoadResult::Error(format!("Error loading prefab asset: {:?}", error))
42            }
43        }
44    }
45
46    fn on_resume(&mut self, payload: Meta, _: &[(&str, &Asset)]) -> AssetLoadResult {
47        let prefab = *(payload.unwrap() as Box<dyn Any + Send>)
48            .downcast::<PrefabScene>()
49            .unwrap();
50        AssetLoadResult::Data(Box::new(PrefabAsset(prefab)))
51    }
52
53    fn on_unload(&mut self, asset: &Asset) -> Option<Vec<AssetVariant>> {
54        asset.get::<PrefabAsset>().map(|asset| {
55            asset
56                .get()
57                .dependencies
58                .iter()
59                .map(|path| AssetVariant::Path(path.to_owned()))
60                .collect()
61        })
62    }
63}