Implement coevent. (2)
This commit is contained in:
@@ -86,8 +86,18 @@ namespace Cryville.Crtr.Event {
|
||||
|
||||
void EnsureActivity(EventContainer c) {
|
||||
if (activeContainers.Contains(c)) return;
|
||||
if (RootState.CloneType >= 2) prototype.states[c].CopyTo(RootState.CloneType, states[c]);
|
||||
var state = states[c];
|
||||
if (state.Parent != null) EnsureActivity(state.Parent.Container);
|
||||
if (RootState.CloneType >= 2) prototype.states[c].CopyTo(RootState.CloneType, state);
|
||||
state.Active = true;
|
||||
activeContainers.Add(c);
|
||||
|
||||
if (state.StampedContainer.Coevents == null) return;
|
||||
foreach (var cev in state.StampedContainer.Coevents) {
|
||||
if (cev.Container == null) continue;
|
||||
EnsureActivity(cev.Container);
|
||||
states[cev.Container].Handle(cev);
|
||||
}
|
||||
}
|
||||
|
||||
void AttachBus() {
|
||||
@@ -107,6 +117,14 @@ namespace Cryville.Crtr.Event {
|
||||
tempEvents.Insert(index, ev);
|
||||
}
|
||||
|
||||
readonly StampedEvent _dummyEvent = new StampedEvent();
|
||||
public void StripTempEvents() {
|
||||
_dummyEvent.Time = Time;
|
||||
var index = tempEvents.BinarySearch(_dummyEvent);
|
||||
if (index < 0) index = ~index;
|
||||
tempEvents.RemoveRange(0, index);
|
||||
}
|
||||
|
||||
public override void ForwardOnceToTime(double toTime) {
|
||||
double time1 = EventId < events.Count ? events[EventId].Time : double.PositiveInfinity;
|
||||
double time2 = tempEvents.Count > 0 ? tempEvents[0].Time : double.PositiveInfinity;
|
||||
@@ -119,26 +137,19 @@ namespace Cryville.Crtr.Event {
|
||||
var batch = events[EventId];
|
||||
for (var i = 0; i < batch.Count; i++) {
|
||||
var ev = batch[i];
|
||||
if (ev.Coevents == null) {
|
||||
if (ev.Container != null) {
|
||||
EnsureActivity(ev.Container);
|
||||
states[ev.Container].Handle(ev);
|
||||
}
|
||||
}
|
||||
else foreach (var cev in ev.Coevents) {
|
||||
if (cev.Container == null) continue;
|
||||
EnsureActivity(cev.Container);
|
||||
states[cev.Container].Handle(cev);
|
||||
}
|
||||
if (ev.Unstamped is EventContainer) {
|
||||
if (ev.Container != null) EnsureActivity((EventContainer)ev.Unstamped);
|
||||
if (ev.Container != null) {
|
||||
if (ev.Unstamped is EventContainer) EnsureActivity((EventContainer)ev.Unstamped);
|
||||
else EnsureActivity(ev.Container);
|
||||
states[ev.Container].Handle(ev);
|
||||
}
|
||||
else if (ev.Coevents != null) EnsureActivity((EventContainer)ev.Unstamped);
|
||||
}
|
||||
EventId++;
|
||||
}
|
||||
if (time2 == time0) {
|
||||
while (tempEvents.Count > 0) {
|
||||
var ev = tempEvents[0];
|
||||
if (ev.Time != time0) break;
|
||||
if (ev.Container != null) {
|
||||
EnsureActivity(ev.Container);
|
||||
states[ev.Container].Handle(ev);
|
||||
|
Reference in New Issue
Block a user