Oh my…
After DAYS of looking for solution I found your post and it works !!!
For everyone that is interested this is a complete solution I came with using a Request Component that can be added to any entity and a Job System who will apply it:
using Unity.Burst;
using Unity.Collections;
using Unity.Entities;
using Unity.Jobs;
using Unity.Physics;
using Unity.Physics.Extensions;
public struct RequestPhysicCollisionFilterUpdate : IComponentData
{
public uint BelongsTo;
public uint CollidesWith;
public int GroupIndex;
}
[BurstCompile]
public partial struct ApplyPhysicCollisionFilterUpdateSystem : ISystem
{
[BurstCompile]
public void OnUpdate(ref SystemState state)
{
var ecb = new EntityCommandBuffer(Allocator.TempJob);
var job = new ApplyPhysicCollisionFilterUpdateJob
{
ECB = ecb.AsParallelWriter()
};
state.Dependency = job.ScheduleParallel(state.Dependency);
state.Dependency.Complete();
ecb.Playback(state.EntityManager);
ecb.Dispose();
}
[BurstCompile]
private partial struct ApplyPhysicCollisionFilterUpdateJob : IJobEntity
{
public EntityCommandBuffer.ParallelWriter ECB;
public void Execute(Entity entity, [EntityIndexInQuery] int entityIndex, ref PhysicsCollider physicsCollider, in RequestPhysicCollisionFilterUpdate request)
{
var colliderCopy = physicsCollider.Value.Value.Clone();
colliderCopy.Value.SetCollisionFilter(new CollisionFilter
{
BelongsTo = request.BelongsTo,
CollidesWith = request.CollidesWith,
GroupIndex = request.GroupIndex,
});
PhysicsCollider newCollider = colliderCopy.AsComponent();
ECB.SetComponent(entityIndex, entity, newCollider);
ECB.RemoveComponent<RequestPhysicCollisionFilterUpdate>(entityIndex, entity);
}
}
}