11use crate :: {
22 component:: Component ,
3- entity:: { Entity , EntityHashMap , MapEntities , SceneEntityMapper } ,
3+ entity:: { Entity , EntityHashMap , EntityMapper , MapEntities , MapEntitiesMut , SceneEntityMapper } ,
44 world:: World ,
55} ;
6- use bevy_reflect:: FromType ;
6+ use bevy_reflect:: { FromReflect , FromType , PartialReflect } ;
77
88/// For a specific type of component, this maps any fields with values of type [`Entity`] to a new world.
99///
@@ -15,6 +15,8 @@ use bevy_reflect::FromType;
1515pub struct ReflectMapEntities {
1616 map_all_world_entities : fn ( & mut World , & mut SceneEntityMapper ) ,
1717 map_world_entities : fn ( & mut World , & mut SceneEntityMapper , & [ Entity ] ) ,
18+ map_entities_mut : fn ( & mut dyn PartialReflect , & mut dyn FnMut ( & mut Entity ) ) ,
19+ map_entities : fn ( & dyn PartialReflect , & mut dyn FnMut ( Entity ) ) ,
1820}
1921
2022impl ReflectMapEntities {
@@ -51,15 +53,29 @@ impl ReflectMapEntities {
5153 ( self . map_world_entities ) ( world, mapper, entities) ;
5254 } ) ;
5355 }
56+
57+ pub fn map_entities ( & self , component : & dyn PartialReflect , f : & mut dyn FnMut ( Entity ) ) {
58+ ( self . map_entities ) ( component, f)
59+ }
60+
61+ pub fn map_entities_mut (
62+ & self ,
63+ component : & mut dyn PartialReflect ,
64+ f : & mut dyn FnMut ( & mut Entity ) ,
65+ ) {
66+ ( self . map_entities_mut ) ( component, f)
67+ }
5468}
5569
56- impl < C : Component + MapEntities > FromType < C > for ReflectMapEntities {
70+ impl < C : Component + FromReflect + MapEntitiesMut > FromType < C > for ReflectMapEntities {
5771 fn from_type ( ) -> Self {
5872 ReflectMapEntities {
5973 map_world_entities : |world, entity_mapper, entities| {
6074 for & entity in entities {
6175 if let Some ( mut component) = world. get_mut :: < C > ( entity) {
62- component. map_entities ( entity_mapper) ;
76+ component. map_entities_mut ( |entity| {
77+ * entity = entity_mapper. map_entity ( * entity) ;
78+ } ) ;
6379 }
6480 }
6581 } ,
@@ -71,10 +87,21 @@ impl<C: Component + MapEntities> FromType<C> for ReflectMapEntities {
7187 . collect :: < Vec < Entity > > ( ) ;
7288 for entity in & entities {
7389 if let Some ( mut component) = world. get_mut :: < C > ( * entity) {
74- component. map_entities ( entity_mapper) ;
90+ component. map_entities_mut ( |entity| {
91+ * entity = entity_mapper. map_entity ( * entity) ;
92+ } ) ;
7593 }
7694 }
7795 } ,
96+ map_entities : |component, f| {
97+ let concrete = C :: from_reflect ( component) . unwrap ( ) ;
98+ concrete. map_entities ( f) ;
99+ } ,
100+ map_entities_mut : |component, f| {
101+ let mut concrete = C :: from_reflect ( component) . unwrap ( ) ;
102+ concrete. map_entities_mut ( f) ;
103+ component. apply ( & concrete) ;
104+ } ,
78105 }
79106 }
80107}
@@ -99,12 +126,14 @@ impl ReflectMapEntitiesResource {
99126 }
100127}
101128
102- impl < R : crate :: system:: Resource + MapEntities > FromType < R > for ReflectMapEntitiesResource {
129+ impl < R : crate :: system:: Resource + MapEntitiesMut > FromType < R > for ReflectMapEntitiesResource {
103130 fn from_type ( ) -> Self {
104131 ReflectMapEntitiesResource {
105132 map_entities : |world, entity_mapper| {
106133 if let Some ( mut resource) = world. get_resource_mut :: < R > ( ) {
107- resource. map_entities ( entity_mapper) ;
134+ resource. map_entities_mut ( |entity| {
135+ * entity = entity_mapper. map_entity ( * entity) ;
136+ } ) ;
108137 }
109138 } ,
110139 }
0 commit comments