scena 1.7.2

A Rust-native scene-graph renderer with typed scene state, glTF assets, and explicit prepare/render lifecycles.
Documentation
use serde::{Deserialize, Serialize};

use super::{AssetMaterialFallback, AssetPath};

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct AssetMaterialSource {
    kind: AssetMaterialSourceKind,
    asset_path: Option<AssetPath>,
    material_index: Option<usize>,
    reason: Option<String>,
    fallbacks: Vec<AssetMaterialFallback>,
}

#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum AssetMaterialSourceKind {
    UserCreated,
    SourceMaterial,
    GeneratedDefault,
}

impl AssetMaterialSource {
    pub fn user_created() -> Self {
        Self {
            kind: AssetMaterialSourceKind::UserCreated,
            asset_path: None,
            material_index: None,
            reason: Some("material was created by the host application".to_string()),
            fallbacks: Vec::new(),
        }
    }

    pub fn source_material(
        asset_path: AssetPath,
        material_index: usize,
        fallbacks: Vec<AssetMaterialFallback>,
    ) -> Self {
        Self {
            kind: AssetMaterialSourceKind::SourceMaterial,
            asset_path: Some(asset_path),
            material_index: Some(material_index),
            reason: None,
            fallbacks,
        }
    }

    pub fn generated_default(asset_path: AssetPath, reason: impl Into<String>) -> Self {
        Self {
            kind: AssetMaterialSourceKind::GeneratedDefault,
            asset_path: Some(asset_path),
            material_index: None,
            reason: Some(reason.into()),
            fallbacks: Vec::new(),
        }
    }

    pub const fn kind(&self) -> AssetMaterialSourceKind {
        self.kind
    }

    pub fn asset_path(&self) -> Option<&AssetPath> {
        self.asset_path.as_ref()
    }

    pub const fn material_index(&self) -> Option<usize> {
        self.material_index
    }

    pub fn reason(&self) -> Option<&str> {
        self.reason.as_deref()
    }

    pub fn fallbacks(&self) -> &[AssetMaterialFallback] {
        &self.fallbacks
    }
}