Implement temporary event injection.

This commit is contained in:
2022-12-23 16:27:34 +08:00
parent 0049ace91a
commit 7475b19547
2 changed files with 32 additions and 26 deletions

View File

@@ -542,8 +542,6 @@ namespace Cryville.Crtr {
using (var pbus = cbus.Clone(16)) { using (var pbus = cbus.Clone(16)) {
pbus.Forward(); pbus.Forward();
} }
Logger.Log("main", 0, "Load/WorkerThread", "Patching events");
cbus.DoPatch();
Logger.Log("main", 0, "Load/WorkerThread", "Cloning states (type 1)"); Logger.Log("main", 0, "Load/WorkerThread", "Cloning states (type 1)");
bbus = cbus.Clone(1, -clippingDist); bbus = cbus.Clone(1, -clippingDist);

View File

@@ -99,39 +99,46 @@ namespace Cryville.Crtr.Event {
s.AttachSystems(skin, judge); s.AttachSystems(skin, judge);
} }
readonly List<StampedEvent> patch = new List<StampedEvent>(); readonly List<StampedEvent> tempEvents = new List<StampedEvent>();
public void IssuePatch(IEnumerable<StampedEvent> l) { public void PushTempEvent(StampedEvent ev) {
patch.AddRange(l); var index = tempEvents.BinarySearch(ev);
} if (index < 0) index = ~index;
public void DoPatch() { tempEvents.Insert(index, ev);
foreach (var ev in patch) {
var batch = new EventBatch(ev.Time);
var batchIndex = events.BinarySearch(batch);
if (batchIndex >= 0) batch = events[batchIndex];
else events.Insert(~batchIndex, batch);
batch.Add(ev);
}
patch.Clear();
} }
public override void ForwardOnceToTime(double toTime, Action<EventBatch> callback = null) { public override void ForwardOnceToTime(double toTime, Action<EventBatch> callback = null) {
if (EventId < events.Count && events[EventId].Time <= toTime) { double time1 = EventId < events.Count ? events[EventId].Time : double.PositiveInfinity;
Time = events[EventId].Time; double time2 = tempEvents.Count > 0 ? tempEvents[0].Time : double.PositiveInfinity;
var batch = events[EventId]; double time0 = Math.Min(time1, time2);
if (time0 <= toTime && time0 != double.PositiveInfinity) {
Time = time0;
foreach (var s in workingStates) s.Handle(null); foreach (var s in workingStates) s.Handle(null);
ValidateStates(); ValidateStates();
for (var i = 0; i < batch.Count; i++) { if (time1 == time0) {
var ev = batch[i]; var batch = events[EventId];
if (ev.Container != null) { for (var i = 0; i < batch.Count; i++) {
EnsureActivity(ev.Container); var ev = batch[i];
states[ev.Container].Handle(ev); if (ev.Container != null) {
EnsureActivity(ev.Container);
states[ev.Container].Handle(ev);
}
if (ev.Unstamped is EventContainer) {
if (ev.Container != null) EnsureActivity((EventContainer)ev.Unstamped);
}
} }
if (ev.Unstamped is EventContainer) { EventId++;
if (ev.Container != null) EnsureActivity((EventContainer)ev.Unstamped); }
if (time2 == time0) {
while (tempEvents.Count > 0) {
var ev = tempEvents[0];
if (ev.Container != null) {
EnsureActivity(ev.Container);
states[ev.Container].Handle(ev);
}
tempEvents.RemoveAt(0);
} }
} }
ValidateStates(); ValidateStates();
EventId++;
} }
else { else {
Time = toTime; Time = toTime;
@@ -156,6 +163,7 @@ namespace Cryville.Crtr.Event {
public void BroadcastEndUpdate() { public void BroadcastEndUpdate() {
RootState.BroadcastEndUpdate(); RootState.BroadcastEndUpdate();
tempEvents.Clear();
} }
public void Anchor() { public void Anchor() {