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;
                }
            }
        }
    }
Exemple #2
0
    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);
    }
Exemple #3
0
    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);
    }