public IJoint DeepCopy() { JointInfoV2 copy = new JointInfoV2(Id, Name); copy.BaseTransform = new Matrix4x4(BaseTransform); copy.AnimationTransform = new Matrix4x4(AnimationTransform); foreach (IJoint child in Children) { copy.AddChild(child.DeepCopy()); } for (int i = 0; i < 3; i++) { copy.Constraints[i] = new Vector2D(Constraints[i]); } return(copy); }
public void Evaluate(int SpreadMax) { if (FJointNameIn.SliceCount == 0 || FConstraintsIn.SliceCount == 0 || FBaseTrIn.SliceCount == 0) { FOut.SliceCount = 0; return; } if (FJointNameIn.IsChanged || FConstraintsIn.IsChanged || FBaseTrIn.IsChanged || FChildren.IsChanged) { FOut.Stream.IsChanged = true; var spreadmax = new[] { FJointNameIn.SliceCount, FBaseTrIn.SliceCount, FConstraintsIn.SliceCount, FChildren.SliceCount }; for (int i = 0; i < spreadmax.Max(); i++) { if (FOut[i] == null) { FOut[i] = new JointInfoV2(0, FJointNameIn[i]); } FOut[i].Name = FJointNameIn[i]; FOut[i].BaseTransform = new Matrix4x4(FBaseTrIn[i]); FOut[i].Constraints = FConstraintsIn[i].ToList(); if (FChildren.SliceCount == 0) { continue; } if (FChildren[i][0] == null) { continue; } FOut[i].ChildrenChanged = false; for (int j = 0; j < FChildren[i].SliceCount; j++) { if (!(FChildren[i][j] is JointInfoV2)) { continue; } var joint = (JointInfoV2)FChildren[i][j]; if (joint.ChildrenChanged) { FOut[i].ChildrenChanged = true; break; } } if (FOut[i].Children.Count == FChildren[i].SliceCount) { for (int j = 0; j < FOut[i].Children.Count; j++) { FOut[i].Children[j] = FChildren[i][j]; } } else if (FChildren[i].SliceCount == 0) { FOut[i].Children.Clear(); FOut[i].ChildrenChanged = true; } else { FOut[i].Children.Clear(); FOut[i].Children.AddRange(FChildren[i]); FOut[i].ChildrenChanged = true; } } } else { FOut.Stream.IsChanged = false; } }
public void Evaluate(int SpreadMax) { if ( FJointNameIn.SliceCount == 0 || FParentNameIn.SliceCount == 0 || FBaseTrIn.SliceCount == 0 || FConstraintsIn.SliceCount == 0 || FOffsetModeIn.SliceCount == 0 ) { FOut.SliceCount = 0; return; } if ( FJointNameIn.IsChanged || FParentNameIn.IsChanged || FBaseTrIn.IsChanged || FConstraintsIn.IsChanged || FOffsetModeIn.IsChanged ) { FOut.Stream.IsChanged = true; var spreadmax = new [] { FJointNameIn.SliceCount, FParentNameIn.SliceCount, FBaseTrIn.SliceCount, FConstraintsIn.SliceCount }; for (int i = 0; i < spreadmax.Max(); i++) { if (FOut[i] == null) { FOut[i] = new Skeleton(); } FOut[i].RenewUid(); var currid = 0; for (int j = 0; j < FJointNameIn[i].SliceCount; j++) { if (string.IsNullOrWhiteSpace(FJointNameIn[i][j])) { continue; } var currjoint = new JointInfoV2(0, FJointNameIn[i][j]); currjoint.BaseTransform = FBaseTrIn[i][j]; currjoint.Constraints.Clear(); for (int k = j * 3; k < j * 3 + 3; k++) { currjoint.Constraints.Add(new Vector2D(FConstraintsIn[i][k])); } if (string.IsNullOrWhiteSpace(FParentNameIn[i][j])) { if (FOut[i].Root == null) { FOut[i].Root = currjoint; currjoint.Id = currid; currid++; FOut[i].BuildJointTable(); } } else { if (FOut[i].JointTable.ContainsKey(FParentNameIn[i][j])) { currjoint.Parent = FOut[i].JointTable[FParentNameIn[i][j]]; currjoint.Id = currid; currid++; FOut[i].BuildJointTable(); } } if (FOffsetModeIn[i] == OffsetMode.World) { List <Vector3D> offsetList = new List <Vector3D>(); foreach (KeyValuePair <string, IJoint> pair in FOut[i].JointTable) { Vector3D worldPos = pair.Value.BaseTransform * (new Vector3D(0)); Vector3D parentWorldPos; if (pair.Value.Parent != null) { parentWorldPos = pair.Value.Parent.BaseTransform * (new Vector3D(0)); } else { parentWorldPos = new Vector3D(0); } Vector3D offset = worldPos - parentWorldPos; offsetList.Add(offset); } int k = 0; foreach (var pair in FOut[i].JointTable) { pair.Value.BaseTransform = VMath.Translate(offsetList[k]); k++; } } } } } else { FOut.Stream.IsChanged = false; } }