Implement coevent. (2)
This commit is contained in:
@@ -149,6 +149,7 @@ namespace Cryville.Crtr {
|
|||||||
nbus.BroadcastEndUpdate();
|
nbus.BroadcastEndUpdate();
|
||||||
nbus.Anchor();
|
nbus.Anchor();
|
||||||
|
|
||||||
|
tbus.StripTempEvents();
|
||||||
tbus.ForwardStepByTime(clippingDist, step);
|
tbus.ForwardStepByTime(clippingDist, step);
|
||||||
tbus.ForwardStepByTime(renderDist, step);
|
tbus.ForwardStepByTime(renderDist, step);
|
||||||
tbus.BroadcastEndUpdate();
|
tbus.BroadcastEndUpdate();
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ namespace Cryville.Crtr.Event {
|
|||||||
public class ContainerState {
|
public class ContainerState {
|
||||||
public EventBus Bus;
|
public EventBus Bus;
|
||||||
public EventContainer Container;
|
public EventContainer Container;
|
||||||
|
public StampedEvent StampedContainer;
|
||||||
public ContainerState Parent = null;
|
public ContainerState Parent = null;
|
||||||
public ushort Depth;
|
public ushort Depth;
|
||||||
|
|
||||||
@@ -38,6 +39,7 @@ namespace Cryville.Crtr.Event {
|
|||||||
InvalidatedChildren.Clear();
|
InvalidatedChildren.Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool Active { get; set; }
|
||||||
private bool m_Working;
|
private bool m_Working;
|
||||||
public bool Working {
|
public bool Working {
|
||||||
get { return m_Working; }
|
get { return m_Working; }
|
||||||
|
|||||||
@@ -12,6 +12,8 @@ namespace Cryville.Crtr.Event {
|
|||||||
ContainerState RootState;
|
ContainerState RootState;
|
||||||
readonly Dictionary<ChartEvent, ContainerState> containerMap
|
readonly Dictionary<ChartEvent, ContainerState> containerMap
|
||||||
= new Dictionary<ChartEvent, ContainerState>();
|
= new Dictionary<ChartEvent, ContainerState>();
|
||||||
|
readonly Dictionary<EventContainer, ContainerState> stateMap
|
||||||
|
= new Dictionary<EventContainer, ContainerState>();
|
||||||
readonly Dictionary<ChartEvent, StampedEvent> map
|
readonly Dictionary<ChartEvent, StampedEvent> map
|
||||||
= new Dictionary<ChartEvent, StampedEvent>();
|
= new Dictionary<ChartEvent, StampedEvent>();
|
||||||
public Dictionary<EventContainer, List<StampedEvent>> coeventMap
|
public Dictionary<EventContainer, List<StampedEvent>> coeventMap
|
||||||
@@ -34,6 +36,7 @@ namespace Cryville.Crtr.Event {
|
|||||||
|
|
||||||
void AddEventContainer(EventContainer c, ContainerState parent = null) {
|
void AddEventContainer(EventContainer c, ContainerState parent = null) {
|
||||||
var cs = new ContainerState(chart, c, parent);
|
var cs = new ContainerState(chart, c, parent);
|
||||||
|
stateMap.Add(c, cs);
|
||||||
if (parent == null) {
|
if (parent == null) {
|
||||||
cs.Depth = 0;
|
cs.Depth = 0;
|
||||||
RootState = cs;
|
RootState = cs;
|
||||||
@@ -78,6 +81,9 @@ namespace Cryville.Crtr.Event {
|
|||||||
Unstamped = ev,
|
Unstamped = ev,
|
||||||
Container = con
|
Container = con
|
||||||
};
|
};
|
||||||
|
if (ev is EventContainer) {
|
||||||
|
stateMap[(EventContainer)ev].StampedContainer = sev;
|
||||||
|
}
|
||||||
if (ev is InstantEvent) {
|
if (ev is InstantEvent) {
|
||||||
var tev = (InstantEvent)ev;
|
var tev = (InstantEvent)ev;
|
||||||
var pev = map[tev.Original];
|
var pev = map[tev.Original];
|
||||||
@@ -146,8 +152,8 @@ namespace Cryville.Crtr.Event {
|
|||||||
ocevs.Add(cev);
|
ocevs.Add(cev);
|
||||||
BatchCoevents(cev, ocevs);
|
BatchCoevents(cev, ocevs);
|
||||||
}
|
}
|
||||||
ocevs.Add(ev);
|
|
||||||
if (rootFlag) ocevs.Sort(CompareStampedEvents);
|
if (rootFlag) ocevs.Sort(CompareStampedEvents);
|
||||||
|
else ocevs.Add(ev);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -86,8 +86,18 @@ namespace Cryville.Crtr.Event {
|
|||||||
|
|
||||||
void EnsureActivity(EventContainer c) {
|
void EnsureActivity(EventContainer c) {
|
||||||
if (activeContainers.Contains(c)) return;
|
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);
|
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() {
|
void AttachBus() {
|
||||||
@@ -107,6 +117,14 @@ namespace Cryville.Crtr.Event {
|
|||||||
tempEvents.Insert(index, ev);
|
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) {
|
public override void ForwardOnceToTime(double toTime) {
|
||||||
double time1 = EventId < events.Count ? events[EventId].Time : double.PositiveInfinity;
|
double time1 = EventId < events.Count ? events[EventId].Time : double.PositiveInfinity;
|
||||||
double time2 = tempEvents.Count > 0 ? tempEvents[0].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];
|
var batch = events[EventId];
|
||||||
for (var i = 0; i < batch.Count; i++) {
|
for (var i = 0; i < batch.Count; i++) {
|
||||||
var ev = batch[i];
|
var ev = batch[i];
|
||||||
if (ev.Coevents == null) {
|
|
||||||
if (ev.Container != null) {
|
if (ev.Container != null) {
|
||||||
EnsureActivity(ev.Container);
|
if (ev.Unstamped is EventContainer) EnsureActivity((EventContainer)ev.Unstamped);
|
||||||
|
else EnsureActivity(ev.Container);
|
||||||
states[ev.Container].Handle(ev);
|
states[ev.Container].Handle(ev);
|
||||||
}
|
}
|
||||||
}
|
else if (ev.Coevents != null) EnsureActivity((EventContainer)ev.Unstamped);
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
EventId++;
|
EventId++;
|
||||||
}
|
}
|
||||||
if (time2 == time0) {
|
if (time2 == time0) {
|
||||||
while (tempEvents.Count > 0) {
|
while (tempEvents.Count > 0) {
|
||||||
var ev = tempEvents[0];
|
var ev = tempEvents[0];
|
||||||
|
if (ev.Time != time0) break;
|
||||||
if (ev.Container != null) {
|
if (ev.Container != null) {
|
||||||
EnsureActivity(ev.Container);
|
EnsureActivity(ev.Container);
|
||||||
states[ev.Container].Handle(ev);
|
states[ev.Container].Handle(ev);
|
||||||
|
|||||||
Reference in New Issue
Block a user