rend3 0.3.0

Easy to use, customizable, efficient 3D renderer library built on wgpu.
Documentation
use crate::{
    graph::GraphTextureStore,
    instruction::InstructionStreamPair,
    managers::{
        CameraManager, DirectionalLightManager, MaterialManager, MeshManager, ObjectManager, SkeletonManager,
        TextureManager,
    },
    renderer::RendererDataCore,
    util::mipmap::MipmapGenerator,
    InstanceAdapterDevice, Renderer, RendererInitializationError,
};
use parking_lot::Mutex;
use rend3_types::{Camera, Handedness, TextureFormat};
use std::sync::{atomic::AtomicUsize, Arc};
use wgpu::TextureViewDimension;

pub fn create_renderer(
    iad: InstanceAdapterDevice,
    handedness: Handedness,
    aspect_ratio: Option<f32>,
) -> Result<Arc<Renderer>, RendererInitializationError> {
    profiling::scope!("Renderer::new");

    let features = iad.device.features();
    let limits = iad.device.limits();
    let downlevel = iad.adapter.get_downlevel_properties();

    let camera_manager = CameraManager::new(Camera::default(), handedness, aspect_ratio);

    let d2_texture_manager = TextureManager::new(
        &iad.device,
        iad.profile,
        limits.max_sampled_textures_per_shader_stage,
        TextureViewDimension::D2,
    );
    let d2c_texture_manager = TextureManager::new(
        &iad.device,
        iad.profile,
        limits.max_sampled_textures_per_shader_stage,
        TextureViewDimension::Cube,
    );
    let mesh_manager = MeshManager::new(&iad.device);
    let material_manager = MaterialManager::new(&iad.device, iad.profile);
    let object_manager = ObjectManager::new();
    let directional_light_manager = DirectionalLightManager::new(&iad.device);
    let skeleton_manager = SkeletonManager::new();

    let mipmap_generator = MipmapGenerator::new(
        &iad.device,
        &[
            TextureFormat::Rgba8Unorm,
            TextureFormat::Rgba8UnormSrgb,
            TextureFormat::Bgra8Unorm,
            TextureFormat::Bgra8UnormSrgb,
            TextureFormat::Rgba16Float,
        ],
    );
    let mut profiler = wgpu_profiler::GpuProfiler::new(4, iad.queue.get_timestamp_period());
    profiler.enable_timer = features.contains(wgpu_profiler::GpuProfiler::REQUIRED_WGPU_FEATURES);

    Ok(Arc::new(Renderer {
        instructions: InstructionStreamPair::new(),

        profile: iad.profile,
        adapter_info: iad.info,
        queue: iad.queue,
        device: iad.device,

        features,
        limits,
        downlevel,
        handedness,

        current_ident: AtomicUsize::new(0),
        data_core: Mutex::new(RendererDataCore {
            camera_manager,
            mesh_manager,
            d2_texture_manager,
            d2c_texture_manager,
            material_manager,
            object_manager,
            directional_light_manager,
            skeleton_manager,
            profiler,
            graph_texture_store: GraphTextureStore::new(),
        }),

        mipmap_generator,
    }))
}