examples/systems/
system_ctx.rs1use crate::z_ignore_test_common::*;
2
3use core::{borrow::Borrow, ffi::c_void};
4use flecs_ecs::prelude::*;
5use std::time::{SystemTime, UNIX_EPOCH};
6
7#[derive(Debug, Component)]
8pub struct Position {
9 pub x: f32,
10 pub y: f32,
11}
12
13#[derive(Component)]
14struct Radius {
15 value: f32,
16}
17
18fn sqr(value: f32) -> f32 {
19 value * value
20}
21
22fn distance_sqr(p1: &Position, p2: &Position) -> f32 {
23 sqr(p2.x - p1.x) + sqr(p2.y - p1.y)
24}
25
26fn rand(max: u64) -> f32 {
27 let start = SystemTime::now();
28
29 let since_the_epoch = start
31 .duration_since(UNIX_EPOCH)
32 .expect("Time went backwards");
33
34 let random_number = since_the_epoch.as_secs() ^ since_the_epoch.subsec_nanos() as u64;
36
37 (random_number % max) as f32
38}
39
40fn main() {
41 let world = World::new();
42
43 let mut query_collide = world.new_query::<(&Position, &Radius)>();
49
50 let sys = world
51 .system::<(&Position, &Radius)>()
52 .set_context(&mut query_collide as *mut Query<(&Position, &Radius)> as *mut c_void)
53 .each_iter(|mut it, index, (p1, r1)| {
54 let query = unsafe { it.context::<Query<(&Position, &Radius)>>() };
55 let e1 = it.entity(index);
56
57 query.each_entity(|e2, (p2, r2)| {
58 if e1 == *e2 {
59 return;
61 }
62
63 if e1 > *e2 {
64 return;
67 }
68
69 let d_sqr = distance_sqr(p1, p2);
71 let r_sqr = sqr(r1.value + r2.value);
72 if r_sqr > d_sqr {
73 println!("{e1} and {e2} collided!");
74 }
75 });
76 });
77
78 for _ in 0..10 {
80 world
81 .entity()
82 .set(Position {
83 x: rand(50),
84 y: rand(50),
85 })
86 .set(Radius {
87 value: rand(10) + 1.0,
88 });
89 }
90
91 sys.run();
93
94 }
102
103#[cfg(feature = "flecs_nightly_tests")]
104#[test]
105fn test() {
106 let output_capture = OutputCapture::capture().unwrap();
107 main();
108 assert!(output_capture.output().lock().unwrap().len() > 0);
109}