re_viewer 0.3.0-alpha.1

The Rerun viewer
Documentation
use std::sync::Arc;

use re_log_types::{MeshFormat, MeshId};
use re_renderer::RenderContext;

use crate::{mesh_loader::LoadedMesh, ui::view_spatial::MeshSourceData};

// ----------------------------------------------------------------------------

#[derive(Default)]
pub struct MeshCache(nohash_hasher::IntMap<MeshId, Option<Arc<LoadedMesh>>>);

impl MeshCache {
    pub fn load(
        &mut self,
        name: &str,
        mesh_data: &MeshSourceData,
        render_ctx: &mut RenderContext,
    ) -> Option<Arc<LoadedMesh>> {
        crate::profile_function!();

        let mesh_id = mesh_data.mesh_id();

        self.0
            .entry(mesh_id)
            .or_insert_with(|| {
                re_log::debug!("Loading CPU mesh {name:?}…");

                let result = match mesh_data {
                    MeshSourceData::Mesh3D(mesh3d) => {
                        LoadedMesh::load(name.to_owned(), mesh3d, render_ctx)
                    }
                    MeshSourceData::StaticGlb(_mesh_id, glb_bytes) => LoadedMesh::load_raw(
                        name.to_owned(),
                        MeshFormat::Glb,
                        glb_bytes,
                        render_ctx,
                    ),
                };

                match result {
                    Ok(cpu_mesh) => Some(Arc::new(cpu_mesh)),
                    Err(err) => {
                        re_log::warn!("Failed to load mesh {name:?}: {}", re_error::format(&err));
                        None
                    }
                }
            })
            .clone()
    }
}