bevy/examples/2d
Conner Petzold 3f187cf752
Add TilemapChunk rendering (#18866)
# Objective

An attempt to start building a base for first-party tilemaps (#13782).

The objective is to create a very simple tilemap chunk rendering plugin
that can be used as a building block for 3rd-party tilemap crates, and
eventually a first-party tilemap implementation.

## Solution

- Introduces two user-facing components, `TilemapChunk` and
`TilemapChunkIndices`, and a new material `TilemapChunkMaterial`.
- `TilemapChunk` holds the chunk and tile sizes, and the tileset image
- The tileset image is expected to be a layered image for use with
`texture_2d_array`, with the assumption that atlases or multiple images
would go through an asset loader/processor. Not sure if that should be
part of this PR or not..
- `TilemapChunkIndices` holds a 1d representation of all of the tile's
Option<u32> index into the tileset image.
- Indices are fixed to the size of tiles in a chunk (though maybe this
should just be an assertion instead?)
  - Indices are cloned and sent to the shader through a u32 texture.

## Testing

- Initial testing done with the `tilemap_chunk` example, though I need
to include some way to update indices as part of it.
- Tested wasm with webgl2 and webgpu
- I'm thinking it would probably be good to do some basic perf testing.

---

## Showcase

```rust
let chunk_size = UVec2::splat(64);
let tile_size = UVec2::splat(16);
let indices: Vec<Option<u32>> = (0..chunk_size.x * chunk_size.y)
    .map(|_| rng.gen_range(0..5))
    .map(|i| if i == 0 { None } else { Some(i - 1) })
    .collect();

commands.spawn((
    TilemapChunk {
        chunk_size,
        tile_size,
        tileset,
    },
    TilemapChunkIndices(indices),
));
```

![Screenshot 2025-04-17 at 11 54
56 PM](https://github.com/user-attachments/assets/850a53c1-16fc-405d-aad2-8ef5a0060fea)
2025-06-23 23:55:10 +00:00
..
2d_shapes.rs Explanation for the '2d shapes' example (#19211) 2025-05-26 19:21:01 +00:00
2d_viewport_to_world.rs Adopt consistent FooSystems naming convention for system sets (#18900) 2025-05-06 15:18:03 +00:00
bloom_2d.rs Split Camera.hdr out into a new component (#18873) 2025-05-26 19:24:45 +00:00
cpu_draw.rs Upgrade to Rust Edition 2024 (#17967) 2025-02-24 03:54:47 +00:00
custom_gltf_vertex_attribute.rs Revert "Replace Ambient Lights with Environment Map Lights (#17482)" (#18167) 2025-03-05 23:08:46 +00:00
mesh2d_alpha_mode.rs Add uv_transform to ColorMaterial (#17879) 2025-02-24 21:17:26 +00:00
mesh2d_arcs.rs Updated the 2D examples to make them uniform (#17237) 2025-01-23 16:46:58 +00:00
mesh2d_manual.rs Adopt consistent FooSystems naming convention for system sets (#18900) 2025-05-06 15:18:03 +00:00
mesh2d_repeated_texture.rs Add uv_transform to ColorMaterial (#17879) 2025-02-24 21:17:26 +00:00
mesh2d_vertex_color_texture.rs Updated the 2D examples to make them uniform (#17237) 2025-01-23 16:46:58 +00:00
mesh2d.rs Updated the 2D examples to make them uniform (#17237) 2025-01-23 16:46:58 +00:00
move_sprite.rs Updated the 2D examples to make them uniform (#17237) 2025-01-23 16:46:58 +00:00
pixel_grid_snap.rs Updated the 2D examples to make them uniform (#17237) 2025-01-23 16:46:58 +00:00
rotation.rs Updated the 2D examples to make them uniform (#17237) 2025-01-23 16:46:58 +00:00
sprite_animation.rs Updated the 2D examples to make them uniform (#17237) 2025-01-23 16:46:58 +00:00
sprite_flipping.rs Updated the 2D examples to make them uniform (#17237) 2025-01-23 16:46:58 +00:00
sprite_scale.rs Rename JustifyText to Justify (#19522) 2025-06-09 19:59:48 +00:00
sprite_sheet.rs Updated the 2D examples to make them uniform (#17237) 2025-01-23 16:46:58 +00:00
sprite_slice.rs Rename JustifyText to Justify (#19522) 2025-06-09 19:59:48 +00:00
sprite_tile.rs Updated the 2D examples to make them uniform (#17237) 2025-01-23 16:46:58 +00:00
sprite.rs Updated the 2D examples to make them uniform (#17237) 2025-01-23 16:46:58 +00:00
text2d.rs Rename JustifyText to Justify (#19522) 2025-06-09 19:59:48 +00:00
texture_atlas.rs Rename JustifyText to Justify (#19522) 2025-06-09 19:59:48 +00:00
tilemap_chunk.rs Add TilemapChunk rendering (#18866) 2025-06-23 23:55:10 +00:00
transparency_2d.rs Updated the 2D examples to make them uniform (#17237) 2025-01-23 16:46:58 +00:00
wireframe_2d.rs Add binned 2d/3d Wireframe render phase (#18587) 2025-04-09 21:34:53 +00:00