protected override void OnUpdate() { if (_expandingTilesQuery.IsEmpty) { return; } NativeArray <Entity> tilesArray = _expandingTilesQuery.ToEntityArray(Allocator.Temp); EntityCommandBuffer ecb = ecbSystem.CreateCommandBuffer(); foreach (Entity tile in tilesArray) { ecb.AddSharedComponent( tile, _ite < 4 ? GridGenerationComponent.InnerNodeLinkingPhase : GridGenerationComponent.ReadyPhase ); } tilesArray.Dispose(); var maxTileLinksCount = _expandingTilesQuery.CalculateEntityCount() * 6; var adjTileLinksMap = new NativeMultiHashMap <GridPosition, TileLink>( maxTileLinksCount, Allocator.TempJob ); Dependency = new ComputeAdjacentTilesJob { entityTypeHandle = GetEntityTypeHandle(), tileComponentTypeHandle = GetComponentTypeHandle <TileComponent>(true), hexTileOffsets = _hexTileOffsets, mapWriter = adjTileLinksMap.AsParallelWriter() }.Schedule(_expandingTilesQuery, Dependency); var uniqueKeys = new NativeList <GridPosition>(maxTileLinksCount, Allocator.TempJob); Dependency = new GetUniqueMultHMapKeysJob <GridPosition, TileLink> { multiHashMap = adjTileLinksMap, keys = uniqueKeys }.Schedule(Dependency); Dependency = new InstantiateAdjacentTilesJob { adjTileLinksKeys = uniqueKeys, adjTileLinksMap = adjTileLinksMap, ecbWriter = ecbSystem.CreateCommandBuffer() }.Schedule(Dependency); adjTileLinksMap.Dispose(Dependency); uniqueKeys.Dispose(Dependency); ecbSystem.AddJobHandleForProducer(Dependency); }
protected override void OnUpdate() { if (_linkingTilesQuery.IsEmpty) { return; } #region Initialization var outerNodesMaxCount = _linkingTilesQuery.CalculateEntityCount(); var centerNodesMaxCount = outerNodesMaxCount; var centerNodesMaxLinksCount = centerNodesMaxCount * 6; var outerNodesMaxLinkCount = outerNodesMaxCount * 6 * 2; var modifiedTilesMaxCount = centerNodesMaxCount + outerNodesMaxCount * 3; ComponentDataFromEntity <TileComponent> tileComponentLookup = GetComponentDataFromEntity <TileComponent>(true); NativeArray <Entity> linkingTilesArray = _linkingTilesQuery.ToEntityArray(Allocator.TempJob); var centerNodesMap = new NativeMultiHashMap <Entity, TileLink>( centerNodesMaxLinksCount, Allocator.TempJob ); var outerNodesMap = new NativeMultiHashMap <Entity, TileLink>( outerNodesMaxLinkCount, Allocator.TempJob ); var tileBufferMap = new NativeHashMap <Entity, TileBuffer>( modifiedTilesMaxCount, Allocator.TempJob ); EntityCommandBuffer ecb = ecbSystem.CreateCommandBuffer(); foreach (Entity tile in linkingTilesArray) { ecb.SetSharedComponent( tile, _ite < 4 ? GridGenerationComponent.ExpansionPhase : GridGenerationComponent.ReadyPhase ); } _ite++; #endregion #region ProcessCenterNodes Dependency = new ProcessInitialTileLinksJob { entityTypeHandle = GetEntityTypeHandle(), tileComponentTypeHandle = GetComponentTypeHandle <TileComponent>(true), centerNodesMapWriter = centerNodesMap.AsParallelWriter() }.Schedule(_linkingTilesQuery); var centerNodes = new NativeList <Entity>(centerNodesMaxCount, Allocator.TempJob); Dependency = new GetUniqueMultHMapKeysJob <Entity, TileLink> { multiHashMap = centerNodesMap, keys = centerNodes }.Schedule(Dependency); Dependency = new ProcessNodesTileLinksJob { nodes = centerNodes, nodesTileLinksMap = centerNodesMap, tileComponentLookup = tileComponentLookup, tileBufferMapWriter = tileBufferMap.AsParallelWriter() }.Schedule(centerNodes, 1, Dependency); centerNodesMap.Dispose(Dependency); #endregion #region ProcessOuterNodes Dependency = new ComputeTriangularLinkPropagationJob { centerNodes = centerNodes, linkingTilesArray = linkingTilesArray, tileBufferMap = tileBufferMap, outerNodesMapWriter = outerNodesMap.AsParallelWriter() }.Schedule(centerNodes, 1, Dependency); centerNodes.Dispose(Dependency); linkingTilesArray.Dispose(Dependency); var outerNodes = new NativeList <Entity>(outerNodesMaxCount, Allocator.TempJob); Dependency = new GetUniqueMultHMapKeysJob <Entity, TileLink> { multiHashMap = outerNodesMap, keys = outerNodes }.Schedule(Dependency); Dependency = new ProcessNodesTileLinksJob { nodes = outerNodes, nodesTileLinksMap = outerNodesMap, tileComponentLookup = tileComponentLookup, tileBufferMapWriter = tileBufferMap.AsParallelWriter() }.Schedule(outerNodes, 1, Dependency); outerNodes.Dispose(Dependency); outerNodesMap.Dispose(Dependency); #endregion #region SetLinkedTilesBuffers var totalTiles = new NativeList <Entity>(modifiedTilesMaxCount, Allocator.TempJob); Dependency = new GetHMapKeysJob <Entity, TileBuffer> { hashMap = tileBufferMap, keys = totalTiles }.Schedule(Dependency); Dependency = new SetLinkedTilesBuffersJob { tileBufferMapKeys = totalTiles, tileComponentLookup = tileComponentLookup, tileBufferMap = tileBufferMap, ecbWriter = ecbSystem.CreateCommandBuffer() .AsParallelWriter() }.Schedule(totalTiles, 1, Dependency); totalTiles.Dispose(Dependency); tileBufferMap.Dispose(Dependency); #endregion ecbSystem.AddJobHandleForProducer(Dependency); }