コード例 #1
0
        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);
        }
コード例 #2
0
ファイル: NewJoint.cs プロジェクト: velcrome/mp.essentials
        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;
            }
        }
コード例 #3
0
        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;
            }
        }