examples/queries/
query_hierarchy.rs1use 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 }
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}