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(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 }
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}