extern crate nalgebra;
extern crate ncollide;
use ncollide::broad_phase::{BroadPhase, DBVTBroadPhase};
use ncollide::bounding_volume::BoundingSphere;
type Position = nalgebra::Pnt2<f64>;
trait Collider {
fn get_bounds(&self) -> BoundingSphere<Position>;
fn do_something(&mut self);
}
struct Sphere {
position: Position,
radius: f64,
}
impl Collider for Sphere {
fn get_bounds(&self) -> BoundingSphere<Position> {
BoundingSphere::new(self.position, self.radius)
}
fn do_something(&mut self) {
}
}
type MyBroadPhase<'a> = DBVTBroadPhase<Position, BoundingSphere<Position>, &'a mut Collider>;
struct World<'a> {
spheres: Box<[Sphere]>,
num_spheres: usize,
broad: MyBroadPhase<'a>,
}
impl<'a> World<'a> {
fn new(count: usize) -> World<'a> {
let mut spheres = Vec::with_capacity(count);
let mut broad: MyBroadPhase<'a> = DBVTBroadPhase::new(10.0, true);
for i in 0..count {
spheres.push(Sphere { position: Position::new(0.0, 0.0), radius: 16.0 });
let sphere = spheres.last_mut().unwrap();
//help
//error: `spheres` does not live long enough
let sphere: &'a mut Sphere = unsafe { &mut *(sphere as *mut Sphere) };
broad.deferred_add(i, sphere.get_bounds(), sphere);
}
World {
spheres: spheres.into_boxed_slice(),
num_spheres: count,
broad: broad,
}
}
}
fn main() {
let world = World::new(1);
let mut vec = Vec::new(world.num_spheres);
let bv = BoundingSphere::new(Position::new(0.0, 0.0), 4.0);
world.broad.interferences_with_bounding_volume(&bv, &mut vec);
for &mut collider in vec.iter_mut() {
//help
//error: cannot borrow data mutably in a `&` reference
let collider: &mut Collider = unsafe { *(collider as *const &mut Collider) };
collider.do_something();
}
}
ZXh0ZXJuIGNyYXRlIG5hbGdlYnJhOwpleHRlcm4gY3JhdGUgbmNvbGxpZGU7Cgp1c2UgbmNvbGxpZGU6OmJyb2FkX3BoYXNlOjp7QnJvYWRQaGFzZSwgREJWVEJyb2FkUGhhc2V9Owp1c2UgbmNvbGxpZGU6OmJvdW5kaW5nX3ZvbHVtZTo6Qm91bmRpbmdTcGhlcmU7Cgp0eXBlIFBvc2l0aW9uID0gbmFsZ2VicmE6OlBudDI8ZjY0PjsKCnRyYWl0IENvbGxpZGVyIHsKICAgIGZuIGdldF9ib3VuZHMoJnNlbGYpIC0+IEJvdW5kaW5nU3BoZXJlPFBvc2l0aW9uPjsKICAgIGZuIGRvX3NvbWV0aGluZygmbXV0IHNlbGYpOwp9CgpzdHJ1Y3QgU3BoZXJlIHsKICAgIHBvc2l0aW9uOiBQb3NpdGlvbiwKICAgIHJhZGl1czogZjY0LAp9CgppbXBsIENvbGxpZGVyIGZvciBTcGhlcmUgewogICAgZm4gZ2V0X2JvdW5kcygmc2VsZikgLT4gQm91bmRpbmdTcGhlcmU8UG9zaXRpb24+IHsKICAgICAgICBCb3VuZGluZ1NwaGVyZTo6bmV3KHNlbGYucG9zaXRpb24sIHNlbGYucmFkaXVzKQogICAgfQoKICAgIGZuIGRvX3NvbWV0aGluZygmbXV0IHNlbGYpIHsKICAgIH0KfQoKdHlwZSBNeUJyb2FkUGhhc2U8J2E+ID0gREJWVEJyb2FkUGhhc2U8UG9zaXRpb24sIEJvdW5kaW5nU3BoZXJlPFBvc2l0aW9uPiwgJidhIG11dCBDb2xsaWRlcj47CgpzdHJ1Y3QgV29ybGQ8J2E+IHsKICAgIHNwaGVyZXM6IEJveDxbU3BoZXJlXT4sCiAgICBudW1fc3BoZXJlczogdXNpemUsCiAgICBicm9hZDogTXlCcm9hZFBoYXNlPCdhPiwKfQoKaW1wbDwnYT4gV29ybGQ8J2E+IHsKICAgIGZuIG5ldyhjb3VudDogdXNpemUpIC0+IFdvcmxkPCdhPiB7CiAgICAgICAgbGV0IG11dCBzcGhlcmVzID0gVmVjOjp3aXRoX2NhcGFjaXR5KGNvdW50KTsKCiAgICAgICAgbGV0IG11dCBicm9hZDogTXlCcm9hZFBoYXNlPCdhPiA9IERCVlRCcm9hZFBoYXNlOjpuZXcoMTAuMCwgdHJ1ZSk7CiAgICAgICAgZm9yIGkgaW4gMC4uY291bnQgewogICAgICAgICAgICBzcGhlcmVzLnB1c2goU3BoZXJlIHsgcG9zaXRpb246IFBvc2l0aW9uOjpuZXcoMC4wLCAwLjApLCAgcmFkaXVzOiAxNi4wIH0pOwogICAgICAgICAgICBsZXQgc3BoZXJlID0gc3BoZXJlcy5sYXN0X211dCgpLnVud3JhcCgpOwogICAgICAgICAgICAvL2hlbHAKICAgICAgICAgICAgLy9lcnJvcjogYHNwaGVyZXNgIGRvZXMgbm90IGxpdmUgbG9uZyBlbm91Z2gKICAgICAgICAgICAgbGV0IHNwaGVyZTogJidhIG11dCBTcGhlcmUgPSB1bnNhZmUgeyAmbXV0ICooc3BoZXJlIGFzICptdXQgU3BoZXJlKSB9OwogICAgICAgICAgICBicm9hZC5kZWZlcnJlZF9hZGQoaSwgc3BoZXJlLmdldF9ib3VuZHMoKSwgc3BoZXJlKTsKICAgICAgICB9CgogICAgICAgIFdvcmxkIHsKICAgICAgICAgICAgc3BoZXJlczogc3BoZXJlcy5pbnRvX2JveGVkX3NsaWNlKCksCiAgICAgICAgICAgIG51bV9zcGhlcmVzOiBjb3VudCwKICAgICAgICAgICAgYnJvYWQ6IGJyb2FkLAogICAgICAgIH0KICAgIH0KfQoKZm4gbWFpbigpIHsKICAgIGxldCB3b3JsZCA9IFdvcmxkOjpuZXcoMSk7CgogICAgbGV0IG11dCB2ZWMgPSBWZWM6Om5ldyh3b3JsZC5udW1fc3BoZXJlcyk7CiAgICBsZXQgYnYgPSBCb3VuZGluZ1NwaGVyZTo6bmV3KFBvc2l0aW9uOjpuZXcoMC4wLCAwLjApLCA0LjApOwogICAgd29ybGQuYnJvYWQuaW50ZXJmZXJlbmNlc193aXRoX2JvdW5kaW5nX3ZvbHVtZSgmYnYsICZtdXQgdmVjKTsKICAgIGZvciAmbXV0IGNvbGxpZGVyIGluIHZlYy5pdGVyX211dCgpIHsKICAgICAgICAvL2hlbHAKICAgICAgICAvL2Vycm9yOiBjYW5ub3QgYm9ycm93IGRhdGEgbXV0YWJseSBpbiBhIGAmYCByZWZlcmVuY2UKICAgICAgICBsZXQgY29sbGlkZXI6ICZtdXQgQ29sbGlkZXIgPSB1bnNhZmUgeyAqKGNvbGxpZGVyIGFzICpjb25zdCAmbXV0IENvbGxpZGVyKSB9OwogICAgICAgIGNvbGxpZGVyLmRvX3NvbWV0aGluZygpOwogICAgfQp9