//! Rendering a scene with baked lightmaps. use bevy::pbr::Lightmap; use bevy::prelude::*; fn main() { App::new() .add_plugins(DefaultPlugins) .insert_resource(AmbientLight::NONE) .add_systems(Startup, setup) .add_systems(Update, add_lightmaps_to_meshes) .run(); } fn setup(mut commands: Commands, asset_server: Res) { commands.spawn(SceneBundle { scene: asset_server.load("models/CornellBox/CornellBox.glb#Scene0"), ..default() }); commands.spawn(Camera3dBundle { transform: Transform::from_xyz(-278.0, 273.0, 800.0), ..default() }); } fn add_lightmaps_to_meshes( mut commands: Commands, asset_server: Res, mut materials: ResMut>, meshes: Query< (Entity, &Name, &Handle), (With>, Without), >, ) { let exposure = 250.0; for (entity, name, material) in meshes.iter() { if &**name == "Light" { materials.get_mut(material).unwrap().emissive = Color::Srgba(Srgba::WHITE * exposure); continue; } if &**name == "large_box" { materials.get_mut(material).unwrap().lightmap_exposure = exposure; commands.entity(entity).insert(Lightmap { image: asset_server.load("lightmaps/CornellBox-Large.zstd.ktx2"), ..default() }); continue; } if &**name == "small_box" { materials.get_mut(material).unwrap().lightmap_exposure = exposure; commands.entity(entity).insert(Lightmap { image: asset_server.load("lightmaps/CornellBox-Small.zstd.ktx2"), ..default() }); continue; } if name.starts_with("cornell_box") { materials.get_mut(material).unwrap().lightmap_exposure = exposure; commands.entity(entity).insert(Lightmap { image: asset_server.load("lightmaps/CornellBox-Box.zstd.ktx2"), ..default() }); continue; } } }