bevylder 0.1.0

Voxels brought to bevy
Documentation
use bevy::{
    core_pipeline::Transparent3d,
    pbr::{MeshPipelineKey, MeshUniform},
    prelude::*,
    render::{
        render_asset::RenderAssets,
        render_phase::{DrawFunctions, RenderPhase},
        render_resource::{PipelineCache, SpecializedMeshPipelines},
        view::ExtractedView,
    },
};

use super::{draw, pipeline, voxel, voxel_mesh};

#[allow(clippy::too_many_arguments)]
pub(crate) fn queue_voxel(
    transparent_3d_draw_functions: Res<DrawFunctions<Transparent3d>>,
    voxel_pipeline: Res<pipeline::VoxelPipeline>,
    msaa: Res<Msaa>,
    mut pipelines: ResMut<SpecializedMeshPipelines<pipeline::VoxelPipeline>>,
    mut pipeline_cache: ResMut<PipelineCache>,
    meshes: Res<RenderAssets<Mesh>>,
    voxel_mesh: Res<voxel_mesh::VoxelMesh>,
    material_meshes: Query<(Entity, &MeshUniform), With<voxel::Voxel>>,
    mut views: Query<(&ExtractedView, &mut RenderPhase<Transparent3d>)>,
) {
    let draw_custom = transparent_3d_draw_functions
        .read()
        .get_id::<draw::DrawVoxels>()
        .unwrap();

    let msaa_key = MeshPipelineKey::from_msaa_samples(msaa.samples);

    for (view, mut transparent_phase) in views.iter_mut() {
        let view_matrix = view.transform.compute_matrix();
        let view_row_2 = view_matrix.row(2);
        if let Some(mesh) = meshes.get(&voxel_mesh.mesh) {
            for (entity, mesh_uniform) in material_meshes.iter() {
                let key =
                    msaa_key | MeshPipelineKey::from_primitive_topology(mesh.primitive_topology);
                let pipeline = pipelines
                    .specialize(&mut pipeline_cache, &voxel_pipeline, key, &mesh.layout)
                    .unwrap();
                transparent_phase.add(Transparent3d {
                    entity,
                    pipeline,
                    draw_function: draw_custom,
                    distance: view_row_2.dot(mesh_uniform.transform.col(3)),
                });
            }
        }
    }
}