Fix pre-graphical update not ended within a frame.

This commit is contained in:
2023-04-20 14:29:50 +08:00
parent 251b7bc352
commit e30df8bdbc

View File

@@ -157,11 +157,11 @@ namespace Cryville.Crtr.Event {
}
#endregion
public virtual void Update(ContainerState s, StampedEvent ev) {
if (s.CloneType == 3) SetPreGraphicalActive(true, s);
else if (ev is StampedEvent.Anchor) {
if (ev is StampedEvent.Anchor) {
var tev = (StampedEvent.Anchor)ev;
if (tev.Target == a_head) {
SetGraphicalActive(true, s);
if (s.CloneType == 2) SetGraphicalActive(true, s);
else SetPreGraphicalActive(true, s);
}
if (RootTransform) {
OpenAnchor(tev.Target);
@@ -175,7 +175,8 @@ namespace Cryville.Crtr.Event {
CloseAnchor();
}
if (tev.Target == a_tail) {
SetGraphicalActive(false, s);
if (s.CloneType == 2) SetGraphicalActive(false, s);
else SetPreGraphicalActive(false, s);
}
anchorEvPool.Return(tev);
}
@@ -206,17 +207,21 @@ namespace Cryville.Crtr.Event {
}
#endregion
#region Anchor
public virtual void PreAnchor() { }
public virtual void Anchor() {
public virtual void PreAnchor() {
foreach (var p in PropSrcs) p.Value.Invalidate();
foreach (var a in DynamicAnchors) DynamicAnchorSetTime[a.Key] = double.NaN;
atime_head = cs.StampedContainer.Time;
atime_tail = atime_head + cs.StampedContainer.Duration;
MatchDynamic(cs, 1);
foreach (var i in _comps) i.Tick(skinContainer, cs.Time);
if (cs.Active) PushAnchorEvent(cs.Time, a_cur);
if (double.IsNaN(DynamicAnchorSetTime[_a_head])) DynamicAnchorSetTime[_a_head] = atime_head;
if (double.IsNaN(DynamicAnchorSetTime[_a_tail])) DynamicAnchorSetTime[_a_tail] = atime_tail;
PushAnchorEvent(ns, atime_head, a_head, -1, true);
PushAnchorEvent(ns, atime_tail, a_tail, 1, true);
foreach (var anchors in Anchors) foreach (var anchor in anchors.Value) anchor.Transform.gameObject.SetActive(false);
}
public virtual void Anchor() {
if (cs.Active) PushAnchorEvent(ts, cs.Time, a_cur);
foreach (var t in DynamicAnchorSetTime) {
if (double.IsNaN(t.Value)) continue;
int priority = 0;
@@ -224,20 +229,19 @@ namespace Cryville.Crtr.Event {
if (t.Key == _a_head) { priority = -1; }
else if (t.Key == _a_tail) { priority = 1; }
else forced = false;
PushAnchorEvent(t.Value, DynamicAnchors[t.Key], priority, forced);
PushAnchorEvent(ts, t.Value, DynamicAnchors[t.Key], priority, forced);
}
foreach (var anchors in Anchors) foreach (var anchor in anchors.Value) anchor.Transform.gameObject.SetActive(false);
}
static readonly SimpleObjectPool<StampedEvent.Anchor> anchorEvPool
= new SimpleObjectPool<StampedEvent.Anchor>(1024);
void PushAnchorEvent(double time, Anchor anchor, int priority = 0, bool forced = false) {
void PushAnchorEvent(ContainerState state, double time, Anchor anchor, int priority = 0, bool forced = false) {
var tev = anchorEvPool.Rent();
tev.Time = time;
tev.Container = Container;
tev.Target = anchor;
tev.Forced = forced;
tev.SetPriority(priority);
ts.Bus.PushTempEvent(tev);
state.Bus.PushTempEvent(tev);
}
public virtual void Discard(ContainerState s, StampedEvent ev) {
if (ev is StampedEvent.Anchor) {