diff --git a/sources/engine/Xenko.Physics/Engine/PhysicsComponent.cs b/sources/engine/Xenko.Physics/Engine/PhysicsComponent.cs index 6ba1789431..234b0dc95c 100644 --- a/sources/engine/Xenko.Physics/Engine/PhysicsComponent.cs +++ b/sources/engine/Xenko.Physics/Engine/PhysicsComponent.cs @@ -42,11 +42,7 @@ protected PhysicsComponent() { CanScaleShape = true; - ColliderShapes = new TrackingCollection(); - ColliderShapes.CollectionChanged += (sender, args) => - { - ColliderShapeChanged = true; - }; + ColliderShapes = new ColliderShapeCollection(this); NewPairChannel = new Channel { Preference = ChannelPreference.PreferSender }; PairEndedChannel = new Channel { Preference = ChannelPreference.PreferSender }; @@ -61,7 +57,7 @@ protected PhysicsComponent() [DataMember(200)] [Category] [MemberCollection(NotNullItems = true)] - public TrackingCollection ColliderShapes { get; } + public ColliderShapeCollection ColliderShapes { get; } /// /// Gets or sets the collision group. @@ -816,5 +812,44 @@ public bool IsIgnoringCollisionWith(PhysicsComponent other) { return ! NativeCollisionObject.CheckCollideWith(other.NativeCollisionObject); } + + [DataContract] + public class ColliderShapeCollection : FastCollection + { + PhysicsComponent component; + + public ColliderShapeCollection(PhysicsComponent componentParam) + { + component = componentParam; + } + + /// + protected override void InsertItem(int index, IInlineColliderShapeDesc item) + { + base.InsertItem(index, item); + component.ColliderShapeChanged = true; + } + + /// + protected override void RemoveItem(int index) + { + base.RemoveItem(index); + component.ColliderShapeChanged = true; + } + + /// + protected override void ClearItems() + { + base.ClearItems(); + component.ColliderShapeChanged = true; + } + + /// + protected override void SetItem(int index, IInlineColliderShapeDesc item) + { + base.SetItem(index, item); + component.ColliderShapeChanged = true; + } + } } }