Share realtime relative motion nodes across state clones.
This commit is contained in:
@@ -158,7 +158,7 @@ namespace Cryville.Crtr.Event {
|
|||||||
|
|
||||||
foreach (var mv in Values) {
|
foreach (var mv in Values) {
|
||||||
RealtimeMotionValue dv;
|
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());
|
else dest.Values.Add(mv.Key, mv.Value.Clone());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -231,18 +231,6 @@ namespace Cryville.Crtr.Event {
|
|||||||
IntKeyedDictionary<RealtimeMotionValue> Values;
|
IntKeyedDictionary<RealtimeMotionValue> Values;
|
||||||
IntKeyedDictionary<MotionCache> CachedValues;
|
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) {
|
void InvalidateMotion(int name) {
|
||||||
MotionCache cache;
|
MotionCache cache;
|
||||||
if (!CachedValues.TryGetValue(name, out cache))
|
if (!CachedValues.TryGetValue(name, out cache))
|
||||||
@@ -258,7 +246,7 @@ namespace Cryville.Crtr.Event {
|
|||||||
CachedValues.Add(key, tr = _mcpa.Rent(key));
|
CachedValues.Add(key, tr = _mcpa.Rent(key));
|
||||||
Vector r = tr.Value;
|
Vector r = tr.Value;
|
||||||
if (tr.Valid) return r;
|
if (tr.Valid) return r;
|
||||||
GetMotionValue(key).Compute(ref r);
|
Values[key].Compute(ref r);
|
||||||
if (Parent != null) r.ApplyFrom(Parent.GetComputedValue(key));
|
if (Parent != null) r.ApplyFrom(Parent.GetComputedValue(key));
|
||||||
tr.Valid = true;
|
tr.Valid = true;
|
||||||
return r;
|
return r;
|
||||||
@@ -347,7 +335,7 @@ namespace Cryville.Crtr.Event {
|
|||||||
var tev = (Chart.Motion)ev.Unstamped;
|
var tev = (Chart.Motion)ev.Unstamped;
|
||||||
var mv = _rmvpa.Rent(tev.Name.Key);
|
var mv = _rmvpa.Rent(tev.Name.Key);
|
||||||
mv.CloneTypeFlag = CloneType;
|
mv.CloneTypeFlag = CloneType;
|
||||||
GetMotionValue(tev.Name.Key).CopyTo(mv);
|
Values[tev.Name.Key].CopyTo(mv, true);
|
||||||
PlayingMotions.Add(ev, mv);
|
PlayingMotions.Add(ev, mv);
|
||||||
Update(ev);
|
Update(ev);
|
||||||
if (!ev.Unstamped.IsLong) {
|
if (!ev.Unstamped.IsLong) {
|
||||||
@@ -359,7 +347,7 @@ namespace Cryville.Crtr.Event {
|
|||||||
var tev = (StampedEvent.RelativeMotion)ev;
|
var tev = (StampedEvent.RelativeMotion)ev;
|
||||||
var mv = _rmvpa.Rent(tev.Name);
|
var mv = _rmvpa.Rent(tev.Name);
|
||||||
mv.CloneTypeFlag = CloneType;
|
mv.CloneTypeFlag = CloneType;
|
||||||
GetMotionValue(tev.Name).CopyTo(mv);
|
Values[tev.Name].CopyTo(mv, true);
|
||||||
PlayingMotions.Add(ev, mv);
|
PlayingMotions.Add(ev, mv);
|
||||||
Update(ev);
|
Update(ev);
|
||||||
if (ev.Duration == 0) {
|
if (ev.Duration == 0) {
|
||||||
@@ -418,7 +406,7 @@ namespace Cryville.Crtr.Event {
|
|||||||
foreach (var m in PlayingMotions) {
|
foreach (var m in PlayingMotions) {
|
||||||
if (m.Key is StampedEvent.RelativeMotion) {
|
if (m.Key is StampedEvent.RelativeMotion) {
|
||||||
var tev = (StampedEvent.RelativeMotion)m.Key;
|
var tev = (StampedEvent.RelativeMotion)m.Key;
|
||||||
var value = GetMotionValue(tev.Name);
|
var value = Values[tev.Name];
|
||||||
InvalidateMotion(tev.Name);
|
InvalidateMotion(tev.Name);
|
||||||
if (tev.Duration == 0) {
|
if (tev.Duration == 0) {
|
||||||
tev.Node.Value.CopyTo(value.RelativeValue);
|
tev.Node.Value.CopyTo(value.RelativeValue);
|
||||||
@@ -432,10 +420,11 @@ namespace Cryville.Crtr.Event {
|
|||||||
else {
|
else {
|
||||||
var tev = (Chart.Motion)m.Key.Unstamped;
|
var tev = (Chart.Motion)m.Key.Unstamped;
|
||||||
if (tev.Node.Id >= 0 && (CloneType == 2 || CloneType == 3)) continue;
|
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);
|
InvalidateMotion(tev.Name.Key);
|
||||||
if (m.Key.Duration == 0) {
|
if (m.Key.Duration == 0) {
|
||||||
if (tev.Node.Id >= 0) {
|
if (tev.Node.Id >= 0) {
|
||||||
|
if (CloneType != 0) continue;
|
||||||
value.SetRelativeNode(tev.Node);
|
value.SetRelativeNode(tev.Node);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -446,6 +435,7 @@ namespace Cryville.Crtr.Event {
|
|||||||
var scaledTime = (float)((Time - m.Key.Time - ChartPlayer.actualRenderStep * tev.sumfix) / m.Key.Duration);
|
var scaledTime = (float)((Time - m.Key.Time - ChartPlayer.actualRenderStep * tev.sumfix) / m.Key.Duration);
|
||||||
var transition = GetTransition(scaledTime, tev.transition);
|
var transition = GetTransition(scaledTime, tev.transition);
|
||||||
if (tev.Node.Id >= 0) {
|
if (tev.Node.Id >= 0) {
|
||||||
|
if (CloneType != 0) continue;
|
||||||
var start = m.Value.GetRelativeNode(tev.Node.Id);
|
var start = m.Value.GetRelativeNode(tev.Node.Id);
|
||||||
if (start == null) {
|
if (start == null) {
|
||||||
value.SetRelativeNode(tev.Node);
|
value.SetRelativeNode(tev.Node);
|
||||||
|
@@ -51,32 +51,26 @@ namespace Cryville.Crtr {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public RealtimeMotionValue Clone() {
|
public RealtimeMotionValue Clone() {
|
||||||
var r = new RealtimeMotionValue() {
|
return new RealtimeMotionValue() {
|
||||||
_type = _type,
|
_type = _type,
|
||||||
AbsoluteValue = AbsoluteValue.Clone(),
|
AbsoluteValue = AbsoluteValue.Clone(),
|
||||||
RelativeValue = RelativeValue.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);
|
AbsoluteValue.CopyTo(dest.AbsoluteValue);
|
||||||
RelativeValue.CopyTo(dest.RelativeValue);
|
RelativeValue.CopyTo(dest.RelativeValue);
|
||||||
dest.ReturnAllRelativeNodes();
|
if (cloneNodes) {
|
||||||
foreach (var node in RelativeNodes) {
|
dest.ReturnAllRelativeNodes();
|
||||||
var dnode = MotionNodePool.Shared.Rent(_type);
|
foreach (var node in RelativeNodes) {
|
||||||
node.Value.CopyTo(dnode);
|
var dnode = MotionNodePool.Shared.Rent(_type);
|
||||||
dest.RelativeNodes.Add(node.Key, dnode);
|
node.Value.CopyTo(dnode);
|
||||||
|
dest.RelativeNodes.Add(node.Key, dnode);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
else dest.RelativeNodes = RelativeNodes;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ReturnAllRelativeNodes() {
|
public void ReturnAllRelativeNodes() {
|
||||||
|
Reference in New Issue
Block a user