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_id(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_id(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_id(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_id(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.run_iter(|it, (local, parent_world, world)| {
61        for i in it.iter() {
62            world[i].x = local[i].x;
63            world[i].y = local[i].y;
64            if parent_world.is_some() {
65                let parent_world = parent_world.unwrap();
66                world[i].x += parent_world[i].x;
67                world[i].y += parent_world[i].y;
68            }
69        }
70    });
71
72    world
73        .new_query::<&(Position, WorldX)>()
74        .each_entity(|entity, position| {
75            println!(
76                "Entity {} is at ({}, {})",
77                entity.name(),
78                position.x,
79                position.y
80            );
81        });
82
83    // Output:
84    //  Entity Sun is at (1, 1)
85    //  Entity Mercury is at (2, 2)
86    //  Entity Venus is at (3, 3)
87    //  Entity Earth is at (4, 4)
88    //  Entity Moon is at (4.1, 4.1)
89}
90
91#[cfg(feature = "flecs_nightly_tests")]
92#[test]
93fn test() {
94    let output_capture = OutputCapture::capture().unwrap();
95    main();
96    output_capture.test("query_hierarchy".to_string());
97}