bevy-aabb-instancing 0.4.1

Render millions of AABB instances in Bevy.
Documentation
use super::buffer_cache::BufferCache;
use super::draw::{DrawCuboids, ViewMeta};
use super::pipeline::CuboidsPipeline;

use bevy::core_pipeline::core_3d::Opaque3d;
use bevy::prelude::*;
use bevy::render::render_phase::{DrawFunctions, RenderPhase};
use bevy::render::view::VisibleEntities;
use bevy::render::{
    render_resource::{BindGroupDescriptor, BindGroupEntry},
    renderer::RenderDevice,
    view::{ExtractedView, ViewUniforms},
};

pub(crate) fn queue_cuboids_view_bind_group(
    render_device: Res<RenderDevice>,
    cuboids_pipeline: Res<CuboidsPipeline>,
    mut view_meta: ResMut<ViewMeta>,
    view_uniforms: Res<ViewUniforms>,
) {
    if let Some(view_binding) = view_uniforms.uniforms.binding() {
        view_meta.cuboids_view_bind_group =
            Some(render_device.create_bind_group(&BindGroupDescriptor {
                entries: &[BindGroupEntry {
                    binding: 0,
                    resource: view_binding,
                }],
                label: Some("cuboids_view_bind_group"),
                layout: &cuboids_pipeline.view_layout,
            }));
    }
}

pub(crate) fn queue_cuboids(
    cuboids_pipeline: Res<CuboidsPipeline>,
    opaque_3d_draw_functions: Res<DrawFunctions<Opaque3d>>,
    buffer_cache: Res<BufferCache>,
    mut views: Query<(&ExtractedView, &VisibleEntities, &mut RenderPhase<Opaque3d>)>,
) {
    let draw_cuboids = opaque_3d_draw_functions
        .read()
        .get_id::<DrawCuboids>()
        .unwrap();

    for (view, visible_entities, mut opaque_phase) in views.iter_mut() {
        let inverse_view_matrix = view.transform.compute_matrix().inverse();
        let inverse_view_row_2 = inverse_view_matrix.row(2);
        for &entity in &visible_entities.entities {
            if let Some(entry) = buffer_cache.get(entity) {
                if entry.is_enabled() {
                    let entity_center = entry.aabb().center;
                    opaque_phase.add(Opaque3d {
                        pipeline: cuboids_pipeline.pipeline_id,
                        entity,
                        distance: inverse_view_row_2.dot(entity_center.extend(1.0)),
                        draw_function: draw_cuboids,
                    });
                }
            }
        }
    }
}