pub struct Hierarchy<P> { /* private fields */ }Expand description
Scene graph type hierarchy.
Will use the given generic type P as the component type that provides parenting links. The
internal structure is kept in sync with the Tracked events for that component type.
Will send modification events on the internal EventChannel. Note that Removed events
do not indicate that the Parent component was removed from the component storage, just that
the Entity will no longer be considered to be a part of the Hierarchy. This is because the
user may wish to either remove only the component, or the complete Entity, or something
completely different. When an Entity that is a parent gets removed from the hierarchy, the
full tree of children below it will also be removed from the hierarchy.
Any cycles in the hierarchy will cause Undefined Behavior.
Implementations§
Source§impl<P> Hierarchy<P>
impl<P> Hierarchy<P>
Sourcepub fn new(reader_id: ReaderId<ComponentEvent>) -> Self
pub fn new(reader_id: ReaderId<ComponentEvent>) -> Self
Create a new hierarchy object.
Sourcepub fn all(&self) -> &[Entity]
pub fn all(&self) -> &[Entity]
Get all entities that contain parents, in sorted order, where parents are guaranteed to be before their children.
Note: This does not include entities that are parents.
Examples found in repository?
21fn main() {
22 let mut world = World::new();
23 let mut dispatcher = DispatcherBuilder::new()
24 .with(
25 HierarchySystem::<Parent>::new(&mut world),
26 "hierarchy_system",
27 &[],
28 )
29 .build();
30 dispatcher.setup(&mut world);
31
32 let _e0 = world.create_entity().build();
33 let e1 = world.create_entity().build();
34 let e2 = world.create_entity().build();
35 let e3 = world.create_entity().build();
36 let e4 = world.create_entity().build();
37 let e5 = world.create_entity().build();
38 let _e6 = world.create_entity().build();
39 let _e7 = world.create_entity().build();
40 let _e8 = world.create_entity().build();
41 let _e9 = world.create_entity().build();
42
43 {
44 let mut parents = world.write_storage::<Parent>();
45 parents.insert(e1, Parent { entity: e5 }).unwrap();
46 parents.insert(e3, Parent { entity: e1 }).unwrap();
47 parents.insert(e4, Parent { entity: e5 }).unwrap();
48 parents.insert(e5, Parent { entity: e2 }).unwrap();
49 }
50
51 dispatcher.dispatch(&mut world);
52
53 {
54 let parents = world.read_storage::<Parent>();
55 for entity in world.read_resource::<Hierarchy<Parent>>().all() {
56 let formatted = parents
57 .get(*entity)
58 .map(|parent| format!("{:?}", parent.entity))
59 .unwrap_or(format!("None"));
60 println!("{:?}: {}", entity, formatted);
61 }
62 }
63}Sourcepub fn children(&self, entity: Entity) -> &[Entity]
pub fn children(&self, entity: Entity) -> &[Entity]
Get the immediate children of a specific entity.
Sourcepub fn all_children(&self, entity: Entity) -> BitSet
pub fn all_children(&self, entity: Entity) -> BitSet
Get all children of this entity recursively as a BitSet
This does not include the parent entity you pass in.
Sourcepub fn all_children_iter(&self, entity: Entity) -> SubHierarchyIterator<'_, P> ⓘ
pub fn all_children_iter(&self, entity: Entity) -> SubHierarchyIterator<'_, P> ⓘ
Returns an iterator over all of the recursive children of this entity.
This does not include the parent entity you pass in. Parents are guaranteed to be prior to their children.
Sourcepub fn track(&mut self) -> ReaderId<HierarchyEvent>
pub fn track(&mut self) -> ReaderId<HierarchyEvent>
Get a token for tracking the modification events from the hierarchy
Sourcepub fn changed(&self) -> &EventChannel<HierarchyEvent>
pub fn changed(&self) -> &EventChannel<HierarchyEvent>
Get the EventChannel for the modification events for reading
Auto Trait Implementations§
impl<P> Freeze for Hierarchy<P>
impl<P> !RefUnwindSafe for Hierarchy<P>
impl<P> Send for Hierarchy<P>where
P: Send,
impl<P> Sync for Hierarchy<P>where
P: Sync,
impl<P> Unpin for Hierarchy<P>where
P: Unpin,
impl<P> UnwindSafe for Hierarchy<P>where
P: UnwindSafe,
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> 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