public bool ProcessWorkItems(bool force) { if (this.workItemsInProgressRightNow) { throw new Exception("Processing work items recursively. Please do not wait for other work items to be completed inside work items. If you think this is not caused by any of your scripts, this might be a bug."); } this.workItemsInProgressRightNow = true; while (this.workItems.Count > 0) { if (!this.workItemsInProgress) { this.workItemsInProgress = true; this.queuedWorkItemFloodFill = false; } AstarWorkItem value = this.workItems[0]; if (value.init != null) { value.init(); value.init = null; } if (value.initWithContext != null) { value.initWithContext(this); value.initWithContext = null; } this.workItems[0] = value; bool flag; try { if (value.update != null) { flag = value.update(force); } else { flag = (value.updateWithContext == null || value.updateWithContext(this, force)); } } catch { this.workItems.Dequeue(); this.workItemsInProgressRightNow = false; throw; } if (!flag) { if (force) { Debug.LogError("Misbehaving WorkItem. 'force'=true but the work item did not complete.\nIf force=true is passed to a WorkItem it should always return true."); } this.workItemsInProgressRightNow = false; return(false); } this.workItems.Dequeue(); } this.EnsureValidFloodFill(); this.workItemsInProgressRightNow = false; this.workItemsInProgress = false; return(true); }
/** Process graph updating work items. * Process all queued work items, e.g graph updates and the likes. * * \returns * - false if there are still items to be processed. * - true if the last work items was processed and pathfinding threads are ready to be resumed. * * \see AddWorkItem * \see threadSafeUpdateState * \see Update */ public bool ProcessWorkItems(bool force) { if (workItemsInProgressRightNow) { throw new System.Exception("Processing work items recursively. Please do not wait for other work items to be completed inside work items. " + "If you think this is not caused by any of your scripts, this might be a bug."); } workItemsInProgressRightNow = true; while (workItems.Count > 0) { // Working on a new batch if (!workItemsInProgress) { workItemsInProgress = true; queuedWorkItemFloodFill = false; } // Peek at first item in the queue AstarWorkItem itm = workItems[0]; // Call init the first time the item is seen if (itm.init != null) { itm.init(); itm.init = null; } if (itm.initWithContext != null) { itm.initWithContext(this); itm.initWithContext = null; } // Make sure the item in the queue is up to date workItems[0] = itm; bool status; try { if (itm.update != null) { status = itm.update(force); } else if (itm.updateWithContext != null) { status = itm.updateWithContext(this, force); } else { status = true; } } catch { workItems.Dequeue(); workItemsInProgressRightNow = false; throw; } if (!status) { if (force) { Debug.LogError("Misbehaving WorkItem. 'force'=true but the work item did not complete.\nIf force=true is passed to a WorkItem it should always return true."); } // Still work items to process workItemsInProgressRightNow = false; return(false); } else { workItems.Dequeue(); } } EnsureValidFloodFill(); workItemsInProgressRightNow = false; workItemsInProgress = false; return(true); }
bool ProcessWorkItems(bool force, bool sendEvents) { if (workItemsInProgressRightNow) { throw new System.Exception("Processing work items recursively. Please do not wait for other work items to be completed inside work items. " + "If you think this is not caused by any of your scripts, this might be a bug."); } // Make sure the physics engine data is up to date. // Graph updates may use physics methods and it is very confusing if they // do not always pick up the latest changes made to the scene. UnityEngine.Physics.SyncTransforms(); UnityEngine.Physics2D.SyncTransforms(); workItemsInProgressRightNow = true; astar.data.LockGraphStructure(true); while (workItems.Count > 0) { // Working on a new batch if (!workItemsInProgress) { workItemsInProgress = true; } // Peek at first item in the queue AstarWorkItem itm = workItems[0]; bool status; try { // Call init the first time the item is seen if (itm.init != null) { itm.init(); itm.init = null; } if (itm.initWithContext != null) { itm.initWithContext(this); itm.initWithContext = null; } // Make sure the item in the queue is up to date workItems[0] = itm; if (itm.update != null) { status = itm.update(force); } else if (itm.updateWithContext != null) { status = itm.updateWithContext(this, force); } else { status = true; } } catch { workItems.Dequeue(); workItemsInProgressRightNow = false; astar.data.UnlockGraphStructure(); throw; } if (!status) { if (force) { Debug.LogError("Misbehaving WorkItem. 'force'=true but the work item did not complete.\nIf force=true is passed to a WorkItem it should always return true."); } // Still work items to process workItemsInProgressRightNow = false; astar.data.UnlockGraphStructure(); return(false); } else { workItems.Dequeue(); } } if (sendEvents) { Profiler.BeginSample("PostUpdate"); if (anyGraphsDirty) { GraphModifier.TriggerEvent(GraphModifier.EventType.PostUpdateBeforeAreaRecalculation); } Profiler.EndSample(); EnsureValidFloodFill(); Profiler.BeginSample("PostUpdate"); if (anyGraphsDirty) { GraphModifier.TriggerEvent(GraphModifier.EventType.PostUpdate); if (OnGraphsUpdated != null) { OnGraphsUpdated(); } } Profiler.EndSample(); } // Reset flags at the end anyGraphsDirty = false; preUpdateEventSent = false; workItemsInProgressRightNow = false; workItemsInProgress = false; astar.data.UnlockGraphStructure(); return(true); }
/// <summary> /// Process graph updating work items. /// Process all queued work items, e.g graph updates and the likes. /// /// Returns: /// - false if there are still items to be processed. /// - true if the last work items was processed and pathfinding threads are ready to be resumed. /// /// See: AddWorkItem /// See: threadSafeUpdateState /// See: Update /// </summary> public bool ProcessWorkItems(bool force) { if (workItemsInProgressRightNow) { throw new System.Exception("Processing work items recursively. Please do not wait for other work items to be completed inside work items. " + "If you think this is not caused by any of your scripts, this might be a bug."); } UnityEngine.Physics2D.SyncTransforms(); workItemsInProgressRightNow = true; astar.data.LockGraphStructure(true); while (workItems.Count > 0) { // Working on a new batch if (!workItemsInProgress) { workItemsInProgress = true; queuedWorkItemFloodFill = false; } // Peek at first item in the queue AstarWorkItem itm = workItems[0]; bool status; try { // Call init the first time the item is seen if (itm.init != null) { itm.init(); itm.init = null; } if (itm.initWithContext != null) { itm.initWithContext(this); itm.initWithContext = null; } // Make sure the item in the queue is up to date workItems[0] = itm; if (itm.update != null) { status = itm.update(force); } else if (itm.updateWithContext != null) { status = itm.updateWithContext(this, force); } else { status = true; } } catch { workItems.Dequeue(); workItemsInProgressRightNow = false; astar.data.UnlockGraphStructure(); throw; } if (!status) { if (force) { Debug.LogError("Misbehaving WorkItem. 'force'=true but the work item did not complete.\nIf force=true is passed to a WorkItem it should always return true."); } // Still work items to process workItemsInProgressRightNow = false; astar.data.UnlockGraphStructure(); return(false); } else { workItems.Dequeue(); } } EnsureValidFloodFill(); Profiler.BeginSample("PostUpdate"); if (anyGraphsDirty) { GraphModifier.TriggerEvent(GraphModifier.EventType.PostUpdate); } Profiler.EndSample(); anyGraphsDirty = false; workItemsInProgressRightNow = false; workItemsInProgress = false; astar.data.UnlockGraphStructure(); return(true); }