use crate::b2_collision::*;
use crate::b2_contact::*;
use crate::b2_fixture::*;
use crate::b2_joint::*;
use crate::b2_math::*;
use crate::b2_common::*;
use crate::b2rs_common::*;
use std::cell::RefCell;
use std::rc::Rc;
use crate::private::dynamics::b2_world_callbacks as private;
pub type B2destructionListenerPtr<D> = Rc<RefCell<dyn B2destructionListener<D>>>;
pub type B2contactFilterPtr<D> = Rc<RefCell<dyn B2contactFilter<D>>>;
pub type B2contactListenerPtr<D> = Rc<RefCell<dyn B2contactListener<D>>>;
pub trait B2destructionListener<D: UserDataType> {
fn say_goodbye_joint(&mut self, joint: B2jointPtr<D>);
fn say_goodbye_fixture(&mut self, fixture: FixturePtr<D>);
}
pub trait B2contactFilter<D: UserDataType> {
fn should_collide(&self, fixture_a: FixturePtr<D>, fixture_b: FixturePtr<D>) -> bool {
return private::should_collide(fixture_a, fixture_b);
}
}
pub struct B2contactFilterDefault;
impl<D: UserDataType> B2contactFilter<D> for B2contactFilterDefault {}
#[derive(Default, Copy, Clone, Debug)]
pub struct B2contactImpulse {
pub normal_impulses: [f32; B2_MAX_MANIFOLD_POINTS],
pub tangent_impulses: [f32; B2_MAX_MANIFOLD_POINTS],
pub count: i32,
}
pub trait B2contactListener<D: UserDataType> {
fn begin_contact(&mut self, contact: &mut dyn B2contactDynTrait<D>) {
b2_not_used(contact);
}
fn end_contact(&mut self, contact: &mut dyn B2contactDynTrait<D>) {
b2_not_used(contact);
}
fn pre_solve(&mut self, contact: &mut dyn B2contactDynTrait<D>, old_manifold: &B2manifold) {
b2_not_used(contact);
b2_not_used(old_manifold);
}
fn post_solve(&mut self, contact: &mut dyn B2contactDynTrait<D>, impulse: &B2contactImpulse) {
b2_not_used(contact);
b2_not_used(impulse);
}
}
pub struct B2contactListenerDefault;
impl<D: UserDataType> B2contactListener<D> for B2contactListenerDefault {}
pub trait B2queryCallback<D: UserDataType>: FnMut(
FixturePtr<D>
) -> bool {}
impl<F, D: UserDataType> B2queryCallback<D> for F where F: FnMut(FixturePtr<D>) -> bool {}
pub trait B2rayCastCallback<D:UserDataType>: FnMut(
FixturePtr<D>,
B2vec2,
B2vec2,
f32) -> f32 {}
impl<F, D: UserDataType> B2rayCastCallback<D> for F where
F: FnMut(FixturePtr<D>, B2vec2, B2vec2, f32) -> f32
{}