use crate::collider2::*;
use crate::surface2::*;
use crate::vector2::Vector2D;
use std::sync::{RwLock, Arc};
pub type OnBeginUpdateCallback = fn(&mut RigidBodyCollider2, f64, f64);
pub struct RigidBodyCollider2 {
pub linear_velocity: Vector2D,
pub angular_velocity: f64,
_collider_data: Collider2Data,
_on_update_callback: Option<OnBeginUpdateCallback>,
}
impl RigidBodyCollider2 {
pub fn new(surface: Surface2Ptr) -> RigidBodyCollider2 {
return RigidBodyCollider2 {
linear_velocity: Vector2D::new_default(),
angular_velocity: 0.0,
_collider_data: Collider2Data::new(Some(surface)),
_on_update_callback: None,
};
}
pub fn new_vel(
surface: Surface2Ptr,
linear_velocity: Vector2D,
angular_velocity: f64) -> RigidBodyCollider2 {
return RigidBodyCollider2 {
linear_velocity,
angular_velocity,
_collider_data: Collider2Data::new(Some(surface)),
_on_update_callback: None,
};
}
pub fn builder() -> Builder {
return Builder::new();
}
pub fn set_on_begin_update_callback(&mut self, callback: OnBeginUpdateCallback) {
self._on_update_callback = Some(callback);
}
}
impl Collider2 for RigidBodyCollider2 {
fn velocity_at(&self, point: &Vector2D) -> Vector2D {
let r = *point - self.surface().read().unwrap().view().transform.translation();
return self.linear_velocity + Vector2D::new(-r.y, r.x) * self.angular_velocity;
}
fn update(&mut self, current_time_in_seconds: f64,
time_interval_in_seconds: f64) where Self: Sized {
if !self.surface().read().unwrap().is_valid_geometry() {
return;
}
self.surface().read().unwrap().update_query_engine();
if let Some(callback) = self._on_update_callback {
(callback)(self, current_time_in_seconds, time_interval_in_seconds);
}
}
fn view(&self) -> &Collider2Data {
return &self._collider_data;
}
fn view_mut(&mut self) -> &mut Collider2Data {
return &mut self._collider_data;
}
}
pub type RigidBodyCollider2Ptr = Arc<RwLock<RigidBodyCollider2>>;
pub struct Builder {
_surface: Option<Surface2Ptr>,
_linear_velocity: Vector2D,
_angular_velocity: f64,
}
impl Builder {
pub fn with_surface(&mut self, surface: Surface2Ptr) -> &mut Self {
self._surface = Some(surface);
return self;
}
pub fn with_linear_velocity(&mut self, linear_velocity: Vector2D) -> &mut Self {
self._linear_velocity = linear_velocity;
return self;
}
pub fn with_angular_velocity(&mut self, angular_velocity: f64) -> &mut Self {
self._angular_velocity = angular_velocity;
return self;
}
pub fn build(&mut self) -> RigidBodyCollider2 {
return RigidBodyCollider2::new_vel(self._surface.as_ref().unwrap().clone(),
self._linear_velocity,
self._angular_velocity);
}
pub fn make_shared(&mut self) -> RigidBodyCollider2Ptr {
return RigidBodyCollider2Ptr::new(RwLock::new(self.build()));
}
pub fn new() -> Builder {
return Builder {
_surface: None,
_linear_velocity: Vector2D::new_default(),
_angular_velocity: 0.0,
};
}
}