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); }
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); }
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); }