bevy_entitiles 0.2.2

A tilemap library for bevy. With many algorithms built in.
use bevy::{
    prelude::{Commands, Query, Res, ResMut},
    render::{
        render_asset::RenderAssets,
        render_resource::{AddressMode, SamplerDescriptor},
        renderer::{RenderDevice, RenderQueue},
        texture::Image,
    },
    time::Time,
};

use super::{
    extract::{ExtractedTile, ExtractedTilemap},
    texture::TilemapTexturesStorage,
    uniform::TilemapUniformsStorage,
    RenderChunkStorage,
};

pub fn prepare(
    mut commands: Commands,
    render_device: Res<RenderDevice>,
    render_queue: Res<RenderQueue>,
    extracted_tilemaps: Query<&ExtractedTilemap>,
    extracted_tiles: Query<&mut ExtractedTile>,
    mut render_chunks: ResMut<RenderChunkStorage>,
    mut tilemap_uniforms_storage: ResMut<TilemapUniformsStorage>,
    mut textures_storage: ResMut<TilemapTexturesStorage>,
    render_images: Res<RenderAssets<Image>>,
    time: Res<Time>,
) {
    render_chunks.add_tiles_with_query(&extracted_tilemaps, &extracted_tiles);

    tilemap_uniforms_storage.clear();
    for tilemap in extracted_tilemaps.iter() {
        commands
            .entity(tilemap.id)
            .insert(tilemap_uniforms_storage.insert(tilemap));

        render_chunks.prepare_chunks(tilemap, &render_device, &time);

        if let Some(tex) = tilemap.texture.as_ref() {
            if textures_storage.contains(&tex.texture) {
                continue;
            }

            textures_storage.insert(
                tex.clone_weak(),
                render_images.get(tex.handle()).unwrap().clone(),
                render_device.create_sampler(&SamplerDescriptor {
                    label: Some("tilemap_color_texture_sampler"),
                    address_mode_u: AddressMode::ClampToEdge,
                    address_mode_v: AddressMode::ClampToEdge,
                    address_mode_w: AddressMode::ClampToEdge,
                    mag_filter: tex.desc.filter_mode,
                    min_filter: tex.desc.filter_mode,
                    mipmap_filter: tex.desc.filter_mode,
                    lod_min_clamp: 0.,
                    lod_max_clamp: f32::MAX,
                    compare: None,
                    anisotropy_clamp: 1,
                    border_color: None,
                }),
            );
        }
    }
    tilemap_uniforms_storage.write(&render_device, &render_queue);
}