//! Update a scene from a glTF file, either by spawning the scene as a child of another entity, //! or by accessing the entities of the scene. use bevy::{prelude::*, scene::InstanceId}; fn main() { App::new() .add_plugins(DefaultPlugins) .init_resource::() .add_startup_system(setup) .add_system(scene_update) .add_system(move_scene_entities) .run(); } // Resource to hold the scene `instance_id` until it is loaded #[derive(Default)] struct SceneInstance(Option); // Component that will be used to tag entities in the scene #[derive(Component)] struct EntityInMyScene; fn setup( mut commands: Commands, asset_server: Res, mut scene_spawner: ResMut, mut scene_instance: ResMut, ) { commands.spawn_bundle(PointLightBundle { transform: Transform::from_xyz(4.0, 5.0, 4.0), ..default() }); commands.spawn_bundle(Camera3dBundle { transform: Transform::from_xyz(1.05, 0.9, 1.5) .looking_at(Vec3::new(0.0, 0.3, 0.0), Vec3::Y), ..default() }); // Spawn the scene as a child of another entity. This first scene will be translated backward // with its parent commands .spawn_bundle(TransformBundle::from(Transform::from_xyz(0.0, 0.0, -1.0))) .with_children(|parent| { parent.spawn_scene(asset_server.load("models/FlightHelmet/FlightHelmet.gltf#Scene0")); }); // Spawn a second scene, and keep its `instance_id` let instance_id = scene_spawner.spawn(asset_server.load("models/FlightHelmet/FlightHelmet.gltf#Scene0")); scene_instance.0 = Some(instance_id); } // This system will wait for the scene to be ready, and then tag entities from // the scene with `EntityInMyScene`. All entities from the second scene will be // tagged fn scene_update( mut commands: Commands, scene_spawner: Res, scene_instance: Res, mut done: Local, ) { if !*done { if let Some(instance_id) = scene_instance.0 { if let Some(entity_iter) = scene_spawner.iter_instance_entities(instance_id) { entity_iter.for_each(|entity| { commands.entity(entity).insert(EntityInMyScene); }); *done = true; } } } } // This system will move all entities with component `EntityInMyScene`, so all // entities from the second scene fn move_scene_entities( time: Res