|
|
|
|
using System;
|
|
|
|
|
using Unity.Collections;
|
|
|
|
|
using Unity.Mathematics;
|
|
|
|
|
|
|
|
|
|
namespace GameCore.TinyECS
|
|
|
|
|
{
|
|
|
|
|
public struct EntityDatabase<TEnum, TData> : IDisposable
|
|
|
|
|
where TEnum : unmanaged, IConvertible
|
|
|
|
|
where TData : unmanaged, IEntityDataStruct
|
|
|
|
|
{
|
|
|
|
|
public TData dataStruct;
|
|
|
|
|
public EntityGenerator<TEnum> generator;
|
|
|
|
|
public EntityCollection<TEnum> collection;
|
|
|
|
|
|
|
|
|
|
public int Count => collection.Count;
|
|
|
|
|
|
|
|
|
|
internal EntityDatabase(TEnum type, TData dataStruct, int initCapacity,
|
|
|
|
|
AllocatorManager.AllocatorHandle allocator)
|
|
|
|
|
{
|
|
|
|
|
generator = new(type, initCapacity, allocator);
|
|
|
|
|
collection = new(type, initCapacity, allocator);
|
|
|
|
|
this.dataStruct = dataStruct;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public Entity<TEnum> AddEntity()
|
|
|
|
|
{
|
|
|
|
|
var entity = generator.Create();
|
|
|
|
|
collection.Add(entity);
|
|
|
|
|
dataStruct.Add();
|
|
|
|
|
return entity;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void RemoveEntity(Entity<TEnum> entity)
|
|
|
|
|
{
|
|
|
|
|
generator.Delete(entity);
|
|
|
|
|
if (collection.Remove(entity, out var index, out var _))
|
|
|
|
|
dataStruct.Remove(index);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public T GetData<T>(Entity<TEnum> entity) where T : unmanaged
|
|
|
|
|
{
|
|
|
|
|
var index = collection.GetIndex(entity);
|
|
|
|
|
return dataStruct.GetData<T>(index);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public ref T GetDataRef<T>(Entity<TEnum> entity) where T : unmanaged
|
|
|
|
|
{
|
|
|
|
|
var index = collection.GetIndex(entity);
|
|
|
|
|
return ref dataStruct.GetDataRef<T>(index);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void Dispose()
|
|
|
|
|
{
|
|
|
|
|
generator.Dispose();
|
|
|
|
|
collection.Dispose();
|
|
|
|
|
dataStruct.Dispose();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static class EntityDataBaseExtensions
|
|
|
|
|
{
|
|
|
|
|
public static EntityDatabase<TEnum, TData> CreateEntityDatabase<TEnum, TData>(this TData dataStruct, TEnum type, int initCapacity)
|
|
|
|
|
where TEnum : unmanaged, IConvertible
|
|
|
|
|
where TData : unmanaged, IEntityDataStruct
|
|
|
|
|
{
|
|
|
|
|
return new EntityDatabase<TEnum, TData>(type, dataStruct, initCapacity, dataStruct.Allocator);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|