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

@@ -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() {