pub struct World { /* private fields */ }
Expand description
Implementations§
Source§impl World
impl World
Sourcepub fn new(options: WorldOptions) -> Self
pub fn new(options: WorldOptions) -> Self
Creates a new world with the given options,
Sourcepub fn contains(&self, entity: Entity) -> bool
pub fn contains(&self, entity: Entity) -> bool
Returns true
if the world contains an entity with the given ID.
Sourcepub fn push_with_id<T>(&mut self, entity_id: Entity, components: T)where
Option<T>: IntoComponentSource,
pub fn push_with_id<T>(&mut self, entity_id: Entity, components: T)where
Option<T>: IntoComponentSource,
Appends a named entity to the word, replacing any existing entity with the given ID.
Sourcepub fn push<T>(&mut self, components: T) -> Entitywhere
Option<T>: IntoComponentSource,
pub fn push<T>(&mut self, components: T) -> Entitywhere
Option<T>: IntoComponentSource,
Appends a new entity to the world. Returns the ID of the new entity.
components
should be a tuple of components to attach to the entity.
§Examples
Pushing an entity with three components:
let mut world = World::default();
let _entity = world.push((1usize, false, 5.3f32));
Pushing an entity with one component (note the tuple syntax):
let mut world = World::default();
let _entity = world.push((1usize,));
Sourcepub fn extend(&mut self, components: impl IntoComponentSource) -> &[Entity]
pub fn extend(&mut self, components: impl IntoComponentSource) -> &[Entity]
Appends a collection of entities to the world. Returns the IDs of the new entities.
§Examples
Inserting a vector of component tuples:
let mut world = World::default();
let _entities = world.extend(vec![
(1usize, false, 5.3f32),
(2usize, true, 5.3f32),
(3usize, false, 5.3f32),
]);
Inserting a tuple of component vectors:
let mut world = World::default();
let _entities = world.extend(
(
vec![1usize, 2usize, 3usize],
vec![false, true, false],
vec![5.3f32, 5.3f32, 5.2f32],
)
.into_soa(),
);
SoA inserts require all vectors to have the same length. These inserts are faster than inserting via an iterator of tuples.
Sourcepub fn remove(&mut self, entity: Entity) -> bool
pub fn remove(&mut self, entity: Entity) -> bool
Removes the specified entity from the world. Returns true
if an entity was removed.
Sourcepub fn pack(&mut self, options: PackOptions)
pub fn pack(&mut self, options: PackOptions)
Sourcepub fn components(&self) -> &Components
pub fn components(&self) -> &Components
Returns the raw component storage.
Sourcepub fn split<T: IntoView>(&mut self) -> (SubWorld<'_>, SubWorld<'_>)
pub fn split<T: IntoView>(&mut self) -> (SubWorld<'_>, SubWorld<'_>)
Splits the world into two. The left world allows access only to the data declared by the view; the right world allows access to all else.
§Examples
let (left, right) = world.split::<&mut Position>();
With the above, ‘left’ contains a sub-world with access only to &Position
and &mut Position
,
and right
contains a sub-world with access to everything but &Position
and &mut Position
.
let (left, right) = world.split::<&Position>();
In this second example, left
is provided access only to &Position
. right
is granted permission
to everything but &mut Position
.
Sourcepub fn split_for_query<'q, V: IntoView, F: EntityFilter>(
&mut self,
_: &'q Query<V, F>,
) -> (SubWorld<'_>, SubWorld<'_>)
pub fn split_for_query<'q, V: IntoView, F: EntityFilter>( &mut self, _: &'q Query<V, F>, ) -> (SubWorld<'_>, SubWorld<'_>)
Splits the world into two. The left world allows access only to the data declared by the query’s view; the right world allows access to all else.
Sourcepub fn move_from<F: LayoutFilter>(&mut self, source: &mut World, filter: &F)
pub fn move_from<F: LayoutFilter>(&mut self, source: &mut World, filter: &F)
Merges the given world into this world by moving all entities out of the source world.
Sourcepub fn clone_from<F: LayoutFilter, M: Merger>(
&mut self,
source: &World,
filter: &F,
merger: &mut M,
) -> HashMap<Entity, Entity, EntityHasher>
pub fn clone_from<F: LayoutFilter, M: Merger>( &mut self, source: &World, filter: &F, merger: &mut M, ) -> HashMap<Entity, Entity, EntityHasher>
Clones the entities from a world into this world.
A LayoutFilter
selects which entities to merge.
A Merger
describes how to perform the merge operation.
If any entity IDs are remapped by the policy, their mappings will be returned in the result.
More advanced operations such as component type transformations can be performed with the
Duplicate
merger.
§Examples
Cloning all entities from the source world, converting all i32
components to f64
components.
let mut world_a = World::default();
let mut world_b = World::default();
// any component types not registered with Duplicate will be ignored during the merge
let mut merger = Duplicate::default();
merger.register_copy::<isize>(); // copy is faster than clone
merger.register_clone::<String>();
merger.register_convert(|comp: &i32| *comp as f32);
let _ = world_a.clone_from(&world_b, &any(), &mut merger);
Sourcepub fn clone_from_single<M: Merger>(
&mut self,
source: &World,
entity: Entity,
merger: &mut M,
) -> Entity
pub fn clone_from_single<M: Merger>( &mut self, source: &World, entity: Entity, merger: &mut M, ) -> Entity
Clones a single entity from the source world into the destination world.
Sourcepub fn as_serializable<'a, F: LayoutFilter, W: WorldSerializer, E: EntitySerializer>(
&'a self,
filter: F,
world_serializer: &'a W,
entity_serializer: &'a E,
) -> SerializableWorld<'a, F, W, E>
pub fn as_serializable<'a, F: LayoutFilter, W: WorldSerializer, E: EntitySerializer>( &'a self, filter: F, world_serializer: &'a W, entity_serializer: &'a E, ) -> SerializableWorld<'a, F, W, E>
Creates a serde serializable representation of the world.
A LayoutFilter
selects which entities shall be serialized.
A WorldSerializer
describes how components will
be serialized.
As component types are not known at compile time, the world must be provided with the
means to serialize each component. This is provided by the
WorldSerializer
implementation. This implementation
also describes how ComponentTypeId
s (which are not stable between compiles) are mapped to
stable type identifiers. Components that are not known to the serializer will be omitted from
the serialized output.
The Registry
provides a
WorldSerializer
implementation suitable for most
situations.
§Examples
Serializing all entities with a Position
component to JSON.
// create a registry which uses strings as the external type ID
let mut registry = Registry::<String>::default();
registry.register::<Position>("position".to_string());
registry.register::<f32>("f32".to_string());
registry.register::<bool>("bool".to_string());
// serialize entities with the `Position` component
let entity_serializer = Canon::default();
let json = serde_json::to_value(&world.as_serializable(
component::<Position>(),
®istry,
&entity_serializer,
))
.unwrap();
println!("{:#}", json);
// registries can also be used to deserialize
use serde::de::DeserializeSeed;
let world: World = registry
.as_deserialize(&entity_serializer)
.deserialize(json)
.unwrap();
Trait Implementations§
Source§impl EntityStore for World
impl EntityStore for World
Source§fn entry_ref(&self, entity: Entity) -> Result<EntryRef<'_>, EntityAccessError>
fn entry_ref(&self, entity: Entity) -> Result<EntryRef<'_>, EntityAccessError>
Source§fn entry_mut(
&mut self,
entity: Entity,
) -> Result<EntryMut<'_>, EntityAccessError>
fn entry_mut( &mut self, entity: Entity, ) -> Result<EntryMut<'_>, EntityAccessError>
Source§fn get_component_storage<V: for<'b> View<'b>>(
&self,
) -> Result<StorageAccessor<'_>, EntityAccessError>
fn get_component_storage<V: for<'b> View<'b>>( &self, ) -> Result<StorageAccessor<'_>, EntityAccessError>
View
.Auto Trait Implementations§
impl Freeze for World
impl !RefUnwindSafe for World
impl Send for World
impl Sync for World
impl Unpin for World
impl !UnwindSafe for World
Blanket Implementations§
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
Source§impl<T> Component for T
impl<T> Component for T
Source§type Storage = PackedStorage<T>
type Storage = PackedStorage<T>
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§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
.Source§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
.Source§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.Source§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.Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
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