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.

49 lines
1.7KB

  1. #if UNITY_NATIVE
  2. using Svelto.ECS.DataStructures;
  3. namespace Svelto.ECS.Native
  4. {
  5. public readonly struct NativeEntityFactory
  6. {
  7. internal NativeEntityFactory(AtomicNativeBags addOperationQueue, int index, EnginesRoot.LocatorMap entityLocator)
  8. {
  9. _index = index;
  10. _addOperationQueue = addOperationQueue;
  11. _entityLocator = entityLocator;
  12. }
  13. public NativeEntityInitializer BuildEntity
  14. (uint eindex, ExclusiveBuildGroup exclusiveBuildGroup, int threadIndex)
  15. {
  16. EntityReference reference = _entityLocator.ClaimReference();
  17. NativeBag unsafeBuffer = _addOperationQueue.GetBuffer(threadIndex + 1);
  18. unsafeBuffer.Enqueue(_index);
  19. unsafeBuffer.Enqueue(new EGID(eindex, exclusiveBuildGroup));
  20. unsafeBuffer.Enqueue(reference);
  21. unsafeBuffer.ReserveEnqueue<uint>(out var index) = 0;
  22. return new NativeEntityInitializer(unsafeBuffer, index, reference);
  23. }
  24. public NativeEntityInitializer BuildEntity(EGID egid, int threadIndex)
  25. {
  26. EntityReference reference = _entityLocator.ClaimReference();
  27. NativeBag unsafeBuffer = _addOperationQueue.GetBuffer(threadIndex + 1);
  28. unsafeBuffer.Enqueue(_index);
  29. unsafeBuffer.Enqueue(new EGID(egid.entityID, egid.groupID));
  30. unsafeBuffer.Enqueue(reference);
  31. unsafeBuffer.ReserveEnqueue<uint>(out var index) = 0;
  32. return new NativeEntityInitializer(unsafeBuffer, index, reference);
  33. }
  34. readonly EnginesRoot.LocatorMap _entityLocator;
  35. readonly AtomicNativeBags _addOperationQueue;
  36. readonly int _index;
  37. }
  38. }
  39. #endif