Struct bevy::prelude::SceneSpawner
pub struct SceneSpawner { /* private fields */ }
Expand description
Handles spawning and despawning scenes in the world, either synchronously or batched through the scene_spawner_system
.
Synchronous methods: (Scene operations will take effect immediately)
spawn_dynamic_sync
spawn_sync
despawn_sync
despawn_instance_sync
update_spawned_scenes
spawn_queued_scenes
despawn_queued_scenes
despawn_queued_instances
Deferred methods: (Scene operations will be processed when the scene_spawner_system
is run)
Implementations§
§impl SceneSpawner
impl SceneSpawner
pub fn spawn_dynamic(
&mut self,
id: impl Into<Handle<DynamicScene>>
) -> InstanceId
pub fn spawn_dynamic( &mut self, id: impl Into<Handle<DynamicScene>> ) -> InstanceId
Schedule the spawn of a new instance of the provided dynamic scene.
pub fn spawn_dynamic_as_child(
&mut self,
id: impl Into<Handle<DynamicScene>>,
parent: Entity
) -> InstanceId
pub fn spawn_dynamic_as_child( &mut self, id: impl Into<Handle<DynamicScene>>, parent: Entity ) -> InstanceId
Schedule the spawn of a new instance of the provided dynamic scene as a child of parent
.
pub fn spawn(&mut self, id: impl Into<Handle<Scene>>) -> InstanceId
pub fn spawn(&mut self, id: impl Into<Handle<Scene>>) -> InstanceId
Schedule the spawn of a new instance of the provided scene.
Examples found in repository?
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
fn scene_load_check(
asset_server: Res<AssetServer>,
mut scenes: ResMut<Assets<Scene>>,
gltf_assets: Res<Assets<Gltf>>,
mut scene_handle: ResMut<SceneHandle>,
mut scene_spawner: ResMut<SceneSpawner>,
) {
match scene_handle.instance_id {
None => {
if asset_server.load_state(&scene_handle.gltf_handle) == LoadState::Loaded {
let gltf = gltf_assets.get(&scene_handle.gltf_handle).unwrap();
if gltf.scenes.len() > 1 {
info!(
"Displaying scene {} out of {}",
scene_handle.scene_index,
gltf.scenes.len()
);
info!("You can select the scene by adding '#Scene' followed by a number to the end of the file path (e.g '#Scene1' to load the second scene).");
}
let gltf_scene_handle =
gltf.scenes
.get(scene_handle.scene_index)
.unwrap_or_else(|| {
panic!(
"glTF file doesn't contain scene {}!",
scene_handle.scene_index
)
});
let scene = scenes.get_mut(gltf_scene_handle).unwrap();
let mut query = scene
.world
.query::<(Option<&DirectionalLight>, Option<&PointLight>)>();
scene_handle.has_light =
query
.iter(&scene.world)
.any(|(maybe_directional_light, maybe_point_light)| {
maybe_directional_light.is_some() || maybe_point_light.is_some()
});
scene_handle.instance_id =
Some(scene_spawner.spawn(gltf_scene_handle.clone_weak()));
info!("Spawning scene...");
}
}
Some(instance_id) if !scene_handle.is_loaded => {
if scene_spawner.instance_is_ready(instance_id) {
info!("...done!");
scene_handle.is_loaded = true;
}
}
Some(_) => {}
}
}
pub fn spawn_as_child(
&mut self,
id: impl Into<Handle<Scene>>,
parent: Entity
) -> InstanceId
pub fn spawn_as_child( &mut self, id: impl Into<Handle<Scene>>, parent: Entity ) -> InstanceId
Schedule the spawn of a new instance of the provided scene as a child of parent
.
pub fn despawn(&mut self, id: impl Into<AssetId<DynamicScene>>)
pub fn despawn(&mut self, id: impl Into<AssetId<DynamicScene>>)
Schedule the despawn of all instances of the provided dynamic scene.
pub fn despawn_instance(&mut self, instance_id: InstanceId)
pub fn despawn_instance(&mut self, instance_id: InstanceId)
Schedule the despawn of a scene instance, removing all its entities from the world.
pub fn despawn_sync(
&mut self,
world: &mut World,
id: impl Into<AssetId<DynamicScene>>
) -> Result<(), SceneSpawnError>
pub fn despawn_sync( &mut self, world: &mut World, id: impl Into<AssetId<DynamicScene>> ) -> Result<(), SceneSpawnError>
Immediately despawns all instances of a dynamic scene.
pub fn despawn_instance_sync(
&mut self,
world: &mut World,
instance_id: &InstanceId
)
pub fn despawn_instance_sync( &mut self, world: &mut World, instance_id: &InstanceId )
Immediately despawns a scene instance, removing all its entities from the world.
pub fn spawn_dynamic_sync(
&mut self,
world: &mut World,
id: impl Into<AssetId<DynamicScene>>
) -> Result<InstanceId, SceneSpawnError>
pub fn spawn_dynamic_sync( &mut self, world: &mut World, id: impl Into<AssetId<DynamicScene>> ) -> Result<InstanceId, SceneSpawnError>
Immediately spawns a new instance of the provided dynamic scene.
pub fn spawn_sync(
&mut self,
world: &mut World,
id: AssetId<Scene>
) -> Result<InstanceId, SceneSpawnError>
pub fn spawn_sync( &mut self, world: &mut World, id: AssetId<Scene> ) -> Result<InstanceId, SceneSpawnError>
Immediately spawns a new instance of the provided scene.
pub fn update_spawned_scenes(
&mut self,
world: &mut World,
scene_ids: &[AssetId<DynamicScene>]
) -> Result<(), SceneSpawnError>
pub fn update_spawned_scenes( &mut self, world: &mut World, scene_ids: &[AssetId<DynamicScene>] ) -> Result<(), SceneSpawnError>
Iterate through all instances of the provided scenes and update those immediately.
Useful for updating already spawned scene instances after their corresponding scene has been modified.
pub fn despawn_queued_scenes(
&mut self,
world: &mut World
) -> Result<(), SceneSpawnError>
pub fn despawn_queued_scenes( &mut self, world: &mut World ) -> Result<(), SceneSpawnError>
Immediately despawns all scenes scheduled for despawn by despawning their instances.
pub fn despawn_queued_instances(&mut self, world: &mut World)
pub fn despawn_queued_instances(&mut self, world: &mut World)
Immediately despawns all scene instances scheduled for despawn.
pub fn spawn_queued_scenes(
&mut self,
world: &mut World
) -> Result<(), SceneSpawnError>
pub fn spawn_queued_scenes( &mut self, world: &mut World ) -> Result<(), SceneSpawnError>
Immediately spawns all scenes scheduled for spawn.
pub fn instance_is_ready(&self, instance_id: InstanceId) -> bool
pub fn instance_is_ready(&self, instance_id: InstanceId) -> bool
Check that an scene instance spawned previously is ready to use
Examples found in repository?
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
fn scene_load_check(
asset_server: Res<AssetServer>,
mut scenes: ResMut<Assets<Scene>>,
gltf_assets: Res<Assets<Gltf>>,
mut scene_handle: ResMut<SceneHandle>,
mut scene_spawner: ResMut<SceneSpawner>,
) {
match scene_handle.instance_id {
None => {
if asset_server.load_state(&scene_handle.gltf_handle) == LoadState::Loaded {
let gltf = gltf_assets.get(&scene_handle.gltf_handle).unwrap();
if gltf.scenes.len() > 1 {
info!(
"Displaying scene {} out of {}",
scene_handle.scene_index,
gltf.scenes.len()
);
info!("You can select the scene by adding '#Scene' followed by a number to the end of the file path (e.g '#Scene1' to load the second scene).");
}
let gltf_scene_handle =
gltf.scenes
.get(scene_handle.scene_index)
.unwrap_or_else(|| {
panic!(
"glTF file doesn't contain scene {}!",
scene_handle.scene_index
)
});
let scene = scenes.get_mut(gltf_scene_handle).unwrap();
let mut query = scene
.world
.query::<(Option<&DirectionalLight>, Option<&PointLight>)>();
scene_handle.has_light =
query
.iter(&scene.world)
.any(|(maybe_directional_light, maybe_point_light)| {
maybe_directional_light.is_some() || maybe_point_light.is_some()
});
scene_handle.instance_id =
Some(scene_spawner.spawn(gltf_scene_handle.clone_weak()));
info!("Spawning scene...");
}
}
Some(instance_id) if !scene_handle.is_loaded => {
if scene_spawner.instance_is_ready(instance_id) {
info!("...done!");
scene_handle.is_loaded = true;
}
}
Some(_) => {}
}
}
pub fn iter_instance_entities(
&self,
instance_id: InstanceId
) -> impl Iterator<Item = Entity>
pub fn iter_instance_entities( &self, instance_id: InstanceId ) -> impl Iterator<Item = Entity>
Get an iterator over the entities in an instance, once it’s spawned.
Before the scene is spawned, the iterator will be empty. Use Self::instance_is_ready
to check if the instance is ready.
Trait Implementations§
§impl Default for SceneSpawner
impl Default for SceneSpawner
§fn default() -> SceneSpawner
fn default() -> SceneSpawner
impl Resource for SceneSpawner
Auto Trait Implementations§
impl Freeze for SceneSpawner
impl !RefUnwindSafe for SceneSpawner
impl Send for SceneSpawner
impl Sync for SceneSpawner
impl Unpin for SceneSpawner
impl !UnwindSafe for SceneSpawner
Blanket Implementations§
§impl<T, U> AsBindGroupShaderType<U> for T
impl<T, U> AsBindGroupShaderType<U> for T
§fn as_bind_group_shader_type(&self, _images: &RenderAssets<GpuImage>) -> U
fn as_bind_group_shader_type(&self, _images: &RenderAssets<GpuImage>) -> U
T
ShaderType
for self
. When used in AsBindGroup
derives, it is safe to assume that all images in self
exist.source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.§impl<T> DowncastSync for T
impl<T> DowncastSync for T
§impl<S> FromSample<S> for S
impl<S> FromSample<S> for S
fn from_sample_(s: S) -> S
§impl<T> FromWorld for Twhere
T: Default,
impl<T> FromWorld for Twhere
T: Default,
§fn from_world(_world: &mut World) -> T
fn from_world(_world: &mut World) -> T
Self
using data from the given World
.§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more§impl<F, T> IntoSample<T> for Fwhere
T: FromSample<F>,
impl<F, T> IntoSample<T> for Fwhere
T: FromSample<F>,
fn into_sample(self) -> T
§impl<T> NoneValue for Twhere
T: Default,
impl<T> NoneValue for Twhere
T: Default,
type NoneType = T
§fn null_value() -> T
fn null_value() -> T
§impl<T> Pointable for T
impl<T> Pointable for T
source§impl<R, P> ReadPrimitive<R> for P
impl<R, P> ReadPrimitive<R> for P
source§fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
ReadEndian::read_from_little_endian()
.