Guest User

Untitled

a guest
Apr 1st, 2021
46
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.84 KB | None | 0 0
  1. // Unitys generic method for buffering components
  2.  
  3. internal void AddEntityComponentCommand<T>(EntityCommandBufferChain* chain, int sortKey, ECBCommand op, Entity e, T component) where T : struct, IComponentData
  4. {
  5. var ctype = ComponentType.ReadWrite<T>();
  6. if (ctype.IsZeroSized)
  7. {
  8. AddEntityComponentTypeCommand(chain, sortKey, op, e, ctype);
  9. return;
  10. }
  11.  
  12. // NOTE: This has to be sizeof not TypeManager.SizeInChunk since we use UnsafeUtility.CopyStructureToPtr
  13. // even on zero size components.
  14. var typeSize = UnsafeUtility.SizeOf<T>();
  15. var sizeNeeded = Align(sizeof(EntityComponentCommand) + typeSize, 8);
  16.  
  17. ResetCommandBatching(chain);
  18. var cmd = (EntityComponentCommand*)Reserve(chain, sortKey, sizeNeeded);
  19.  
  20. cmd->Header.Header.CommandType = (int)op;
  21. cmd->Header.Header.TotalSize = sizeNeeded;
  22. cmd->Header.Header.SortKey = chain->m_LastSortKey;
  23. cmd->Header.Entity = e;
  24. cmd->ComponentTypeIndex = ctype.TypeIndex;
  25. cmd->ComponentSize = typeSize;
  26.  
  27. byte* data = (byte*)(cmd + 1);
  28. UnsafeUtility.CopyStructureToPtr(ref component, data);
  29.  
  30. if (RequiresEntityFixUp(data, ctype.TypeIndex))
  31. {
  32. if (op == ECBCommand.AddComponent)
  33. cmd->Header.Header.CommandType = (int)ECBCommand.AddComponentWithEntityFixUp;
  34. else if (op == ECBCommand.SetComponent)
  35. cmd->Header.Header.CommandType = (int)ECBCommand.SetComponentWithEntityFixUp;
  36. }
  37. }
  38.  
  39.  
  40. My non generic version for boxed structs
  41.  
  42. /// <summary>
  43. /// An internal method which adds an entity component without generics.
  44. /// </summary>
  45. /// <param name="ecbd"></param>
  46. /// <param name="chain"></param>
  47. /// <param name="sortKey"></param>
  48. /// <param name="op"></param>
  49. /// <param name="e"></param>
  50. /// <param name="component"></param>
  51. internal static void AddEntityComponentCommand(this EntityCommandBufferData ecbd, EntityCommandBufferChain* chain, int sortKey, ECBCommand op, Entity e, object component){
  52.  
  53. var ctype = ComponentType.ReadWrite(component.GetType());
  54. if (ctype.IsZeroSized) {
  55. ecbd.AddEntityComponentTypeCommand(chain, sortKey, op, e, ctype);
  56. return;
  57. }
  58.  
  59. // NOTE: This has to be sizeof not TypeManager.SizeInChunk since we use UnsafeUtility.CopyStructureToPtr
  60. // even on zero size components.
  61. var typeSize = UnsafeUtility.SizeOf(component.GetType());
  62. var sizeNeeded = EntityCommandBufferData.Align(sizeof(EntityComponentCommand) + typeSize, 8);
  63.  
  64. ecbd.ResetCommandBatching(chain);
  65. var cmd = (EntityComponentCommand*)ecbd.Reserve(chain, sortKey, sizeNeeded);
  66.  
  67. cmd->Header.Header.CommandType = (int)op;
  68. cmd->Header.Header.TotalSize = sizeNeeded;
  69. cmd->Header.Header.SortKey = chain->m_LastSortKey;
  70. cmd->Header.Entity = e;
  71. cmd->ComponentTypeIndex = ctype.TypeIndex;
  72. cmd->ComponentSize = typeSize;
  73.  
  74. byte* data = (byte*)(cmd + 1);
  75. Marshal.StructureToPtr(component, new IntPtr(data), false);
  76.  
  77. if (ecbd.RequiresEntityFixUp(data, ctype.TypeIndex))
  78. {
  79. if (op == ECBCommand.AddComponent)
  80. cmd->Header.Header.CommandType = (int)ECBCommand.AddComponentWithEntityFixUp;
  81. else if (op == ECBCommand.SetComponent)
  82. cmd->Header.Header.CommandType = (int)ECBCommand.SetComponentWithEntityFixUp;
  83. }
  84. }
Advertisement
Add Comment
Please, Sign In to add comment