bevy_scene: Use FromReflect on extracted resources (#15753)
# Objective Fixes #15726 The extraction logic for components makes use of `FromReflect` to try and ensure we have a concrete type for serialization. However, we did not do the same for resources. The reason we're seeing this for the glam types is that #15174 also made a change to rely on the glam type's `Serialize` and `Deserialize` impls, which I don't think should have been merged (I'll put up a PR addressing this specifically soon). ## Solution Use `FromReflect` on extracted resources. ## Testing You can test locally by running: ``` cargo test --package bevy_scene ```
This commit is contained in:
parent
bc352561c9
commit
05b0f28ebf
@ -365,12 +365,19 @@ impl<'w> DynamicSceneBuilder<'w> {
|
|||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
let resource = type_registry
|
let type_registration = type_registry.get(type_id)?;
|
||||||
.get(type_id)?
|
|
||||||
|
let resource = type_registration
|
||||||
.data::<ReflectResource>()?
|
.data::<ReflectResource>()?
|
||||||
.reflect(self.original_world)?;
|
.reflect(self.original_world)?;
|
||||||
self.extracted_resources
|
|
||||||
.insert(component_id, resource.clone_value());
|
let resource = type_registration
|
||||||
|
.data::<ReflectFromReflect>()
|
||||||
|
.and_then(|fr| fr.from_reflect(resource.as_partial_reflect()))
|
||||||
|
.map(PartialReflect::into_partial_reflect)
|
||||||
|
.unwrap_or_else(|| resource.clone_value());
|
||||||
|
|
||||||
|
self.extracted_resources.insert(component_id, resource);
|
||||||
Some(())
|
Some(())
|
||||||
};
|
};
|
||||||
extract_and_push();
|
extract_and_push();
|
||||||
@ -688,4 +695,39 @@ mod tests {
|
|||||||
assert_eq!(scene.resources.len(), 1);
|
assert_eq!(scene.resources.len(), 1);
|
||||||
assert!(scene.resources[0].represents::<ResourceB>());
|
assert!(scene.resources[0].represents::<ResourceB>());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn should_use_from_reflect() {
|
||||||
|
#[derive(Resource, Component, Reflect)]
|
||||||
|
#[reflect(Resource, Component)]
|
||||||
|
struct SomeType(i32);
|
||||||
|
|
||||||
|
let mut world = World::default();
|
||||||
|
let atr = AppTypeRegistry::default();
|
||||||
|
{
|
||||||
|
let mut register = atr.write();
|
||||||
|
register.register::<SomeType>();
|
||||||
|
}
|
||||||
|
world.insert_resource(atr);
|
||||||
|
|
||||||
|
world.insert_resource(SomeType(123));
|
||||||
|
let entity = world.spawn(SomeType(123)).id();
|
||||||
|
|
||||||
|
let scene = DynamicSceneBuilder::from_world(&world)
|
||||||
|
.extract_resources()
|
||||||
|
.extract_entities(vec![entity].into_iter())
|
||||||
|
.build();
|
||||||
|
|
||||||
|
let component = &scene.entities[0].components[0];
|
||||||
|
assert!(component
|
||||||
|
.try_as_reflect()
|
||||||
|
.expect("component should be concrete due to `FromReflect`")
|
||||||
|
.is::<SomeType>());
|
||||||
|
|
||||||
|
let resource = &scene.resources[0];
|
||||||
|
assert!(resource
|
||||||
|
.try_as_reflect()
|
||||||
|
.expect("resource should be concrete due to `FromReflect`")
|
||||||
|
.is::<SomeType>());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user