Compare commits

...

2 Commits

Author SHA1 Message Date
andriyDev
9c7dfb5c76 Replace FromGltfRef trait with From<Entity>.
The fewer traits the better. This does add a little bit of a weirdness where it's unclear that some components should implement this, however in those cases, users can always fallback to manually dealing with GltfRefMap.
2024-05-31 15:32:39 -07:00
andriyDev
1758f8dbff Fix required bounds for GltfRefPlugin. 2024-05-31 15:24:29 -07:00

View File

@ -91,13 +91,16 @@ impl GltfRefMap {
#[derive(Component, Reflect)] #[derive(Component, Reflect)]
#[reflect(Component)] #[reflect(Component)]
struct GltfRef<T: Component + FromGltfRef> { struct GltfRef<T: Component> {
target: String, target: String,
#[reflect(ignore)] #[reflect(ignore)]
_marker: PhantomData<T>, _marker: PhantomData<T>,
} }
impl<T: Component + FromGltfRef> GltfRef<T> { impl<T: Component> GltfRef<T>
where
Entity: Into<T>,
{
fn system( fn system(
refs: Query<(Entity, &Self)>, refs: Query<(Entity, &Self)>,
gltf_for_entity: GltfForEntity, gltf_for_entity: GltfForEntity,
@ -113,7 +116,7 @@ impl<T: Component + FromGltfRef> GltfRef<T> {
match ref_map.get_ref(gltf_root, &gltf_ref.target) { match ref_map.get_ref(gltf_root, &gltf_ref.target) {
Some(target) => { Some(target) => {
commands.entity(entity).insert(T::from_ref(target)); commands.entity(entity).insert(Into::<T>::into(target));
} }
None => { None => {
warn!( warn!(
@ -126,17 +129,14 @@ impl<T: Component + FromGltfRef> GltfRef<T> {
} }
} }
/// Trait for creating a component for a Gltf reference.
pub trait FromGltfRef {
/// Creates `Self` given the `entity` for this reference.
fn from_ref(entity: Entity) -> Self;
}
/// Plugin for automatically converting [`GltfRef`]s into their corresponding /// Plugin for automatically converting [`GltfRef`]s into their corresponding
/// `T`. /// `T`.
pub struct GltfRefPlugin<T: Component + FromGltfRef>(PhantomData<T>); pub struct GltfRefPlugin<T: Component + TypePath>(PhantomData<T>);
impl<T: Component + FromGltfRef + Reflect + TypePath> Plugin for GltfRefPlugin<T> { impl<T: Component + TypePath> Plugin for GltfRefPlugin<T>
where
Entity: Into<T>,
{
fn build(&self, app: &mut App) { fn build(&self, app: &mut App) {
app.register_type::<GltfRef<T>>().add_systems( app.register_type::<GltfRef<T>>().add_systems(
Update, Update,
@ -147,7 +147,10 @@ impl<T: Component + FromGltfRef + Reflect + TypePath> Plugin for GltfRefPlugin<T
// Manual implementation of Default for GltfRefPlugin to avoid `Default` trait // Manual implementation of Default for GltfRefPlugin to avoid `Default` trait
// bounds on `T`. // bounds on `T`.
impl<T: Component + FromGltfRef> Default for GltfRefPlugin<T> { impl<T: Component + TypePath> Default for GltfRefPlugin<T>
where
Entity: Into<T>,
{
fn default() -> Self { fn default() -> Self {
Self(Default::default()) Self(Default::default())
} }