use crate::structs::components::{Component, ComponentTrait};
use crate::structs::Vector3;
use std::ffi::c_void;
use std::ops::Deref;
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub struct Rigidbody {
pub component: Component,
}
impl ComponentTrait for Rigidbody {
fn from_ptr(ptr: *mut c_void) -> Self {
Self {
component: Component::from_ptr(ptr),
}
}
}
impl Deref for Rigidbody {
type Target = Component;
fn deref(&self) -> &Self::Target {
&self.component
}
}
#[repr(i32)]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ForceMode {
Force = 0,
Acceleration = 5,
Impulse = 1,
VelocityChange = 2,
}
impl Rigidbody {
pub fn get_detect_collisions(&self) -> Result<bool, String> {
unsafe {
let result = self
.method("get_detectCollisions")
.ok_or("Method 'get_detectCollisions' not found")?
.call::<bool>(&[])?;
Ok(result)
}
}
pub fn set_detect_collisions(&self, value: bool) -> Result<(), String> {
unsafe {
self.method("set_detectCollisions")
.ok_or("Method 'set_detectCollisions' not found")?
.call::<()>(&[&value as *const bool as *mut c_void])?;
Ok(())
}
}
pub fn get_velocity(&self) -> Result<Vector3, String> {
unsafe {
let result = self
.method("get_velocity")
.ok_or("Method 'get_velocity' not found")?
.call::<Vector3>(&[])?;
Ok(result)
}
}
pub fn set_velocity(&self, value: Vector3) -> Result<(), String> {
unsafe {
self.method("set_velocity")
.ok_or("Method 'set_velocity' not found")?
.call::<()>(&[&value as *const Vector3 as *mut c_void])?;
Ok(())
}
}
pub fn add_force(&self, force: Vector3, mode: ForceMode) -> Result<(), String> {
unsafe {
let mut force_cp = force;
let mut mode_cp = mode as i32;
let params = &[
&mut force_cp as *mut Vector3 as *mut c_void,
&mut mode_cp as *mut i32 as *mut c_void,
];
self.method(("AddForce", 2))
.ok_or("Method 'AddForce' not found")?
.call::<()>(params)?;
Ok(())
}
}
pub fn get_mass(&self) -> Result<f32, String> {
unsafe {
self.method("get_mass")
.ok_or("Method 'get_mass' not found")?
.call::<f32>(&[])
}
}
pub fn set_mass(&self, value: f32) -> Result<(), String> {
unsafe {
let mut value_cp = value;
self.method("set_mass")
.ok_or("Method 'set_mass' not found")?
.call::<()>(&[&mut value_cp as *mut f32 as *mut c_void])?;
Ok(())
}
}
pub fn get_drag(&self) -> Result<f32, String> {
unsafe {
self.method("get_drag")
.ok_or("Method 'get_drag' not found")?
.call::<f32>(&[])
}
}
pub fn set_drag(&self, value: f32) -> Result<(), String> {
unsafe {
let mut value_cp = value;
self.method("set_drag")
.ok_or("Method 'set_drag' not found")?
.call::<()>(&[&mut value_cp as *mut f32 as *mut c_void])?;
Ok(())
}
}
pub fn get_angular_drag(&self) -> Result<f32, String> {
unsafe {
self.method("get_angularDrag")
.ok_or("Method 'get_angularDrag' not found")?
.call::<f32>(&[])
}
}
pub fn set_angular_drag(&self, value: f32) -> Result<(), String> {
unsafe {
let mut value_cp = value;
self.method("set_angularDrag")
.ok_or("Method 'set_angularDrag' not found")?
.call::<()>(&[&mut value_cp as *mut f32 as *mut c_void])?;
Ok(())
}
}
pub fn get_is_kinematic(&self) -> Result<bool, String> {
unsafe {
self.method("get_isKinematic")
.ok_or("Method 'get_isKinematic' not found")?
.call::<bool>(&[])
}
}
pub fn set_is_kinematic(&self, value: bool) -> Result<(), String> {
unsafe {
let mut value_cp = value;
self.method("set_isKinematic")
.ok_or("Method 'set_isKinematic' not found")?
.call::<()>(&[&mut value_cp as *mut bool as *mut c_void])?;
Ok(())
}
}
pub fn get_use_gravity(&self) -> Result<bool, String> {
unsafe {
self.method("get_useGravity")
.ok_or("Method 'get_useGravity' not found")?
.call::<bool>(&[])
}
}
pub fn set_use_gravity(&self, value: bool) -> Result<(), String> {
unsafe {
let mut value_cp = value;
self.method("set_useGravity")
.ok_or("Method 'set_useGravity' not found")?
.call::<()>(&[&mut value_cp as *mut bool as *mut c_void])?;
Ok(())
}
}
}