Пример #1
0
        public void DeleteBone(RigResource.RigResource.Bone b, bool recursive)
        {
            if (b != null && mBones.Contains(b))
            {
                int deletedIndex = IndexOfBone(mBones, b);
                RigResource.RigResource.Bone parent = b.ParentBoneIndex > -1 ? mBones[b.ParentBoneIndex] : null;

                mBones.Remove(b);
                OnBoneRemoved(this, new BoneActionEventArgs(b));
                var trash = new List<RigResource.RigResource.Bone>();
                for (int i = 0; i < mBones.Count; i++)
                {
                    if (mBones[i].ParentBoneIndex > deletedIndex)
                    {
                        mBones[i].ParentBoneIndex--;
                    }
                    else if (mBones[i].ParentBoneIndex == deletedIndex)
                    {
                        if (recursive)
                        {
                            trash.Add(mBones[i]);
                        }
                    }
                }
                foreach (RigResource.RigResource.Bone item in trash) DeleteBone(item, recursive);
            }
        }
Пример #2
0
 public RigEditorViewModel(RigResource.RigResource rig)
 {
     rig.ResourceChanged += OnResourceChanged;
     mIsSaving = false;
     mChildren = new ObservableCollection<BoneViewModel>();
     mRig = rig;
     mManager = new BoneManager();
     mManager.Bones = mRig.Bones;
     foreach (RigResource.RigResource.Bone bone in mRig.Bones)
     {
         if (bone.ParentBoneIndex == -1)
         {
             mChildren.Add(new BoneViewModel(this, this, bone, mManager));
         }
     }
     mManager.BoneAdded += OnBoneAdded;
     mManager.BoneRemoved += OnBoneRemoved;
     mManager.BoneParentChanged += OnBoneParentChanged;
     AddBoneCommand = new UserCommand<RigEditorViewModel>(x => true, y => y.Manager.AddBone(new RigResource.RigResource.Bone(0, null), null));
     GetMatrixInfoCommand = new UserCommand<RigEditorViewModel>(x => true, ExecuteMatrixInfo);
     CommitCommand = new UserCommand<RigEditorViewModel>(x => true, y =>
         {
             mIsSaving = true;
             Application.Current.Shutdown();
         });
     CancelCommand = new UserCommand<RigEditorViewModel>(x => true, y =>
         {
             mIsSaving = false;
             Application.Current.Shutdown();
         });
     IResourceKey key = new TGIBlock(0, null);
     key.ResourceType = 0x00000000;
 }
Пример #3
0
 public IEnumerable<RigResource.RigResource.Bone> GetChildren(RigResource.RigResource.Bone b)
 {
     int ix = IndexOfBone(mBones, b);
     for (int i = 0; i < mBones.Count; i++)
     {
         if (mBones[i].ParentBoneIndex == ix) yield return mBones[i];
     }
 }
Пример #4
0
 public BoneViewModel(RigEditorViewModel rig, IHaveBones parent, RigResource.RigResource.Bone bone, BoneManager manager)
 {
     if (rig == null) throw new ArgumentNullException("rig");
     if (bone == null) throw new ArgumentNullException("bone");
     if (manager == null) throw new ArgumentNullException("manager");
     mRig = rig;
     mChildren = new ObservableCollection<BoneViewModel>();
     mParent = parent;
     mBone = bone;
     mManager = manager;
     foreach (RigResource.RigResource.Bone b in manager.GetChildren(mBone))
     {
         mChildren.Add(new BoneViewModel(mRig, this, b, mManager));
     }
     mRotation = new EulerAngle(new Quaternion(bone.Orientation.A, bone.Orientation.B, bone.Orientation.C, bone.Orientation.D));
     manager.BoneAdded += OnBoneAdded;
     manager.BoneRemoved += OnBoneRemoved;
     manager.BoneParentChanged += OnBoneParentChanged;
     mSetOppositeCommand = new UserCommand<BoneViewModel>(x => true, ExecuteSetOpposite);
 }
 public BoneExportViewModel(RigResource.RigResource.Bone bone, BoneManager manager)
 {
     mIsChecked = bone.Name.Contains("slot");
     Bone = bone;
     mChildren = manager.GetChildren(bone).Select(x => new BoneExportViewModel(x, manager));
     //            if (bone.Name.Contains("ROOT"))
     //            {
     //                Thread t = null;
     //                t = new Thread(
     //                    delegate
     //                        {
     //                            while (t.IsAlive)
     //                            {
     //                                Thread.Sleep(new Random().Next(10000));
     //                                IsChecked = !IsChecked;
     //                            }
     //                        });
     //                t.Start();
     //            }
 }
Пример #6
0
 public IEnumerable<RigResource.RigResource.Bone> GetDescendants(RigResource.RigResource.Bone b)
 {
     var list = new List<RigResource.RigResource.Bone>();
     GetDescendantsRecursive(b, list);
     return list;
 }
Пример #7
0
 public void AddBone(RigResource.RigResource.Bone child, RigResource.RigResource.Bone parent)
 {
     Bones.Add(child);
     OnBoneAdded(this, new BoneActionEventArgs(child));
     SetParent(child, parent);
 }
Пример #8
0
 private void GetDescendantsRecursive(RigResource.RigResource.Bone b, IList<RigResource.RigResource.Bone> list)
 {
     int ix = IndexOfBone(mBones, b);
     for (int i = 0; i < mBones.Count; i++)
     {
         if (mBones[i].ParentBoneIndex == ix)
         {
             list.Add(mBones[i]);
             GetDescendantsRecursive(mBones[i], list);
         }
     }
 }
Пример #9
0
 public void UpdateBone(RigResource.RigResource.Bone b)
 {
     OnBoneUpdated(this, new BoneActionEventArgs(b));
 }
Пример #10
0
 public void SetName(RigResource.RigResource.Bone b, string name)
 {
     if (b.Name != name)
     {
         b.Name = name;
         OnBoneUpdated(this, new BoneActionEventArgs(b));
     }
 }
Пример #11
0
 public int IndexOfBone(IList<RigResource.RigResource.Bone> bones, RigResource.RigResource.Bone bone)
 {
     for (int i = 0; i < bones.Count; i++)
     {
         if (bone == bones[i]) return i;
     }
     return -1;
 }
Пример #12
0
 private static void GetInfo(BoneManager manager, RigResource.RigResource.Bone bone, StringBuilder sb)
 {
     Matrix t = GetAbsoluteTransform(manager, bone);
     Matrix ti = t.GetInverse();
     sb.AppendLine("============================");
     sb.AppendFormat("Name:\t{0}\r\n", bone.Name);
     sb.AppendFormat("Hashed:\t0x{0:X8}\r\n", FNV32.GetHash(bone.Name));
     sb.AppendLine("Absolute Transform (RSLT):");
     sb.AppendLine(t.TransposedString());
     sb.AppendLine("Absolute Transform Inverse (SKIN):");
     sb.AppendLine(ti.ToString());
 }
Пример #13
0
 private static Matrix GetAbsoluteTransform(BoneManager manager, RigResource.RigResource.Bone b)
 {
     var transforms = new List<Matrix>();
     while (b != null)
     {
         var q = new Quaternion(b.Orientation.A, b.Orientation.B, b.Orientation.C, b.Orientation.D);
         var p = new Vector3(b.Position.X, b.Position.Y, b.Position.Z);
         var s = new Vector3(b.Scaling.X, b.Scaling.Y, b.Scaling.Z);
         Matrix t = Matrix.CreateTransformMatrix(q, s, p);
         transforms.Add(t);
         b = manager.GetParent(b);
     }
     transforms.Reverse();
     Matrix absolute = transforms[0];
     transforms.RemoveAt(0);
     while (transforms.Count > 0)
     {
         Matrix m = transforms[0];
         transforms.RemoveAt(0);
         absolute = absolute*m;
     }
     return absolute;
 }
Пример #14
0
 public BoneListItem(RigResource.RigResource.Bone bone)
 {
     Bone = bone;
 }
Пример #15
0
 public BoneActionEventArgs(RigResource.RigResource.Bone bone)
 {
     mBone = bone;
 }
Пример #16
0
 public RigResource.RigResource.Bone GetParent(RigResource.RigResource.Bone b)
 {
     if (b.ParentBoneIndex == -1) return null;
     else return mBones[b.ParentBoneIndex];
 }
Пример #17
0
 public void SetParent(RigResource.RigResource.Bone child, RigResource.RigResource.Bone parent)
 {
     if (child.ParentBoneIndex != IndexOfBone(mBones, parent))
     {
         child.ParentBoneIndex = parent == null ? -1 : IndexOfBone(mBones, parent);
         OnBoneParentChanged(this, new BoneActionEventArgs(child));
     }
 }
Пример #18
0
        private static void CloneHierarchy(BoneManager manager, RigResource.RigResource.Bone bone, RigResource.RigResource.Bone dest)
        {
            List<RigResource.RigResource.Bone> descendants = manager.GetDescendants(bone).ToList();
            var clones = new List<RigResource.RigResource.Bone>();
            var map = new Dictionary<RigResource.RigResource.Bone, RigResource.RigResource.Bone>();
            var root = new RigResource.RigResource.Bone(0, null, bone);
            map[bone] = root;
            manager.AddBone(root, dest);

            foreach (RigResource.RigResource.Bone descendant in descendants)
            {
                var clone = new RigResource.RigResource.Bone(0, null, descendant);
                map[descendant] = clone;
                clones.Add(clone);
                manager.AddBone(clone, manager.GetParent(descendant));
            }
            foreach (RigResource.RigResource.Bone c in clones)
            {
                RigResource.RigResource.Bone parent = manager.GetParent(c);
                if (map.ContainsKey(parent))
                {
                    manager.SetParent(c, map[parent]);
                }
            }
        }