Mirror of Svelto.ECS because we're a fan of it
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

55 lines
1.9KB

  1. using System;
  2. using Svelto.DataStructures;
  3. namespace Svelto.ECS
  4. {
  5. public interface IEntityDescriptor
  6. {
  7. IEntityBuilder[] entitiesToBuild { get; }
  8. }
  9. public class EntityDescriptor : IEntityDescriptor
  10. {
  11. protected EntityDescriptor(IEntityBuilder[] entityToBuild)
  12. {
  13. this.entitiesToBuild = entityToBuild;
  14. }
  15. public IEntityBuilder[] entitiesToBuild { get; private set; }
  16. }
  17. public static class EntityDescriptorTemplate<TType> where TType : IEntityDescriptor, new()
  18. {
  19. public static readonly StaticEntityDescriptorInfo<TType> descriptor = new StaticEntityDescriptorInfo<TType>(new TType());
  20. }
  21. public struct DynamicEntityDescriptorInfo<TType>:IEntityDescriptor where TType : IEntityDescriptor, new()
  22. {
  23. public DynamicEntityDescriptorInfo(FasterList<IEntityBuilder> extraEntityViews) : this()
  24. {
  25. DBC.ECS.Check.Require(extraEntityViews.Count > 0,
  26. "don't use a DynamicEntityDescriptorInfo if you don't need to use extra EntityViews");
  27. var defaultEntityViewsToBuild = EntityDescriptorTemplate<TType>.descriptor.entitiesToBuild;
  28. var length = defaultEntityViewsToBuild.Length;
  29. entitiesToBuild = new IEntityBuilder[length + extraEntityViews.Count];
  30. Array.Copy(defaultEntityViewsToBuild, 0, entitiesToBuild, 0, length);
  31. Array.Copy(extraEntityViews.ToArrayFast(), 0, entitiesToBuild, length, extraEntityViews.Count);
  32. }
  33. public IEntityBuilder[] entitiesToBuild { get; private set; }
  34. }
  35. public struct StaticEntityDescriptorInfo<TType>: IEntityDescriptor where TType : IEntityDescriptor
  36. {
  37. internal StaticEntityDescriptorInfo(TType descriptor) : this()
  38. {
  39. entitiesToBuild = descriptor.entitiesToBuild;
  40. }
  41. public IEntityBuilder[] entitiesToBuild { get; private set; }
  42. }
  43. }