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) {
|
||||
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);
|
||||
|
@@ -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<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);
|
||||
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() {
|
||||
|
Reference in New Issue
Block a user