From d1ad68debe64ea5cd18b1cd18a39ba4b14917d65 Mon Sep 17 00:00:00 2001 From: PopSlime Date: Thu, 20 Apr 2023 19:45:25 +0800 Subject: [PATCH] Share realtime relative motion nodes across state clones. --- Assets/Cryville/Crtr/Event/ContainerState.cs | 26 ++++++------------ Assets/Cryville/Crtr/Motion.cs | 28 ++++++++------------ 2 files changed, 19 insertions(+), 35 deletions(-) diff --git a/Assets/Cryville/Crtr/Event/ContainerState.cs b/Assets/Cryville/Crtr/Event/ContainerState.cs index 994675f..e611545 100644 --- a/Assets/Cryville/Crtr/Event/ContainerState.cs +++ b/Assets/Cryville/Crtr/Event/ContainerState.cs @@ -158,7 +158,7 @@ namespace Cryville.Crtr.Event { foreach (var mv in Values) { RealtimeMotionValue dv; - if (dest.Values.TryGetValue(mv.Key, out dv)) mv.Value.CopyTo(dv); + if (dest.Values.TryGetValue(mv.Key, out dv)) mv.Value.CopyTo(dv, false); else dest.Values.Add(mv.Key, mv.Value.Clone()); } @@ -231,18 +231,6 @@ namespace Cryville.Crtr.Event { IntKeyedDictionary Values; IntKeyedDictionary CachedValues; - /// - /// Gets a motion value. - /// - /// The motion name. - /// Returns a cloned motion value instead. - /// A motion value. - RealtimeMotionValue GetMotionValue(int name, bool clone = false) { - RealtimeMotionValue value = Values[name]; - if (clone) return value.Clone(); - return value; - } - void InvalidateMotion(int name) { MotionCache cache; if (!CachedValues.TryGetValue(name, out cache)) @@ -258,7 +246,7 @@ namespace Cryville.Crtr.Event { CachedValues.Add(key, tr = _mcpa.Rent(key)); Vector r = tr.Value; if (tr.Valid) return r; - GetMotionValue(key).Compute(ref r); + Values[key].Compute(ref r); if (Parent != null) r.ApplyFrom(Parent.GetComputedValue(key)); tr.Valid = true; return r; @@ -347,7 +335,7 @@ namespace Cryville.Crtr.Event { var tev = (Chart.Motion)ev.Unstamped; var mv = _rmvpa.Rent(tev.Name.Key); mv.CloneTypeFlag = CloneType; - GetMotionValue(tev.Name.Key).CopyTo(mv); + Values[tev.Name.Key].CopyTo(mv, true); PlayingMotions.Add(ev, mv); Update(ev); if (!ev.Unstamped.IsLong) { @@ -359,7 +347,7 @@ namespace Cryville.Crtr.Event { var tev = (StampedEvent.RelativeMotion)ev; var mv = _rmvpa.Rent(tev.Name); mv.CloneTypeFlag = CloneType; - GetMotionValue(tev.Name).CopyTo(mv); + Values[tev.Name].CopyTo(mv, true); PlayingMotions.Add(ev, mv); Update(ev); if (ev.Duration == 0) { @@ -418,7 +406,7 @@ namespace Cryville.Crtr.Event { foreach (var m in PlayingMotions) { if (m.Key is StampedEvent.RelativeMotion) { var tev = (StampedEvent.RelativeMotion)m.Key; - var value = GetMotionValue(tev.Name); + var value = Values[tev.Name]; InvalidateMotion(tev.Name); if (tev.Duration == 0) { tev.Node.Value.CopyTo(value.RelativeValue); @@ -432,10 +420,11 @@ namespace Cryville.Crtr.Event { else { var tev = (Chart.Motion)m.Key.Unstamped; if (tev.Node.Id >= 0 && (CloneType == 2 || CloneType == 3)) continue; - var value = GetMotionValue(tev.Name.Key); + var value = Values[tev.Name.Key]; InvalidateMotion(tev.Name.Key); if (m.Key.Duration == 0) { if (tev.Node.Id >= 0) { + if (CloneType != 0) continue; value.SetRelativeNode(tev.Node); } else { @@ -446,6 +435,7 @@ namespace Cryville.Crtr.Event { var scaledTime = (float)((Time - m.Key.Time - ChartPlayer.actualRenderStep * tev.sumfix) / m.Key.Duration); var transition = GetTransition(scaledTime, tev.transition); if (tev.Node.Id >= 0) { + if (CloneType != 0) continue; var start = m.Value.GetRelativeNode(tev.Node.Id); if (start == null) { value.SetRelativeNode(tev.Node); diff --git a/Assets/Cryville/Crtr/Motion.cs b/Assets/Cryville/Crtr/Motion.cs index b714c57..9c16838 100644 --- a/Assets/Cryville/Crtr/Motion.cs +++ b/Assets/Cryville/Crtr/Motion.cs @@ -51,32 +51,26 @@ namespace Cryville.Crtr { } public RealtimeMotionValue Clone() { - var r = new RealtimeMotionValue() { + return new RealtimeMotionValue() { _type = _type, AbsoluteValue = AbsoluteValue.Clone(), RelativeValue = RelativeValue.Clone(), + RelativeNodes = RelativeNodes, }; - - var rel = new IntKeyedDictionary(RelativeNodes.Count); - foreach (var node in RelativeNodes) { - var dnode = MotionNodePool.Shared.Rent(_type); - node.Value.CopyTo(dnode); - rel.Add(node.Key, dnode); - } - r.RelativeNodes = rel; - - return r; } - public void CopyTo(RealtimeMotionValue dest) { + public void CopyTo(RealtimeMotionValue dest, bool cloneNodes) { AbsoluteValue.CopyTo(dest.AbsoluteValue); RelativeValue.CopyTo(dest.RelativeValue); - dest.ReturnAllRelativeNodes(); - foreach (var node in RelativeNodes) { - var dnode = MotionNodePool.Shared.Rent(_type); - node.Value.CopyTo(dnode); - dest.RelativeNodes.Add(node.Key, dnode); + if (cloneNodes) { + dest.ReturnAllRelativeNodes(); + foreach (var node in RelativeNodes) { + var dnode = MotionNodePool.Shared.Rent(_type); + node.Value.CopyTo(dnode); + dest.RelativeNodes.Add(node.Key, dnode); + } } + else dest.RelativeNodes = RelativeNodes; } public void ReturnAllRelativeNodes() {