use std::ops::Deref;
use ambient_std::asset_cache::Asset;
use physxx::PxReferenceCounted;
#[derive(Clone)]
pub struct PxRcAsset<T: PxReferenceCounted>(pub T);
impl<T: PxReferenceCounted> Deref for PxRcAsset<T> {
type Target = T;
fn deref(&self) -> &Self::Target {
&self.0
}
}
#[derive(Clone)]
pub struct PxRcAssetWeak<T: PxReferenceCounted>(pub T);
impl<T: PxReferenceCounted + Sync + Send + Clone> Asset for PxRcAsset<T> {
type WeakType = PxRcAssetWeak<T>;
fn to_weak(strong: &Self) -> Self::WeakType {
PxRcAssetWeak(strong.0.clone())
}
fn from_weak(weak: &Self::WeakType) -> Option<Self>
where
Self: Sized,
{
if weak.0.get_reference_count() > 2 {
Some(PxRcAsset(weak.0.clone()))
} else {
None
}
}
}