feat: migrate quilter rendering to Bevy TilemapChunk
Replaces the CPU pixel-baking quilter system (QuiltCache, TerrainSprite, pixel_buffers) with Bevy's native TilemapChunk GPU-index-lookup API. Architecture: - TilemapChunk entities replace TerrainSprite entities per (chunk, z, layer) - Tileset PNG stacked vertically as texture_2d_array (11 rows: 6 floor + 5 fixture) - populate_chunk_tiles reads TileMap HashMap directly; no ECS FloorTile entities - Chunk spawn deferred to apply_terrain_blobs (after TileMap data exists) - Dirty key system triggers repopulate on occlusion/camera-z changes Bug fixes: - populate_chunk_tiles: add chunk_pos offset to world tile lookups (was always (0,0)) - spawn_tilemap_chunks: offset Transform by -TILE_SIZE/2 (tile-centre vs bottom-left) - spawn_tilemap_chunks: AlphaMode2d::Blend (was Opaque, blocking DF fade) - update_tilemap_chunk_visibility: actually mutate Visibility (was read-only) - handle_tile_occlusion_updates: mark dirty keys inline (was double-reading events) - TilemapChunkSpawner: deduplicate pending queue and guard stale registry Performance: - ~115K FloorTile ECS entities eliminated - GPU memory: O(tile_data) instead of O(CHUNK_TILES² × z_levels × pixel_bytes) - Z-scroll: only TilemapChunkTileData repopulates (no entity re-spawn) - Benchmarks via TilemapBenchmark resource (F9 to report)
This commit is contained in:
+11
-19
@@ -14,18 +14,19 @@ pub mod generation;
|
||||
pub mod textures;
|
||||
pub mod tiles;
|
||||
|
||||
// Re-export commonly used items
|
||||
pub use chunks::management::*;
|
||||
pub use textures::management::*;
|
||||
pub use tiles::{prefabs::*, rendering::*, visibility::*};
|
||||
|
||||
// Plugin
|
||||
pub struct WorldPlugin;
|
||||
|
||||
impl Plugin for WorldPlugin {
|
||||
fn build(&self, app: &mut App) {
|
||||
app.init_resource::<ChunkMap>()
|
||||
.init_resource::<TerrainBlobStorage>()
|
||||
.init_resource::<tiles::TilemapBenchmark>()
|
||||
.init_resource::<tiles::TilemapChunkRegistry>()
|
||||
.init_resource::<tiles::TilemapChunkSpawner>()
|
||||
.add_message::<GenerateChunkEvent>()
|
||||
.add_message::<ChunkTerrainEvent>()
|
||||
.add_message::<ChunkWeatheringAndPrecipitationEvent>()
|
||||
@@ -37,19 +38,15 @@ impl Plugin for WorldPlugin {
|
||||
.add_systems(
|
||||
FixedUpdate,
|
||||
(
|
||||
// === CHUNK LOADING PIPELINE ===
|
||||
handle_chunk_events,
|
||||
update_chunk_connectivity,
|
||||
|
||||
// === CHUNK GENERATION (triggered by events above) ===
|
||||
tiles::despawn_tilemap_chunks,
|
||||
spawn_terrain_tasks,
|
||||
apply_terrain_blobs,
|
||||
generate_chunk_weathering_and_precipitation,
|
||||
generate_chunk_forrestry,
|
||||
generate_chunk_foliage,
|
||||
generate_chunk_fauna,
|
||||
|
||||
// === DYNAMIC UNLOAD (disabled — see dynamic_chunk_unloading_system) ===
|
||||
),
|
||||
)
|
||||
.add_systems(
|
||||
@@ -57,18 +54,13 @@ impl Plugin for WorldPlugin {
|
||||
(
|
||||
compute_visibility_of_game_entities
|
||||
.after(crate::entities::item::item_tile_management_system),
|
||||
(
|
||||
handle_tile_occlusion_updates,
|
||||
build_quilted_terrain_sprites,
|
||||
update_tile_visibility.run_if(
|
||||
|cwss: Res<tiles::CurrentWorldSpriteState>,
|
||||
camera_moved: Res<camera::CameraMoved>| {
|
||||
cwss.state == tiles::TerrainSpriteState::RenderReady
|
||||
|| camera_moved.0
|
||||
},
|
||||
),
|
||||
)
|
||||
.chain(),
|
||||
tiles::track_benchmark,
|
||||
tiles::render_bench_report_system,
|
||||
handle_tile_occlusion_updates,
|
||||
tiles::spawn_tilemap_chunks,
|
||||
tiles::on_camera_z_changed,
|
||||
tiles::update_tilemap_chunk_visibility,
|
||||
tiles::populate_tilemap_chunk_data,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user