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);
        }