private static Vector2 GetBonePositionInSpaceOfParent(Bone node) { return(node.Position * node.CalcLocalToParentWidgetTransform()); }
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(); } }