Skip to content

Commit 6960710

Browse files
Guard against VisibilityClass duplicates
Co-authored-by: Dimitrios Loukadakis <[email protected]>
1 parent 1dfcde6 commit 6960710

File tree

1 file changed

+31
-2
lines changed
  • crates/bevy_camera/src/visibility

1 file changed

+31
-2
lines changed

crates/bevy_camera/src/visibility/mod.rs

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -679,8 +679,14 @@ pub fn add_visibility_class<C>(
679679
) where
680680
C: 'static,
681681
{
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);
684690
}
685691
}
686692

@@ -988,4 +994,27 @@ mod test {
988994
assert_eq!(1, size_of::<Visibility>());
989995
assert_eq!(1, size_of::<Option<Visibility>>());
990996
}
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+
}
9911020
}

0 commit comments

Comments
 (0)