|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304 |
- #if UNITY_ECS
- using System.Runtime.CompilerServices;
- using Svelto.DataStructures;
- using Svelto.ECS.Internal;
- using Unity.Burst;
- using Unity.Collections;
- using Unity.Collections.LowLevel.Unsafe;
- using Unity.Entities;
- using Unity.Jobs;
-
- namespace Svelto.ECS.SveltoOnDOTS
- {
- public readonly struct DOTSOperationsForSvelto
- {
- internal unsafe DOTSOperationsForSvelto(EntityManager manager, JobHandle* jobHandle)
- {
- _EManager = manager;
- _jobHandle = jobHandle;
- }
-
- public EntityArchetype CreateArchetype(params ComponentType[] types)
- {
- return _EManager.CreateArchetype(types);
- }
-
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public void SetComponent<T>(Entity e, in T component)
- where T : unmanaged, IComponentData
- {
- _EManager.SetComponentData(e, component);
- }
-
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public void SetSharedComponent<T>(Entity e, in T component)
- where T : unmanaged, ISharedComponentData
- {
- #if UNITY_ECS_100
- _EManager.SetSharedComponent(e, component);
- #else
- _EManager.SetSharedComponentData(e, component);
- #endif
- }
-
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public Entity CreateDOTSEntityOnSvelto(Entity prefabEntity, EGID egid)
- {
- Entity dotsEntity = _EManager.Instantiate(prefabEntity);
-
- //SharedComponentData can be used to group the DOTS ECS entities exactly like the Svelto ones
- #if UNITY_ECS_100
- _EManager.AddSharedComponent(dotsEntity, new DOTSSveltoGroupID(egid.groupID));
- #else
- _EManager.AddSharedComponentData(dotsEntity, new DOTSSveltoGroupID(egid.groupID));
- #endif
- _EManager.AddComponent<DOTSSveltoEGID>(dotsEntity);
- _EManager.SetComponentData(dotsEntity, new DOTSSveltoEGID(egid));
-
- return dotsEntity;
- }
-
- /// <summary>
- /// This method assumes that the Svelto entity with EGID egid has also dotsEntityComponent
- /// among the descriptors
- /// </summary>
- /// <param name="archetype"></param>
- /// <param name="egid"></param>
- /// <returns></returns>
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public Entity CreateDOTSEntityOnSvelto(EntityArchetype archetype, EGID egid)
- {
- Entity dotsEntity = _EManager.CreateEntity(archetype);
-
- //SharedComponentData can be used to group the DOTS ECS entities exactly like the Svelto ones
- #if UNITY_ECS_100
- _EManager.AddSharedComponent(dotsEntity, new DOTSSveltoGroupID(egid.groupID));
- #else
- _EManager.AddSharedComponentData(dotsEntity, new DOTSSveltoGroupID(egid.groupID));
- #endif
- _EManager.AddComponent<DOTSSveltoEGID>(dotsEntity);
- _EManager.SetComponentData(dotsEntity, new DOTSSveltoEGID(egid));
-
- return dotsEntity;
- }
-
- /// <summary>
- /// in this case the user decided to create a DOTS entity that is self managed and not managed
- /// by the framework
- /// </summary>
- /// <param name="archetype"></param>
- /// <param name="wireEgid"></param>
- /// <returns></returns>
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public Entity CreateDOTSEntity(EntityArchetype archetype)
- {
- return _EManager.CreateEntity(archetype);
- }
-
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public void DestroyEntity(Entity e)
- {
- _EManager.DestroyEntity(e);
- }
-
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public void RemoveComponent<T>(Entity dotsEntity)
- {
- _EManager.RemoveComponent<T>(dotsEntity);
- }
-
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public void AddComponent<T>(Entity dotsEntity)
- where T : unmanaged, IComponentData
- {
- _EManager.AddComponent<T>(dotsEntity);
- }
-
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public void AddComponent<T>(Entity dotsEntity, in T component)
- where T : unmanaged, IComponentData
- {
- _EManager.AddComponent<T>(dotsEntity);
- _EManager.SetComponentData(dotsEntity, component);
- }
-
- public T GetComponent<T>(Entity dotsEntity) where T : unmanaged, IComponentData
- {
- #if UNITY_ECS_100
- return _EManager.GetComponentData<T>(dotsEntity);
- #else
- return _EManager.GetComponentData<T>(dotsEntity);
- #endif
- }
-
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public void AddSharedComponent<T>(Entity dotsEntity, in T component)
- where T : unmanaged, ISharedComponentData
- {
- #if UNITY_ECS_100
- _EManager.AddSharedComponent(dotsEntity, component);
- #else
- _EManager.AddSharedComponentData(dotsEntity, component);
- #endif
- }
-
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public void AddBuffer<T>(Entity dotsEntity)
- where T : unmanaged, IBufferElementData
- {
- _EManager.AddBuffer<T>(dotsEntity);
- }
-
- #if !(DEBUG && !PROFILE_SVELTO)
- [System.Diagnostics.Conditional("NO_SENSE")]
- #endif
- public void SetDebugName(Entity dotsEntity, string name)
- {
- _EManager.SetName(dotsEntity, name);
- }
-
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public void SetSharedComponentBatched<SharedComponentData>(NativeArray<Entity> nativeArray, SharedComponentData SCD)
- where SharedComponentData : unmanaged, ISharedComponentData
- {
- #if UNITY_ECS_100
- _EManager.SetSharedComponent(nativeArray, SCD);
- #else
- for (int i = 0; i < nativeArray.Length; i++)
- {
- _EManager.SetSharedComponentData(nativeArray[i], SCD);
- }
- #endif
- }
-
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public void AddComponentBatched<T>(NativeArray<Entity> DOTSEntities)
- {
- _EManager.AddComponent<T>(DOTSEntities);
- }
-
- //can't support publicly the version without DOTSSveltoEGID now
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- NativeArray<Entity> CreateDOTSEntityFromSveltoBatched(Entity prefab, (uint rangeStart, uint rangeEnd) range,
- ExclusiveGroupStruct groupID, NB<DOTSEntityComponent> DOSTEntityComponents)
- {
- unsafe
- {
- _jobHandle->Complete();
-
- var count = (int)(range.rangeEnd - range.rangeStart);
- var nativeArray = _EManager.Instantiate(prefab, count, _EManager.World.UpdateAllocator.ToAllocator);
-
- #if UNITY_ECS_100
- _EManager.AddSharedComponent(nativeArray, new DOTSSveltoGroupID(groupID));
- #else
- for (int i = 0; i < nativeArray.Length; i++)
- {
- _EManager.AddSharedComponentData(nativeArray[i], new DOTSSveltoGroupID(groupID));
- }
- #endif
-
- var setDOTSEntityComponentsJob = new SetDOTSEntityComponents
- {
- sveltoStartIndex = range.rangeStart,
- createdEntities = nativeArray,
- DOSTEntityComponents = DOSTEntityComponents
- };
- *_jobHandle = JobHandle.CombineDependencies(*_jobHandle, setDOTSEntityComponentsJob.ScheduleParallel(count, default));
-
- return nativeArray;
- }
- }
-
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public NativeArray<Entity> CreateDOTSEntityFromSveltoBatched(Entity prefab, (uint rangeStart, uint rangeEnd) range,
- ExclusiveGroupStruct groupID, NB<DOTSEntityComponent> DOSTEntityComponents, NativeEntityIDs sveltoIds, out JobHandle creationJob)
- {
- var nativeArray = CreateDOTSEntityFromSveltoBatched(prefab, range, groupID, DOSTEntityComponents);
- unsafe
- {
- var count = (int)(range.rangeEnd - range.rangeStart);
-
- _EManager.AddComponent<DOTSSveltoEGID>(nativeArray);
-
- var SetDOTSSveltoEGIDJob = new SetDOTSSveltoEGID
- {
- sveltoStartIndex = range.rangeStart,
- createdEntities = nativeArray,
- entityManager = _EManager,
- ids = sveltoIds,
- groupID = groupID
- };
- creationJob = *_jobHandle = JobHandle.CombineDependencies(*_jobHandle, SetDOTSSveltoEGIDJob.ScheduleParallel(count, default));
-
- return nativeArray;
- }
- }
-
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public void AddJobToComplete(JobHandle jobHandle)
- {
- unsafe
- {
- *_jobHandle = JobHandle.CombineDependencies(*_jobHandle, jobHandle);
- }
- }
-
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public void DestroyEntitiesBatched(NativeArray<Entity> nativeArray)
- {
- _EManager.DestroyEntity(nativeArray);
- }
-
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public void Complete()
- {
- unsafe
- {
- _jobHandle->Complete();
- }
- }
-
- [BurstCompile]
- struct SetDOTSEntityComponents: IJobParallelFor
- {
- public uint sveltoStartIndex;
- [ReadOnly] public NativeArray<Entity> createdEntities;
- public NB<DOTSEntityComponent> DOSTEntityComponents;
-
- public void Execute(int currentIndex)
- {
- int index = (int)(sveltoStartIndex + currentIndex);
- var dotsEntity = createdEntities[currentIndex];
-
- DOSTEntityComponents[index].dotsEntity = dotsEntity;
- }
- }
-
- [BurstCompile]
- public struct SetDOTSSveltoEGID: IJobParallelFor
- {
- public uint sveltoStartIndex;
- [ReadOnly] public NativeArray<Entity> createdEntities;
- [NativeDisableParallelForRestriction] public EntityManager entityManager;
- public NativeEntityIDs ids;
- public ExclusiveGroupStruct groupID;
-
- public void Execute(int currentIndex)
- {
- int index = (int)(sveltoStartIndex + currentIndex);
- var dotsEntity = createdEntities[currentIndex];
-
- entityManager.SetComponentData(
- dotsEntity, new DOTSSveltoEGID
- {
- egid = new EGID(ids[index], groupID)
- });
- }
- }
-
- readonly EntityManager _EManager;
- [NativeDisableUnsafePtrRestriction] readonly unsafe JobHandle* _jobHandle;
- }
- }
- #endif
|