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 37 38 39 40 41 42 43 44 45 46
use crate::resource::{NavMesh, NavResult, NavTriangle, NavVec3}; use bincode::deserialize; use core::{ assets::protocol::{AssetLoadResult, AssetProtocol}, Ignite, }; use serde::{Deserialize, Serialize}; #[derive(Ignite, Debug, Default, Clone, Serialize, Deserialize)] pub struct NavMeshAsset { #[serde(default)] vertices: Vec<NavVec3>, #[serde(default)] triangles: Vec<NavTriangle>, } impl NavMeshAsset { pub fn vertices(&self) -> &[NavVec3] { &self.vertices } pub fn triangles(&self) -> &[NavTriangle] { &self.triangles } pub fn build_nav_mesh(&self) -> NavResult<NavMesh> { NavMesh::new(self.vertices.clone(), self.triangles.clone()) } } pub struct NavMeshAssetProtocol; impl AssetProtocol for NavMeshAssetProtocol { fn name(&self) -> &str { "navmesh" } fn on_load(&mut self, data: Vec<u8>) -> AssetLoadResult { match deserialize::<NavMeshAsset>(&data) { Ok(asset) => AssetLoadResult::Data(Box::new(asset)), Err(error) => { AssetLoadResult::Error(format!("Error loading navmesh asset: {:?}", error)) } } } }