Skip to main content

examples/queries/
query_hierarchy.rs

1use crate::z_ignore_test_common::*;
2
3use flecs_ecs::prelude::*;
4
5#[derive(Debug, Component, Default)]
6pub struct Position {
7    pub x: f32,
8    pub y: f32,
9}
10
11#[derive(Debug, Component)]
12struct Local;
13
14#[derive(Debug, Component)]
15struct WorldX;
16
17fn main() {
18    let world = World::new();
19
20    let sun = world
21        .entity_named("Sun")
22        .set_pair::<Position, WorldX>(Position::default())
23        .set_pair::<Position, Local>(Position { x: 1.0, y: 1.0 });
24
25    world
26        .entity_named("Mercury")
27        .child_of(sun)
28        .set_pair::<Position, WorldX>(Position::default())
29        .set_pair::<Position, Local>(Position { x: 1.0, y: 1.0 });
30
31    world
32        .entity_named("Venus")
33        .child_of(sun)
34        .set_pair::<Position, WorldX>(Position::default())
35        .set_pair::<Position, Local>(Position { x: 2.0, y: 2.0 });
36
37    let earth = world
38        .entity_named("Earth")
39        .child_of(sun)
40        .set_pair::<Position, WorldX>(Position::default())
41        .set_pair::<Position, Local>(Position { x: 3.0, y: 3.0 });
42
43    world
44        .entity_named("Moon")
45        .child_of(earth)
46        .set_pair::<Position, WorldX>(Position::default())
47        .set_pair::<Position, Local>(Position { x: 0.1, y: 0.1 });
48
49    let query = world
50        .query::<(
51            &(Position, Local),
52            Option<&(Position, WorldX)>,
53            &mut (Position, WorldX),
54        )>()
55        .term_at(1)
56        .parent()
57        .cascade()
58        .build();
59
60    query.each(|(local, parent_world, world)| {
61        world.x = local.x;
62        world.y = local.y;
63        if let Some(parent_world) = parent_world {
64            world.x += parent_world.x;
65            world.y += parent_world.y;
66        }
67    });
68
69    world
70        .new_query::<&(Position, WorldX)>()
71        .each_entity(|entity, position| {
72            println!(
73                "Entity {} is at ({}, {})",
74                entity.name(),
75                position.x,
76                position.y
77            );
78        });
79
80    // Output:
81    //  Entity Sun is at (1, 1)
82    //  Entity Mercury is at (2, 2)
83    //  Entity Venus is at (3, 3)
84    //  Entity Earth is at (4, 4)
85    //  Entity Moon is at (4.1, 4.1)
86}
87
88#[cfg(feature = "flecs_nightly_tests")]
89#[test]
90fn test() {
91    let output_capture = OutputCapture::capture().unwrap();
92    main();
93    output_capture.test("query_hierarchy".to_string());
94}