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.

99 lines
3.4KB

  1. using System;
  2. using Svelto.ECS.Internal;
  3. namespace Svelto.ECS
  4. {
  5. public interface IEntityViewBuilder
  6. {
  7. void BuildEntityViewAndAddToList(ref ITypeSafeList list, int entityID, out IEntityView entityView);
  8. ITypeSafeList Preallocate(ref ITypeSafeList list, int size);
  9. Type GetEntityViewType();
  10. void MoveEntityView(int entityID, ITypeSafeList fromSafeList, ITypeSafeList toSafeList);
  11. }
  12. public class EntityViewBuilder<EntityViewType> : IEntityViewBuilder where EntityViewType : EntityView, new()
  13. {
  14. public void BuildEntityViewAndAddToList(ref ITypeSafeList list, int entityID, out IEntityView entityView)
  15. {
  16. if (list == null)
  17. list = new TypeSafeFasterListForECSForClasses<EntityViewType>();
  18. var castedList = list as TypeSafeFasterListForECSForClasses<EntityViewType>;
  19. var lentityView = EntityView<EntityViewType>.BuildEntityView(entityID);
  20. castedList.Add(lentityView);
  21. entityView = lentityView;
  22. }
  23. public ITypeSafeList Preallocate(ref ITypeSafeList list, int size)
  24. {
  25. if (list == null)
  26. list = new TypeSafeFasterListForECSForClasses<EntityViewType>(size);
  27. else
  28. list.ReserveCapacity(size);
  29. return list;
  30. }
  31. public Type GetEntityViewType()
  32. {
  33. return _entityViewType;
  34. }
  35. public void MoveEntityView(int entityID, ITypeSafeList fromSafeList, ITypeSafeList toSafeList)
  36. {
  37. var fromCastedList = fromSafeList as TypeSafeFasterListForECSForClasses<EntityViewType>;
  38. var toCastedList = toSafeList as TypeSafeFasterListForECSForClasses<EntityViewType>;
  39. toCastedList.Add(fromCastedList[fromCastedList.GetIndexFromID(entityID)]);
  40. }
  41. readonly Type _entityViewType = typeof(EntityViewType);
  42. }
  43. public class EntityStructBuilder<EntityViewType> : IEntityViewBuilder where EntityViewType : struct, IEntityStruct
  44. {
  45. public void BuildEntityViewAndAddToList(ref ITypeSafeList list, int entityID, out IEntityView entityView)
  46. {
  47. var lentityView = default(EntityViewType);
  48. lentityView.ID = entityID;
  49. if (list == null)
  50. list = new TypeSafeFasterListForECSForStructs<EntityViewType>();
  51. var castedList = list as TypeSafeFasterListForECSForStructs<EntityViewType>;
  52. castedList.Add(lentityView);
  53. entityView = null;
  54. }
  55. public ITypeSafeList Preallocate(ref ITypeSafeList list, int size)
  56. {
  57. if (list == null)
  58. list = new TypeSafeFasterListForECSForStructs<EntityViewType>(size);
  59. else
  60. list.ReserveCapacity(size);
  61. return list;
  62. }
  63. public Type GetEntityViewType()
  64. {
  65. return _entityViewType;
  66. }
  67. public void MoveEntityView(int entityID, ITypeSafeList fromSafeList, ITypeSafeList toSafeList)
  68. {
  69. var fromCastedList = fromSafeList as TypeSafeFasterListForECSForStructs<EntityViewType>;
  70. var toCastedList = toSafeList as TypeSafeFasterListForECSForStructs<EntityViewType>;
  71. toCastedList.Add(fromCastedList[fromCastedList.GetIndexFromID(entityID)]);
  72. }
  73. readonly Type _entityViewType = typeof(EntityViewType);
  74. }
  75. }