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.

257 line
9.7KB

  1. #if UNITY_ECS
  2. using System.Runtime.CompilerServices;
  3. using Svelto.DataStructures;
  4. using Svelto.DataStructures.Native;
  5. using Svelto.ECS.Internal;
  6. using Unity.Burst;
  7. using Unity.Collections;
  8. using Unity.Collections.LowLevel.Unsafe;
  9. using Unity.Entities;
  10. using Unity.Jobs;
  11. namespace Svelto.ECS.SveltoOnDOTS
  12. {
  13. public readonly struct DOTSOperationsForSvelto
  14. {
  15. internal unsafe DOTSOperationsForSvelto(EntityManager manager, JobHandle* jobHandle)
  16. {
  17. _EManager = manager;
  18. _jobHandle = jobHandle;
  19. }
  20. public EntityArchetype CreateArchetype(params ComponentType[] types)
  21. {
  22. return _EManager.CreateArchetype(types);
  23. }
  24. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  25. public void SetComponent<T>(Entity e, in T component)
  26. where T : unmanaged, IComponentData
  27. {
  28. _EManager.SetComponentData(e, component);
  29. }
  30. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  31. public void SetSharedComponent<T>(Entity e, in T component)
  32. where T : unmanaged, ISharedComponentData
  33. {
  34. _EManager.SetSharedComponent(e, component);
  35. }
  36. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  37. internal Entity CreateDOTSEntityFromSvelto(Entity prefabEntity, ExclusiveGroupStruct groupID, EntityReference reference)
  38. {
  39. Entity dotsEntity = _EManager.Instantiate(prefabEntity);
  40. //SharedComponentData can be used to group the DOTS ECS entities exactly like the Svelto ones
  41. _EManager.AddSharedComponent(dotsEntity, new DOTSSveltoGroupID(groupID));
  42. _EManager.AddComponent<DOTSSveltoReference>(dotsEntity);
  43. _EManager.SetComponentData(dotsEntity, new DOTSSveltoReference(reference));
  44. return dotsEntity;
  45. }
  46. /// <summary>
  47. /// This method assumes that the Svelto entity with EGID egid has also dotsEntityComponent
  48. /// among the descriptors
  49. /// </summary>
  50. /// <param name="archetype"></param>
  51. /// <param name="egid"></param>
  52. /// <returns></returns>
  53. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  54. internal Entity CreateDOTSEntityFromSvelto(EntityArchetype archetype, ExclusiveGroupStruct groupID, EntityReference reference)
  55. {
  56. Entity dotsEntity = _EManager.CreateEntity(archetype);
  57. //SharedComponentData can be used to group the DOTS ECS entities exactly like the Svelto ones
  58. _EManager.AddSharedComponent(dotsEntity, new DOTSSveltoGroupID(groupID));
  59. _EManager.AddComponent<DOTSSveltoReference>(dotsEntity);
  60. _EManager.SetComponentData(dotsEntity, new DOTSSveltoReference(reference));
  61. return dotsEntity;
  62. }
  63. /// <summary>
  64. /// in this case the user decided to create a DOTS entity that is self managed and not managed
  65. /// by the framework
  66. /// </summary>
  67. /// <param name="archetype"></param>
  68. /// <param name="wireEgid"></param>
  69. /// <returns></returns>
  70. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  71. internal Entity CreateDOTSEntity(EntityArchetype archetype)
  72. {
  73. return _EManager.CreateEntity(archetype);
  74. }
  75. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  76. public void DestroyEntity(Entity e)
  77. {
  78. _EManager.DestroyEntity(e);
  79. }
  80. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  81. public void RemoveComponent<T>(Entity dotsEntity)
  82. {
  83. _EManager.RemoveComponent<T>(dotsEntity);
  84. }
  85. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  86. public void AddComponent<T>(Entity dotsEntity)
  87. where T : unmanaged, IComponentData
  88. {
  89. _EManager.AddComponent<T>(dotsEntity);
  90. }
  91. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  92. public void AddComponent<T>(Entity dotsEntity, in T component)
  93. where T : unmanaged, IComponentData
  94. {
  95. _EManager.AddComponent<T>(dotsEntity);
  96. _EManager.SetComponentData(dotsEntity, component);
  97. }
  98. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  99. public void AddSharedComponent<T>(Entity dotsEntity, in T component)
  100. where T : unmanaged, ISharedComponentData
  101. {
  102. _EManager.AddSharedComponent(dotsEntity, component);
  103. }
  104. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  105. public void AddBuffer<T>(Entity dotsEntity)
  106. where T : unmanaged, IBufferElementData
  107. {
  108. _EManager.AddBuffer<T>(dotsEntity);
  109. }
  110. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  111. public void SetSharedComponentBatched<SharedComponentData>(NativeArray<Entity> nativeArray, SharedComponentData SCD)
  112. where SharedComponentData : unmanaged, ISharedComponentData
  113. {
  114. _EManager.SetSharedComponent(nativeArray, SCD);
  115. }
  116. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  117. public void AddComponentBatched<T>(NativeArray<Entity> DOTSEntities)
  118. {
  119. _EManager.AddComponent<T>(DOTSEntities);
  120. }
  121. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  122. public NativeArray<Entity> CreateDOTSEntityFromSveltoBatched(Entity prefab, (uint rangeStart, uint rangeEnd) range,
  123. ExclusiveGroupStruct groupID, NB<DOTSEntityComponent> DOSTEntityComponents)
  124. {
  125. unsafe
  126. {
  127. _jobHandle->Complete();
  128. var count = (int)(range.rangeEnd - range.rangeStart);
  129. var nativeArray = _EManager.Instantiate(prefab, count, _EManager.World.UpdateAllocator.ToAllocator);
  130. _EManager.AddSharedComponent(nativeArray, new DOTSSveltoGroupID(groupID));
  131. var setDOTSEntityComponentsJob = new SetDOTSEntityComponents
  132. {
  133. sveltoStartIndex = range.rangeStart,
  134. createdEntities = nativeArray,
  135. DOSTEntityComponents = DOSTEntityComponents
  136. };
  137. *_jobHandle = JobHandle.CombineDependencies(*_jobHandle, setDOTSEntityComponentsJob.ScheduleParallel(count, default));
  138. return nativeArray;
  139. }
  140. }
  141. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  142. public NativeArray<Entity> CreateDOTSEntityFromSveltoBatched(Entity prefab, (uint rangeStart, uint rangeEnd) range,
  143. ExclusiveGroupStruct groupID, NB<DOTSEntityComponent> DOSTEntityComponents,
  144. SharedSveltoDictionaryNative<uint, EntityReference> referenceMap, NativeEntityIDs sveltoIds, out JobHandle creationJob)
  145. {
  146. var nativeArray = CreateDOTSEntityFromSveltoBatched(prefab, range, groupID, DOSTEntityComponents);
  147. unsafe
  148. {
  149. var count = (int)(range.rangeEnd - range.rangeStart);
  150. _EManager.AddComponent<DOTSSveltoReference>(nativeArray);
  151. var SetDOTSSveltoReferenceJob = new SetDOTSSveltoReference
  152. {
  153. sveltoStartIndex = range.rangeStart,
  154. createdEntities = nativeArray,
  155. entityManager = _EManager,
  156. ids = sveltoIds,
  157. entityReferenceMap = referenceMap,
  158. };
  159. creationJob = *_jobHandle = JobHandle.CombineDependencies(*_jobHandle, SetDOTSSveltoReferenceJob.ScheduleParallel(count, default));
  160. return nativeArray;
  161. }
  162. }
  163. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  164. public void AddJobToComplete(JobHandle jobHandle)
  165. {
  166. unsafe
  167. {
  168. *_jobHandle = JobHandle.CombineDependencies(*_jobHandle, jobHandle);
  169. }
  170. }
  171. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  172. public void DestroyEntitiesBatched(NativeArray<Entity> nativeArray)
  173. {
  174. _EManager.DestroyEntity(nativeArray);
  175. }
  176. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  177. public void Complete()
  178. {
  179. unsafe
  180. {
  181. _jobHandle->Complete();
  182. }
  183. }
  184. [BurstCompile]
  185. struct SetDOTSEntityComponents: IJobParallelFor
  186. {
  187. public uint sveltoStartIndex;
  188. [ReadOnly] public NativeArray<Entity> createdEntities;
  189. public NB<DOTSEntityComponent> DOSTEntityComponents;
  190. public void Execute(int currentIndex)
  191. {
  192. int index = (int)(sveltoStartIndex + currentIndex);
  193. var dotsEntity = createdEntities[currentIndex];
  194. DOSTEntityComponents[index].dotsEntity = dotsEntity;
  195. }
  196. }
  197. [BurstCompile]
  198. public struct SetDOTSSveltoReference: IJobParallelFor
  199. {
  200. public uint sveltoStartIndex;
  201. [ReadOnly] public NativeArray<Entity> createdEntities;
  202. [NativeDisableParallelForRestriction] public EntityManager entityManager;
  203. public NativeEntityIDs ids;
  204. public SharedSveltoDictionaryNative<uint, EntityReference> entityReferenceMap;
  205. public void Execute(int currentIndex)
  206. {
  207. int index = (int)(sveltoStartIndex + currentIndex);
  208. var dotsEntity = createdEntities[currentIndex];
  209. entityManager.SetComponentData(
  210. dotsEntity, new DOTSSveltoReference
  211. {
  212. entityReference = entityReferenceMap[ids[index]]
  213. });
  214. }
  215. }
  216. readonly EntityManager _EManager;
  217. [NativeDisableUnsafePtrRestriction] readonly unsafe JobHandle* _jobHandle;
  218. }
  219. }
  220. #endif