@@ -679,8 +679,14 @@ pub fn add_visibility_class<C>(
679
679
) where
680
680
C : ' static ,
681
681
{
682
- if let Some ( mut visibility_class) = world. get_mut :: < VisibilityClass > ( entity) {
683
- visibility_class. push ( TypeId :: of :: < C > ( ) ) ;
682
+ let Some ( mut visibility_class) = world. get_mut :: < VisibilityClass > ( entity) else {
683
+ // potentially warn in this case?
684
+ return ;
685
+ } ;
686
+
687
+ let type_id = TypeId :: of :: < C > ( ) ;
688
+ if !visibility_class. contains ( & type_id) {
689
+ visibility_class. push ( type_id) ;
684
690
}
685
691
}
686
692
@@ -988,4 +994,27 @@ mod test {
988
994
assert_eq ! ( 1 , size_of:: <Visibility >( ) ) ;
989
995
assert_eq ! ( 1 , size_of:: <Option <Visibility >>( ) ) ;
990
996
}
997
+
998
+ #[ derive( Component , Default , Clone , Reflect ) ]
999
+ #[ require( VisibilityClass ) ]
1000
+ #[ reflect( Component , Default , Clone ) ]
1001
+ #[ component( on_add = add_visibility_class:: <Self >) ]
1002
+ struct TestVisibilityClassHook ;
1003
+
1004
+ #[ test]
1005
+ fn test_add_visibility_class_hook ( ) {
1006
+ let mut world = World :: new ( ) ;
1007
+ let entity = world. spawn ( TestVisibilityClassHook ) . id ( ) ;
1008
+ let entity_clone = world. spawn_empty ( ) . id ( ) ;
1009
+ world
1010
+ . entity_mut ( entity)
1011
+ . clone_with_opt_out ( entity_clone, |_| { } ) ;
1012
+
1013
+ let entity_visibility_class = world. entity ( entity) . get :: < VisibilityClass > ( ) . unwrap ( ) ;
1014
+ assert_eq ! ( entity_visibility_class. len( ) , 1 ) ;
1015
+
1016
+ let entity_clone_visibility_class =
1017
+ world. entity ( entity_clone) . get :: < VisibilityClass > ( ) . unwrap ( ) ;
1018
+ assert_eq ! ( entity_clone_visibility_class. len( ) , 1 ) ;
1019
+ }
991
1020
}
0 commit comments