Exemple #1
0
 private static Vector2 GetBonePositionInSpaceOfParent(Bone node)
 {
     return(node.Position * node.CalcLocalToParentWidgetTransform());
 }
Exemple #2
0
        private IEnumerator <object> Drag(Bone bone, BoneArray.Entry entry)
        {
            using (Document.Current.History.BeginTransaction()) {
                var iniMousePos       = sv.MousePosition;
                var transform         = Document.Current.Container.AsWidget.LocalToWorldTransform.CalcInversed();
                var transformInversed = transform.CalcInversed();
                int index             = 0;
                var dragDelta         = Vector2.Zero;
                while (sv.Input.IsMousePressed())
                {
                    Document.Current.History.RollbackTransaction();

                    var snapEnabled = sv.Input.IsKeyPressed(Key.Alt);
                    Utils.ChangeCursorIfDefault(MouseCursor.Hand);
                    var items = Document.Current.Container.AsWidget.BoneArray.items;
                    index = 0;
                    SceneView.Instance.Components.GetOrAdd <CreateBoneHelper>().HitTip = default(Vector2);
                    if (items != null && snapEnabled)
                    {
                        for (var i = 0; i < items.Length; i++)
                        {
                            if (sv.HitTestControlPoint(transformInversed * items[i].Tip))
                            {
                                index = i;
                                break;
                            }
                        }
                        if (bone.Index != index)
                        {
                            SceneView.Instance.Components.GetOrAdd <CreateBoneHelper>().HitTip =
                                index != 0 ? items[index].Tip : default(Vector2);
                        }
                    }
                    var b = bone.Parent.AsWidget.BoneArray[bone.BaseIndex];
                    dragDelta = sv.MousePosition * transform - iniMousePos * transform;
                    var parentToLocalTransform = bone.CalcLocalToParentWidgetTransform().CalcInversed();
                    parentToLocalTransform.T = Vector2.Zero;
                    var position = parentToLocalTransform *
                                   (entry.Joint - b.Tip + (index != 0 && index != bone.Index && snapEnabled ? items[index].Tip - entry.Joint : dragDelta));
                    Core.Operations.SetAnimableProperty.Perform(bone, nameof(Bone.Position), position, CoreUserPreferences.Instance.AutoKeyframes);

                    bone.Parent.Update(0);
                    yield return(null);
                }
                if (index != bone.Index && sv.Input.IsKeyPressed(Key.Alt))
                {
                    Core.Operations.SetAnimableProperty.Perform(bone, nameof(Bone.Position), index == 0 ? entry.Joint + dragDelta : Vector2.Zero, CoreUserPreferences.Instance.AutoKeyframes);
                    var   parentEntry = bone.Parent.AsWidget.BoneArray[index];
                    float parentAngle = (parentEntry.Tip - parentEntry.Joint).Atan2Deg;
                    var   boneEntry   = bone.Parent.AsWidget.BoneArray[bone.Index];
                    float boneAngle   = (boneEntry.Tip - boneEntry.Joint).Atan2Deg;
                    Core.Operations.SetAnimableProperty.Perform(bone, nameof(Bone.Rotation), index == 0 ? boneAngle : boneAngle - parentAngle, CoreUserPreferences.Instance.AutoKeyframes);
                    Core.Operations.SetAnimableProperty.Perform(bone, nameof(Bone.BaseIndex), index, CoreUserPreferences.Instance.AutoKeyframes);
                    Core.Operations.SortBonesInChain.Perform(bone);
                }
                SceneView.Instance.Components.Remove <CreateBoneHelper>();
                sv.Input.ConsumeKey(Key.Mouse0);
                Window.Current.Invalidate();
                Document.Current.History.CommitTransaction();
            }
        }