use crate::{
owner::Owner,
traits::{Class, UserData},
};
use std::marker::PhantomData;
#[rustfmt::skip]
use physx_sys::{
PxMaterial_getDynamicFriction,
PxMaterial_getFlags,
PxMaterial_getFrictionCombineMode,
PxMaterial_getRestitution,
PxMaterial_getRestitutionCombineMode,
PxMaterial_getStaticFriction,
PxMaterial_setDynamicFriction_mut,
PxMaterial_setFlag_mut,
PxMaterial_setFlags_mut,
PxMaterial_setFrictionCombineMode_mut,
PxMaterial_setRestitutionCombineMode_mut,
PxMaterial_setRestitution_mut,
PxMaterial_setStaticFriction_mut,
};
#[rustfmt::skip]
pub use physx_sys::{
PxCombineMode as CombineMode,
PxMaterialFlag as MaterialFlag,
PxMaterialFlags as MaterialFlags,
};
#[repr(transparent)]
pub struct PxMaterial<U> {
pub(crate) obj: physx_sys::PxMaterial,
phantom_user_data: PhantomData<U>,
}
unsafe impl<U> UserData for PxMaterial<U> {
type UserData = U;
fn user_data_ptr(&self) -> &*mut std::ffi::c_void {
&self.obj.userData
}
fn user_data_ptr_mut(&mut self) -> &mut *mut std::ffi::c_void {
&mut self.obj.userData
}
}
impl<U> Drop for PxMaterial<U> {
fn drop(&mut self) {
use crate::base::RefCounted;
self.release();
}
}
unsafe impl<P, U> Class<P> for PxMaterial<U>
where
physx_sys::PxMaterial: Class<P>,
{
fn as_ptr(&self) -> *const P {
self.obj.as_ptr()
}
fn as_mut_ptr(&mut self) -> *mut P {
self.obj.as_mut_ptr()
}
}
unsafe impl<U: Send> Send for PxMaterial<U> {}
unsafe impl<U: Sync> Sync for PxMaterial<U> {}
impl<M> Material for PxMaterial<M> {}
pub trait Material: Class<physx_sys::PxMaterial> + UserData {
unsafe fn from_raw(
ptr: *mut physx_sys::PxMaterial,
user_data: Self::UserData,
) -> Option<Owner<Self>> {
unsafe { Owner::from_raw((ptr as *mut Self).as_mut()?.init_user_data(user_data)) }
}
#[inline]
fn get_user_data(&self) -> &Self::UserData {
unsafe { UserData::get_user_data(self) }
}
#[inline]
fn get_user_data_mut(&mut self) -> &mut Self::UserData {
unsafe { UserData::get_user_data_mut(self) }
}
#[inline]
fn set_dynamic_friction(&mut self, mut coefficient: f32) {
if coefficient.is_sign_negative() {
coefficient = 0.0;
}
unsafe {
PxMaterial_setDynamicFriction_mut(self.as_mut_ptr(), coefficient);
}
}
#[inline]
fn get_dynamic_friction(&self) -> f32 {
unsafe { PxMaterial_getDynamicFriction(self.as_ptr()) }
}
#[inline]
fn set_static_friction(&mut self, mut coefficient: f32) {
if coefficient.is_sign_negative() {
coefficient = 0.0;
}
unsafe {
PxMaterial_setStaticFriction_mut(self.as_mut_ptr(), coefficient);
}
}
#[inline]
fn get_static_friction(&self) -> f32 {
unsafe { PxMaterial_getStaticFriction(self.as_ptr()) }
}
#[inline]
fn set_restitution(&mut self, mut restitution: f32) {
if restitution.is_sign_negative() {
restitution = 0.0;
} else if restitution > 1.0 {
restitution = 1.0
};
unsafe {
PxMaterial_setRestitution_mut(self.as_mut_ptr(), restitution);
}
}
#[inline]
fn get_restitution(&self) -> f32 {
unsafe { PxMaterial_getRestitution(self.as_ptr()) }
}
#[inline]
fn set_flag(&mut self, flag: MaterialFlag, set: bool) {
unsafe { PxMaterial_setFlag_mut(self.as_mut_ptr(), flag, set) }
}
#[inline]
fn set_flags(&mut self, flags: MaterialFlags) {
unsafe {
PxMaterial_setFlags_mut(self.as_mut_ptr(), flags);
}
}
#[inline]
fn get_flags(&self) -> MaterialFlags {
unsafe { PxMaterial_getFlags(self.as_ptr()) }
}
#[inline]
fn set_friction_combined_mode(&mut self, combine_mode: CombineMode) {
unsafe {
PxMaterial_setFrictionCombineMode_mut(self.as_mut_ptr(), combine_mode);
}
}
#[inline]
fn get_friction_combine_mode(&self) -> CombineMode {
unsafe { PxMaterial_getFrictionCombineMode(self.as_ptr()) }
}
#[inline]
fn set_restitution_combine_mode(&mut self, combine_mode: CombineMode) {
unsafe {
PxMaterial_setRestitutionCombineMode_mut(self.as_mut_ptr(), combine_mode);
}
}
#[inline]
fn get_restitution_combine_mode(&self) -> CombineMode {
unsafe { PxMaterial_getRestitutionCombineMode(self.as_ptr()) }
}
}