private void UpdatePack(int packIndex, int totalPacks) { float from = (float)packIndex / totalPacks; float to = (float)(packIndex + 1) / totalPacks; for (int i = (int)(Belts.Count * from); i < (int)(Belts.Count * to); i++) { BeltSystem beltSystem = Belts[i]; for (int j = 0; j < beltSystem.Items.Count - beltSystem.StuckItems; j++) { var items = beltSystem.Items; float progress = items[j].Progress + multithreadedDeltaTime; if (progress > beltSystem.WayPoints.Length - 1.176f - beltSystem.StuckItems * .33f) { progress = beltSystem.WayPoints.Length - 1.16f - beltSystem.StuckItems * .33f; beltSystem.StuckItems++; } items[j] = new ItemOnBelt(progress); } } updatingBarrier.SignalAndWait(); for (int i = (int)(Hands.Count * from); i < (int)(Hands.Count * to); i++) { Hand hand = Hands[i]; if (hand.ItemOnBelt.HasValue) { var item = hand.ItemOnBelt.Value; float progress = item.Progress + multithreadedDeltaTime; if (progress >= 1) { item.Progress = hand.ToProgress; if (hand.To.PushItem(item)) { hand.ItemOnBelt = null; } } else { item.Progress = progress; hand.ItemOnBelt = item; } } else { var item = hand.From.PopItem(hand.FromProgress); if (item.HasValue) { ItemOnBelt itemValue = item.Value; itemValue.Progress = 0; hand.ItemOnBelt = itemValue; } } } }
public bool PushItem(ItemOnBelt item) { int start = 0; int end = Items.Count; while (start != end) { int median = (start + end) / 2; if (Items[median].Progress > item.Progress) { end = median; } else { start = median + 1; } } float prevEdge = .17f; if (start > 0) { prevEdge = Items[start - 1].Progress + .33f; } float nextEdge; if (start < Items.Count) { nextEdge = Items[start].Progress - .33f; } else { nextEdge = WayPoints.Length - .17f; } if (nextEdge - prevEdge < 0) { return(false); // No space to fit item } if (item.Progress < prevEdge) { item.Progress = prevEdge; } else if (item.Progress > nextEdge) { item.Progress = nextEdge; } Items.Insert(start, item); #if UNITY_EDITOR Check(); #endif return(true); }
private ItemOnBelt PopItem(int index) { int indexFromEnd = Items.Count - 1 - index; if (indexFromEnd < StuckItems) { StuckItems = indexFromEnd; } ItemOnBelt result = Items[index]; Items.RemoveAt(index); return(result); }