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
use crate::resource::{NavMesh, NavResult, NavTriangle, NavVec3}; use bincode::deserialize; use core::assets::protocol::{AssetLoadResult, AssetProtocol}; use serde::{Deserialize, Serialize}; #[derive(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 into_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 { if let Ok(asset) = deserialize::<NavMeshAsset>(&data) { AssetLoadResult::Data(Box::new(asset)) } else { AssetLoadResult::None } } }