-
-
Notifications
You must be signed in to change notification settings - Fork 106
/
Copy pathdbvt_broad_phase2d.rs
59 lines (45 loc) · 1.75 KB
/
dbvt_broad_phase2d.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
extern crate nalgebra as na;
use na::{Isometry2, Vector2};
use ncollide2d::bounding_volume;
use ncollide2d::broad_phase::{BroadPhase, BroadPhaseInterferenceHandler, DBVTBroadPhase};
use ncollide2d::shape::Ball;
struct InterferenceHandler;
impl BroadPhaseInterferenceHandler<i32> for InterferenceHandler {
fn is_interference_allowed(&mut self, a: &i32, b: &i32) -> bool {
// Prevent self-collision.
*a != *b
}
fn interference_started(&mut self, _: &i32, _: &i32) {}
fn interference_stopped(&mut self, _: &i32, _: &i32) {}
}
fn main() {
/*
* Create the objects.
*/
let poss = [
Isometry2::new(Vector2::new(0.0, 0.0), na::zero()),
Isometry2::new(Vector2::new(0.0, 0.5), na::zero()),
Isometry2::new(Vector2::new(0.5, 0.0), na::zero()),
Isometry2::new(Vector2::new(0.5, 0.5), na::zero()),
];
// We will use the same shape for the four objects.
let ball = Ball::new(0.5);
/*
* Create the broad phase.
*/
let mut bf = DBVTBroadPhase::new(0.2);
// First parameter: the object bounding box.
// Second parameter: some data (here, the id that identify each object).
let proxy1 = bf.create_proxy(bounding_volume::aabb(&ball, &poss[0]), 0);
let proxy2 = bf.create_proxy(bounding_volume::aabb(&ball, &poss[1]), 1);
let _ = bf.create_proxy(bounding_volume::aabb(&ball, &poss[2]), 2);
let _ = bf.create_proxy(bounding_volume::aabb(&ball, &poss[3]), 3);
// Update the broad phase.
bf.update(&mut InterferenceHandler);
assert!(bf.num_interferences() == 6);
// Remove two objects.
bf.remove(&[proxy1, proxy2], &mut |_, _| {});
// Update the broad phase.
bf.update(&mut InterferenceHandler);
assert!(bf.num_interferences() == 1)
}