oxygengine_core/assets/protocols/
prefab.rs1use 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}