using System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.Runtime.Remoting; using BITKit; using BITKit.Entities; using Microsoft.Extensions.DependencyInjection; using Unity.Collections; using Unity.Jobs; using Unity.Mathematics; using UnityEngine; using UnityEngine.Jobs; namespace Net.BITKit.Quadtree { public abstract class QuadTreeService { public static HashSet Instances = new(); public readonly Quadtree Quadtree = new(default,new float2(2048,2048)); } public class QuadTreeService:QuadTreeService,IDisposable where T : class { private readonly IEntitiesService _entitiesService; private readonly Dictionary _transforms = new(); private readonly ITicker _ticker; public QuadTreeService(IEntitiesService entitiesService, ITicker ticker) { _entitiesService = entitiesService; _ticker = ticker; _entitiesService.OnAdd += OnAdd; _entitiesService.OnRemove += OnRemove; foreach (var (entity,t) in _entitiesService.QueryComponents()) { OnAdd(entity,t); } _ticker.Add(OnTick); Instances.Add(this); } private void OnTick(float obj) { foreach (var (id, transform) in _transforms) { Quadtree.Remove(id); Quadtree.Insert(id, ((float3)transform.position).xz); } } private void OnRemove(IEntity obj) { _transforms.TryRemove(obj.Id); Quadtree.Remove(obj.Id); } private void OnAdd(IEntity obj) { if (obj.ServiceProvider.GetService() is { } t) { OnAdd(obj,t); } } private void OnAdd(IEntity entity, T t) { _transforms.TryAdd(entity.Id, entity.ServiceProvider.GetRequiredService()); } public void Dispose() { _entitiesService.OnAdd -= OnAdd; _entitiesService.OnRemove -= OnRemove; _ticker.Remove(OnTick); Instances.Remove(this); } } }