Share realtime relative motion nodes across state clones.

This commit is contained in:
2023-04-20 19:45:25 +08:00
parent b937285a74
commit d1ad68debe
2 changed files with 19 additions and 35 deletions

View File

@@ -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<RealtimeMotionValue> Values;
IntKeyedDictionary<MotionCache> CachedValues;
/// <summary>
/// Gets a motion value.
/// </summary>
/// <param name="name">The motion name.</param>
/// <param name="clone">Returns a cloned motion value instead.</param>
/// <returns>A motion value.</returns>
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);

View File

@@ -51,26 +51,18 @@ 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<MotionNode>(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);
if (cloneNodes) {
dest.ReturnAllRelativeNodes();
foreach (var node in RelativeNodes) {
var dnode = MotionNodePool.Shared.Rent(_type);
@@ -78,6 +70,8 @@ namespace Cryville.Crtr {
dest.RelativeNodes.Add(node.Key, dnode);
}
}
else dest.RelativeNodes = RelativeNodes;
}
public void ReturnAllRelativeNodes() {
foreach (var node in RelativeNodes) {