Пример #1
0
        public static PlayerLoopSystem InsertWorldManagersInPlayerLoop(PlayerLoopSystem defaultPlayerLoop,
                                                                       params World[] worlds)
        {
            var systemList = new List <InsertionBucket>();

            foreach (var world in worlds)
            {
                if (world.BehaviourManagers.Count() == 0)
                {
                    continue;
                }
                systemList.AddRange(CreateSystemDependencyList(world.BehaviourManagers, defaultPlayerLoop));
            }

            var patchSystemList = new List <ScriptBehaviourManager>();

            foreach (var world in worlds)
            {
                if (world.Patches.Count == 0)
                {
                    continue;
                }
                patchSystemList.AddRange(world.Patches);
            }

            var ecsPlayerLoop = CreatePlayerLoop(systemList, defaultPlayerLoop);

            for (var i = 0; i < ecsPlayerLoop.subSystemList.Length; ++i)
            {
                var subSystemList = new List <PlayerLoopSystem>();

                for (var j = 0; j < ecsPlayerLoop.subSystemList[i].subSystemList.Length; j++)
                {
                    var next = ecsPlayerLoop.subSystemList[i].subSystemList[j];
                    if (next.type.IsSubclassOf(typeof(ComponentSystem)))
                    {
                        for (var k = 0; k < patchSystemList.Count; k++)
                        {
                            var patch = new PlayerLoopSystem();
                            patch.type = patchSystemList[k].GetType();
                            var tmp = new DummyDelagateWrapper(patchSystemList[k]);
                            patch.updateDelegate = tmp.TriggerUpdate;
                            subSystemList.Add(patch);
                        }
                    }

                    subSystemList.Add(next);
                }

                ecsPlayerLoop.subSystemList[i].subSystemList = subSystemList.ToArray();
            }

            return(ecsPlayerLoop);
        }
Пример #2
0
        static PlayerLoopSystem CreatePlayerLoop(List <InsertionBucket> insertionBuckets, PlayerLoopSystem defaultPlayerLoop)
        {
            insertionBuckets.Sort();

            // Insert the buckets at the appropriate place
            var currentPos    = 0;
            var ecsPlayerLoop = new PlayerLoopSystem
            {
                subSystemList = new PlayerLoopSystem[defaultPlayerLoop.subSystemList.Length]
            };
            var currentBucket = 0;

            for (var i = 0; i < defaultPlayerLoop.subSystemList.Length; ++i)
            {
                var firstPos = currentPos + 1;
                var lastPos  = firstPos + defaultPlayerLoop.subSystemList[i].subSystemList.Length;
                // Find all new things to insert here
                var systemsToInsert = 0;
                foreach (var bucket in insertionBuckets)
                {
                    if (bucket.InsertPos >= firstPos && bucket.InsertPos <= lastPos)
                    {
                        systemsToInsert += bucket.Systems.Count;
                    }
                }
                ecsPlayerLoop.subSystemList[i] = defaultPlayerLoop.subSystemList[i];
                if (systemsToInsert > 0)
                {
                    ecsPlayerLoop.subSystemList[i].subSystemList = new PlayerLoopSystem[defaultPlayerLoop.subSystemList[i].subSystemList.Length + systemsToInsert];
                    var dstPos = 0;
                    for (var srcPos = 0; srcPos < defaultPlayerLoop.subSystemList[i].subSystemList.Length; ++srcPos, ++dstPos)
                    {
                        while (currentBucket < insertionBuckets.Count && insertionBuckets[currentBucket].InsertPos <= firstPos + srcPos)
                        {
                            foreach (var insert in insertionBuckets[currentBucket].Systems)
                            {
                                ecsPlayerLoop.subSystemList[i].subSystemList[dstPos].type = insert.Manager.GetType();
                                var tmp = new DummyDelagateWrapper(insert.Manager);
                                ecsPlayerLoop.subSystemList[i].subSystemList[dstPos].updateDelegate = tmp.TriggerUpdate;
                                ++dstPos;
                            }
                            ++currentBucket;
                        }
                        ecsPlayerLoop.subSystemList[i].subSystemList[dstPos] = defaultPlayerLoop.subSystemList[i].subSystemList[srcPos];
                    }
                    while (currentBucket < insertionBuckets.Count && insertionBuckets[currentBucket].InsertPos <= lastPos)
                    {
                        foreach (var insert in insertionBuckets[currentBucket].Systems)
                        {
                            ecsPlayerLoop.subSystemList[i].subSystemList[dstPos].type = insert.Manager.GetType();
                            var tmp = new DummyDelagateWrapper(insert.Manager);
                            ecsPlayerLoop.subSystemList[i].subSystemList[dstPos].updateDelegate = tmp.TriggerUpdate;
                            ++dstPos;
                        }
                        ++currentBucket;
                    }
                }
                currentPos = lastPos;
            }

            return(ecsPlayerLoop);
        }
Пример #3
0
        private static PlayerLoopSystem CreatePlayerLoop(List <InsertionBucket> insertionBuckets, PlayerLoopSystem defaultPlayerLoop)
        {
            insertionBuckets.Sort();
            int num = 0;
            PlayerLoopSystem system = new PlayerLoopSystem {
                subSystemList = new PlayerLoopSystem[defaultPlayerLoop.subSystemList.Length]
            };
            int num2 = 0;

            for (int i = 0; i < defaultPlayerLoop.subSystemList.Length; i++)
            {
                int num4 = num + 1;
                int num5 = num4 + defaultPlayerLoop.subSystemList[i].subSystemList.Length;
                int num6 = 0;
                foreach (InsertionBucket bucket in insertionBuckets)
                {
                    if ((bucket.InsertPos >= num4) && (bucket.InsertPos <= num5))
                    {
                        num6 += bucket.Systems.Count;
                    }
                }
                system.subSystemList[i] = defaultPlayerLoop.subSystemList[i];
                if (num6 > 0)
                {
                    system.subSystemList[i].subSystemList = new PlayerLoopSystem[defaultPlayerLoop.subSystemList[i].subSystemList.Length + num6];
                    int index = 0;
                    int num8  = 0;
                    while (true)
                    {
                        if (num8 >= defaultPlayerLoop.subSystemList[i].subSystemList.Length)
                        {
                            while (true)
                            {
                                if ((num2 >= insertionBuckets.Count) || (insertionBuckets[num2].InsertPos > num5))
                                {
                                    break;
                                }
                                foreach (DependantBehavior behavior2 in insertionBuckets[num2].Systems)
                                {
                                    system.subSystemList[i].subSystemList[index].type = behavior2.Manager.GetType();
                                    DummyDelagateWrapper wrapper2 = new DummyDelagateWrapper(behavior2.Manager);
                                    system.subSystemList[i].subSystemList[index].updateDelegate = new PlayerLoopSystem.UpdateFunction(wrapper2.TriggerUpdate);
                                    index++;
                                }
                                num2++;
                            }
                            break;
                        }
                        while (true)
                        {
                            if ((num2 >= insertionBuckets.Count) || (insertionBuckets[num2].InsertPos > (num4 + num8)))
                            {
                                system.subSystemList[i].subSystemList[index] = defaultPlayerLoop.subSystemList[i].subSystemList[num8];
                                num8++;
                                index++;
                                break;
                            }
                            foreach (DependantBehavior behavior in insertionBuckets[num2].Systems)
                            {
                                system.subSystemList[i].subSystemList[index].type = behavior.Manager.GetType();
                                DummyDelagateWrapper wrapper = new DummyDelagateWrapper(behavior.Manager);
                                system.subSystemList[i].subSystemList[index].updateDelegate = new PlayerLoopSystem.UpdateFunction(wrapper.TriggerUpdate);
                                index++;
                            }
                            num2++;
                        }
                    }
                }
                num = num5;
            }
            return(system);
        }