void Initialize(int capacity)
    {
        var world      = NavMeshWorld.GetDefaultWorld();
        var queryCount = world.IsValid() ? k_QueryCount : 0;

        var agentCount = world.IsValid() ? capacity : 0;

        m_PlanPathForAgent      = new NativeList <bool1>(agentCount, Allocator.Persistent);
        m_EmptyPlanPathForAgent = new NativeList <bool1>(0, Allocator.Persistent);
        m_PathRequestIdForAgent = new NativeList <uint>(agentCount, Allocator.Persistent);
        m_PathRequests          = new NativeList <PathQueryQueueEcs.RequestEcs>(k_PathRequestsPerTick, Allocator.Persistent);
        m_PathRequests.ResizeUninitialized(k_PathRequestsPerTick);
        for (var i = 0; i < m_PathRequests.Length; i++)
        {
            m_PathRequests[i] = new PathQueryQueueEcs.RequestEcs {
                uid = PathQueryQueueEcs.RequestEcs.invalidId
            };
        }
        m_PathRequestsRange          = new NativeArray <int>(k_DataSize, Allocator.Persistent);
        m_PathRequestsRange[k_Start] = 0;
        m_PathRequestsRange[k_Count] = 0;
        m_UniqueIdStore        = new NativeArray <uint>(1, Allocator.Persistent);
        m_CurrentAgentIndex    = new NativeArray <int>(1, Allocator.Persistent);
        m_CurrentAgentIndex[0] = 0;

        m_NavMeshQuery                = new NavMeshQuery(world, Allocator.Persistent);
        m_QueryQueues                 = new PathQueryQueueEcs[queryCount];
        m_QueryJobs                   = new UpdateQueriesJob[queryCount];
        m_AfterQueriesProcessed       = new NativeArray <JobHandle>(queryCount, Allocator.Persistent);
        m_AfterQueriesCleanup         = new JobHandle();
        m_AfterMovedRequestsForgotten = new JobHandle();
        m_IsEmptyQueryQueue           = new bool[queryCount];
        for (var i = 0; i < m_QueryQueues.Length; i++)
        {
            m_QueryQueues[i] = new PathQueryQueueEcs(k_MaxQueryNodes, k_MaxRequestsPerQuery);
            m_QueryJobs[i]   = new UpdateQueriesJob()
            {
                maxIterations = k_MaxQueryIterationsPerTick, queryQueue = m_QueryQueues[i]
            };
            m_AfterQueriesProcessed[i] = new JobHandle();
            m_IsEmptyQueryQueue[i]     = true;
        }
    }
    public void OnRemoveSwapBack(int index)
    {
        var replacementAgent = m_PlanPathForAgent.Length - 1;

        m_PlanPathForAgent.RemoveAtSwapBack(index);
        m_PathRequestIdForAgent.RemoveAtSwapBack(index);

        m_AfterQueriesCleanup.Complete();
        for (var i = 0; i < m_QueryQueues.Length; i++)
        {
            m_QueryQueues[i].RemoveAgentRecords(index, replacementAgent);
        }

        m_AfterMovedRequestsForgotten.Complete();
        var rangeEnd = m_PathRequestsRange[k_Start] + m_PathRequestsRange[k_Count];

        for (var i = m_PathRequestsRange[k_Start]; i < rangeEnd; i++)
        {
            if (m_PathRequests[i].agentIndex == index)
            {
                if (i < rangeEnd - 1)
                {
                    m_PathRequests[i]            = m_PathRequests[rangeEnd - 1];
                    m_PathRequests[rangeEnd - 1] = new PathQueryQueueEcs.RequestEcs {
                        uid = PathQueryQueueEcs.RequestEcs.invalidId
                    };
                }
                rangeEnd--;
                i--;
            }
            else if (m_PathRequests[i].agentIndex == replacementAgent)
            {
                var req = m_PathRequests[i];
                req.agentIndex    = index;
                m_PathRequests[i] = req;
            }
        }
        m_PathRequestsRange[k_Count] = rangeEnd - m_PathRequestsRange[k_Start];

#if DEBUG_CROWDSYSTEM_ASSERTS
        Debug.Assert(m_PathRequestsRange[k_Count] >= 0);
#endif
    }
        public void Execute()
        {
            if (agents.Length == 0)
            {
                return;
            }

            // add new requests to the end of the range
            var reqEnd     = pathRequestsRange[k_Start] + pathRequestsRange[k_Count];
            var reqMax     = pathRequests.Length - 1;
            var firstAgent = currentAgentIndex[0];

            for (var i = 0; i < agents.Length; ++i)
            {
                if (reqEnd > reqMax)
                {
                    break;
                }

                var index          = (i + firstAgent) % agents.Length;
                var agentNavigator = agentNavigators[index];
                if (planPathForAgent.Length > 0 && planPathForAgent[index] ||
                    agentNavigator.newDestinationRequested && pathRequestIdForAgent[index] == PathQueryQueueEcs.RequestEcs.invalidId)
                {
                    if (!agentNavigator.active)
                    {
                        if (planPathForAgent.Length > 0)
                        {
                            planPathForAgent[index] = false;
                        }
                        agentNavigator.newDestinationRequested = false;
                        agentNavigators[index] = agentNavigator;
                        continue;
                    }

                    var agent = agents[index];
                    if (!query.IsValid(agent.location))
                    {
                        continue;
                    }

                    if (uniqueIdStore[0] == PathQueryQueueEcs.RequestEcs.invalidId)
                    {
                        uniqueIdStore[0] = 1 + PathQueryQueueEcs.RequestEcs.invalidId;
                    }

                    pathRequests[reqEnd++] = new PathQueryQueueEcs.RequestEcs()
                    {
                        agentIndex = index,
                        agentType  = agent.type,
                        mask       = NavMesh.AllAreas,
                        uid        = uniqueIdStore[0],
                        start      = agent.location.position,
                        end        = agentNavigator.requestedDestination
                    };
                    pathRequestIdForAgent[index] = uniqueIdStore[0];
                    uniqueIdStore[0]++;
                    if (planPathForAgent.Length > 0)
                    {
                        planPathForAgent[index] = false;
                    }
                    agentNavigator.newDestinationRequested = false;
                    agentNavigators[index] = agentNavigator;
                }
                currentAgentIndex[0] = index;
            }
            pathRequestsRange[k_Count] = reqEnd - pathRequestsRange[k_Start];
        }