specs_hierarchy

Struct Hierarchy

Source
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>

Source

pub fn new(reader_id: ReaderId<ComponentEvent>) -> Self
where P: Component, P::Storage: Tracked,

Create a new hierarchy object.

Source

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?
examples/sort.rs (line 55)
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
fn main() {
    let mut world = World::new();
    let mut dispatcher = DispatcherBuilder::new()
        .with(
            HierarchySystem::<Parent>::new(&mut world),
            "hierarchy_system",
            &[],
        )
        .build();
    dispatcher.setup(&mut world);

    let _e0 = world.create_entity().build();
    let e1 = world.create_entity().build();
    let e2 = world.create_entity().build();
    let e3 = world.create_entity().build();
    let e4 = world.create_entity().build();
    let e5 = world.create_entity().build();
    let _e6 = world.create_entity().build();
    let _e7 = world.create_entity().build();
    let _e8 = world.create_entity().build();
    let _e9 = world.create_entity().build();

    {
        let mut parents = world.write_storage::<Parent>();
        parents.insert(e1, Parent { entity: e5 }).unwrap();
        parents.insert(e3, Parent { entity: e1 }).unwrap();
        parents.insert(e4, Parent { entity: e5 }).unwrap();
        parents.insert(e5, Parent { entity: e2 }).unwrap();
    }

    dispatcher.dispatch(&mut world);

    {
        let parents = world.read_storage::<Parent>();
        for entity in world.read_resource::<Hierarchy<Parent>>().all() {
            let formatted = parents
                .get(*entity)
                .map(|parent| format!("{:?}", parent.entity))
                .unwrap_or(format!("None"));
            println!("{:?}: {}", entity, formatted);
        }
    }
}
Source

pub fn children(&self, entity: Entity) -> &[Entity]

Get the immediate children of a specific entity.

Source

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.

Source

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.

Source

pub fn parent(&self, entity: Entity) -> Option<Entity>

Get the parent of a specific entity

Source

pub fn track(&mut self) -> ReaderId<HierarchyEvent>

Get a token for tracking the modification events from the hierarchy

Source

pub fn changed(&self) -> &EventChannel<HierarchyEvent>

Get the EventChannel for the modification events for reading

Source

pub fn maintain(&mut self, data: ParentData<'_, P>)
where P: Component + Parent, P::Storage: Tracked,

Maintain the hierarchy, usually only called by HierarchySystem.

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> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Any for T
where T: Any,

Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize = _

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> Event for T
where T: Send + Sync + 'static,

Source§

impl<T> Resource for T
where T: Any + Send + Sync,