bevy_vrm 0.4.0

Bevy plugin for loading VRM avatars.
Documentation
use bevy::{
    asset::{
        AssetLoader,
        LoadContext,
        io::Reader,
    },
    gltf::{
        Gltf,
        GltfError,
        GltfLoader,
        GltfLoaderSettings,
    },
    prelude::*,
};
use thiserror::Error;

#[derive(Asset, TypePath, Debug)]
pub struct Vrm {
    pub gltf: Gltf,
}

#[derive(TypePath)]
pub struct VrmLoader {
    pub gltf_loader: GltfLoader,
}

#[derive(Debug, Error)]
pub enum VrmError {
    #[error(transparent)]
    Io(#[from] std::io::Error),
    #[error(transparent)]
    Gltf(#[from] GltfError),
}

impl AssetLoader for VrmLoader {
    type Asset = Vrm;
    type Settings = GltfLoaderSettings;
    type Error = VrmError;

    async fn load(
        &self,
        reader: &mut dyn Reader,
        settings: &Self::Settings,
        load_context: &mut LoadContext<'_>,
    ) -> Result<Vrm, VrmError> {
        let mut bytes = Vec::new();
        reader.read_to_end(&mut bytes).await?;

        let gltf = GltfLoader::load_gltf(&self.gltf_loader, &bytes, load_context, settings).await?;

        Ok(Vrm { gltf })
    }

    fn extensions(&self) -> &[&str] {
        &["vrm"]
    }
}