50 lines
1.6 KiB
Rust
50 lines
1.6 KiB
Rust
|
use std::{any::TypeId, cell::{Ref, RefMut}, ptr::NonNull};
|
||
|
|
||
|
use lyra_ecs::{World, ResourceObject};
|
||
|
|
||
|
use crate::{Reflect, FromType};
|
||
|
|
||
|
#[derive(Clone)]
|
||
|
pub struct ReflectedResource {
|
||
|
pub type_id: TypeId,
|
||
|
|
||
|
fn_reflect: for<'a> fn (world: &'a World) -> Option<Ref<'a, dyn Reflect>>,
|
||
|
fn_reflect_mut: for<'a> fn (world: &'a mut World) -> Option<RefMut<'a, dyn Reflect>>,
|
||
|
fn_reflect_ptr: fn (world: &mut World) -> Option<NonNull<u8>>,
|
||
|
}
|
||
|
|
||
|
impl ReflectedResource {
|
||
|
/// Retrieves the reflected resource from the world.
|
||
|
pub fn reflect<'a>(&self, world: &'a World) -> Option<Ref<'a, dyn Reflect>> {
|
||
|
(self.fn_reflect)(world)
|
||
|
}
|
||
|
|
||
|
/// Retrieves a mutable reflected resource from the world.
|
||
|
pub fn reflect_mut<'a>(&self, world: &'a mut World) -> Option<RefMut<'a, dyn Reflect>> {
|
||
|
(self.fn_reflect_mut)(world)
|
||
|
}
|
||
|
|
||
|
pub fn reflect_ptr(&self, world: &mut World) -> Option<NonNull<u8>> {
|
||
|
(self.fn_reflect_ptr)(world)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
impl<T: ResourceObject + Reflect> FromType<T> for ReflectedResource {
|
||
|
fn from_type() -> Self {
|
||
|
Self {
|
||
|
type_id: TypeId::of::<T>(),
|
||
|
fn_reflect: |world: &World| {
|
||
|
world.try_get_resource::<T>()
|
||
|
.map(|r| r as Ref<dyn Reflect>)
|
||
|
},
|
||
|
fn_reflect_mut: |world: &mut World| {
|
||
|
world.try_get_resource_mut::<T>()
|
||
|
.map(|r| r as RefMut<dyn Reflect>)
|
||
|
},
|
||
|
fn_reflect_ptr: |world: &mut World| unsafe {
|
||
|
world.try_get_resource_ptr::<T>()
|
||
|
.map(|ptr| ptr.cast::<u8>())
|
||
|
},
|
||
|
}
|
||
|
}
|
||
|
}
|