scena 1.7.2

A Rust-native scene-graph renderer with typed scene state, glTF assets, and explicit prepare/render lifecycles.
Documentation
use crate::diagnostics::AssetError;
use crate::material::TextureColorSpace;

use super::super::{AssetMaterialFallback, AssetPath, AssetStorage, TextureHandle};
use super::textures::{GltfTexture, texture_slot};

pub(super) struct TextureSlotFallbackRequest<'a> {
    pub(super) path: &'a AssetPath,
    pub(super) slot: &'static str,
    pub(super) material_index: usize,
    pub(super) texture_index: usize,
    pub(super) color_space: TextureColorSpace,
}

pub(super) struct MaterialFallbackSinks<'a> {
    pub(super) all: &'a mut Vec<AssetMaterialFallback>,
    pub(super) source: &'a mut Vec<AssetMaterialFallback>,
}

impl<'a> TextureSlotFallbackRequest<'a> {
    pub(super) fn new(
        path: &'a AssetPath,
        slot: &'static str,
        material_index: usize,
        texture_index: usize,
        color_space: TextureColorSpace,
    ) -> Self {
        Self {
            path,
            slot,
            material_index,
            texture_index,
            color_space,
        }
    }
}

pub(super) fn texture_slot_with_fallback(
    request: TextureSlotFallbackRequest<'_>,
    textures: &[GltfTexture],
    storage: &mut AssetStorage,
    sinks: &mut MaterialFallbackSinks<'_>,
) -> Result<TextureHandle, AssetError> {
    let texture = texture_slot(
        request.path,
        request.slot,
        request.texture_index,
        textures,
        storage,
        request.color_space,
    )?;
    if let Some(fallback) = textures
        .get(request.texture_index)
        .and_then(GltfTexture::basisu_fallback)
    {
        let fallback = AssetMaterialFallback::texture_basisu_fallback(
            request.material_index,
            request.slot,
            request.texture_index,
            fallback.source_path.clone(),
            fallback.fallback_path.clone(),
        );
        sinks.all.push(fallback.clone());
        sinks.source.push(fallback);
    }
    if let Some(source) = textures
        .get(request.texture_index)
        .filter(|texture| texture.source_bytes_missing())
    {
        let fallback = AssetMaterialFallback::missing_texture_fallback(
            request.material_index,
            request.slot,
            request.texture_index,
            source.path().clone(),
            AssetPath::from("scena.material.fallback_texture"),
        );
        sinks.all.push(fallback.clone());
        sinks.source.push(fallback);
    }
    Ok(texture)
}