Пример #1
0
        private void CreateChangeOperation(CreatureStructureEditorCanvasVM canvasVM)
        {
            var startPositions   = StartPositions.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
            var currentPositions = new Dictionary <JointVM, Vector2>();
            var movedJoints      = StartPositions.Keys;

            foreach (var jointVM in movedJoints)
            {
                currentPositions.Add(jointVM, jointVM.Position);
            }

            var changeOperation = new ChangeOperation(c =>
            {
                foreach (var movedJoint in movedJoints)
                {
                    movedJoint.Position = currentPositions[movedJoint];
                }
            },
                                                      c =>
            {
                foreach (var movedJoint in movedJoints)
                {
                    movedJoint.Position = startPositions[movedJoint];
                }
            });

            canvasVM.HistoryStack.AddOperation(changeOperation);
        }
Пример #2
0
        /// <inheritdoc />
        public override bool OnCanvasMouseMove(MouseInfo mouseInfo, CreatureStructureEditorCanvasVM canvasVM, ModifierKeys modifierKeys)
        {
            CanvasVM = CanvasVM ?? canvasVM;
            if (base.OnCanvasMouseMove(mouseInfo, canvasVM, modifierKeys))
            {
                return(true);
            }
            if (StartPosition == null)
            {
                return(false);
            }
            var delta = mouseInfo.RelativePosition - StartPosition.Value;

            foreach (var boneVM in CanvasVM.Creature.CreatureStructureVM.BoneCollectionVM)
            {
                boneVM.FirstJoint =
                    CanvasVM.Creature.CreatureStructureVM.JointCollectionVM.First(j => boneVM.FirstJoint.Model.Tracker == j.Model.Tracker);
                boneVM.SecondJoint =
                    CanvasVM.Creature.CreatureStructureVM.JointCollectionVM.First(j => boneVM.SecondJoint.Model.Tracker == j.Model.Tracker);
            }

            foreach (var jointVM in CanvasVM.SelectedJoints)
            {
                var pos = StartPositions[jointVM];
                pos = new Vector2(delta.X + pos.X, delta.Y + pos.Y);
                jointVM.Position = pos;
            }

            return(true);
        }
Пример #3
0
        /// <inheritdoc />
        public override bool OnCanvasMouseUp(MouseInfo mouseInfo, CreatureStructureEditorCanvasVM canvasVM, ModifierKeys modifierKeys)
        {
            base.OnCanvasMouseUp(mouseInfo, canvasVM, modifierKeys);
            if (mouseInfo.LeftMouseButtonDown == false)
            {
                return(false);
            }

            var mousePosition = new Vector2(mouseInfo.RelativePosition.X, mouseInfo.RelativePosition.Y);

            if (IsSelecting)
            {
                double length = new Vector2(CanvasVM.SelectionVM.Width, CanvasVM.SelectionVM.Height).Length;
                if (length < MinSelectionDiagonale)
                {
                    PointSelection(mousePosition, modifierKeys);
                    CanvasVM.SelectionVM.Visibility = Visibility.Hidden;
                }
                else
                {
                    SelectElementsInSelectionArea(canvasVM, modifierKeys);
                }

                IsSelecting = false;
                return(true);
            }

            return(false);
        }
Пример #4
0
 /// <inheritdoc />
 public override void OnCanvasMouseLeave(CreatureStructureEditorCanvasVM canvasVM, ModifierKeys modifierKeys)
 {
     CanvasVM = CanvasVM ?? canvasVM;
     base.OnCanvasMouseLeave(canvasVM, modifierKeys);
     IsSelecting = false;
     CanvasVM.SelectionVM.Visibility = Visibility.Hidden;
 }
Пример #5
0
        /// <inheritdoc />
        public override bool OnCanvasMouseDown(MouseInfo mouseInfo, CreatureStructureEditorCanvasVM canvasVM, ModifierKeys modifierKeys)
        {
            IsDragging    = true;
            StartPosition = mouseInfo.AbosultePosition;

            return(false);
        }
Пример #6
0
        /// <inheritdoc />
        public override bool OnCanvasMouseUp(MouseInfo mouseInfo, CreatureStructureEditorCanvasVM canvasVM, ModifierKeys modifierKeys)
        {
            CanvasVM = CanvasVM ?? canvasVM;
            if (base.OnCanvasMouseUp(mouseInfo, canvasVM, modifierKeys))
            {
                return(true);
            }

            if (mouseInfo.RightMouseButtonDown)
            {
                bool block = FirstJoint != null;
                Reset();
                return(block);
            }

            var mousePosition       = new Vector2(mouseInfo.RelativePosition.X, mouseInfo.RelativePosition.Y);
            var jointCollectionVM   = canvasVM.Creature.CreatureStructureVM.JointCollectionVM;
            var closestJointInRange =
                (from jointVM in jointCollectionVM
                 let distance = (jointVM.Position - mousePosition).Length
                                where distance < DistanceThreshold
                                orderby distance
                                select jointVM).FirstOrDefault();

            if (closestJointInRange == null)
            {
                if (FirstJoint != null)
                {
                    var infoMessage = new InfoMessage("To cancel the bone placement just right click anywhere on the canvas", TimeSpan.FromSeconds(5));
                    if (!InfoMessageCollection.InfoMessages.Any(m => string.Equals(m.Message, infoMessage.Message, StringComparison.Ordinal)))
                    {
                        InfoMessageCollection.AddInfoMessageWithoutTracking(infoMessage);
                    }
                }
                else
                {
                    var infoMessage = new InfoMessage("To place a bone, first place joints with the respective tool and then connect them with this tool", TimeSpan.FromSeconds(5));
                    if (!InfoMessageCollection.InfoMessages.Any(m => string.Equals(m.Message, infoMessage.Message, StringComparison.Ordinal)))
                    {
                        InfoMessageCollection.AddInfoMessageWithoutTracking(infoMessage);
                    }
                }
                return(true);
            }

            canvasVM.PreviewBone.To = mousePosition;
            if (FirstJoint == null)
            {
                FirstJoint = closestJointInRange;

                canvasVM.PreviewBone.From = FirstJoint.Position;
            }
            else
            {
                PlaceBone(FirstJoint, closestJointInRange);
            }

            return(false);
        }
Пример #7
0
 /// <inheritdoc />
 public override void OnCanvasMouseLeave(CreatureStructureEditorCanvasVM canvasVM, ModifierKeys modifierKeys)
 {
     base.OnCanvasMouseLeave(canvasVM, modifierKeys);
     if (StartPosition != null)
     {
         CreateChangeOperation(canvasVM);
     }
     StartPosition = null;
 }
Пример #8
0
 /// <inheritdoc />
 public override bool OnCanvasMouseUp(MouseInfo mouseInfo, CreatureStructureEditorCanvasVM canvasVM, ModifierKeys modifierKeys)
 {
     CanvasVM = CanvasVM ?? canvasVM;
     if (base.OnCanvasMouseUp(mouseInfo, canvasVM, modifierKeys))
     {
         return(true);
     }
     return(false);
 }
Пример #9
0
        /// <inheritdoc />
        public override bool OnCanvasMouseWheel(MouseWheelInfo mouseWheelInfo,
                                                CreatureStructureEditorCanvasVM canvasVM,
                                                ModifierKeys modifierKeys)
        {
            CanvasVM = CanvasVM ?? canvasVM;
            bool result = base.OnCanvasMouseWheel(mouseWheelInfo, canvasVM, modifierKeys);

            canvasVM.PreviewJoint.Visibility = Visibility.Hidden;
            return(result);
        }
Пример #10
0
 /// <inheritdoc />
 public override bool OnCanvasMouseMove(MouseInfo mouseInfo, CreatureStructureEditorCanvasVM canvasVM, ModifierKeys modifierKeys)
 {
     CanvasVM = CanvasVM ?? canvasVM;
     if (base.OnCanvasMouseMove(mouseInfo, canvasVM, modifierKeys))
     {
         return(true);
     }
     canvasVM.PreviewJoint.Visibility = Visibility.Visible;
     canvasVM.PreviewJoint.Position   = new Vector2(mouseInfo.RelativePosition.X, mouseInfo.RelativePosition.Y);
     return(false);
 }
Пример #11
0
        /// <inheritdoc />
        public override bool OnCanvasMouseUp(MouseInfo mouseInfo, CreatureStructureEditorCanvasVM canvasVM, ModifierKeys modifierKeys)
        {
            CanvasVM = CanvasVM ?? canvasVM;
            if (base.OnCanvasMouseMove(mouseInfo, canvasVM, modifierKeys))
            {
                return(true);
            }

            CreateChangeOperation(canvasVM);

            Reset();
            return(true);
        }
Пример #12
0
        /// <inheritdoc />
        public override bool OnCanvasMouseMove(MouseInfo mouseInfo, CreatureStructureEditorCanvasVM canvasVM, ModifierKeys modifierKeys)
        {
            if (!IsDragging)
            {
                return(true);
            }

            double deltaX = (mouseInfo.AbosultePosition - StartPosition).X;
            double deltaY = (mouseInfo.AbosultePosition - StartPosition).Y;

            StartPosition = mouseInfo.AbosultePosition;

            canvasVM.CameraVM.OffsetX += deltaX;
            canvasVM.CameraVM.OffsetY += deltaY;

            return(true);
        }
Пример #13
0
        /// <inheritdoc />
        public override bool OnCanvasMouseDown(MouseInfo mouseInfo, CreatureStructureEditorCanvasVM canvasVM, ModifierKeys modifierKeys)
        {
            CanvasVM = CanvasVM ?? canvasVM;
            if (base.OnCanvasMouseDown(mouseInfo, canvasVM, modifierKeys))
            {
                return(true);
            }

            var jointVM = new JointVM(new Joint {
                Position = canvasVM.PreviewJoint.Position
            });
            var changeOperation = new ChangeOperation(c => c.Creature.CreatureStructureVM.JointCollectionVM.Add(jointVM),
                                                      c => c.Creature.CreatureStructureVM.JointCollectionVM.Remove(jointVM));

            canvasVM.HistoryStack.AddOperation(changeOperation);
            return(true);
        }
Пример #14
0
        /// <inheritdoc />
        public override bool OnCanvasMouseDown(MouseInfo mouseInfo, CreatureStructureEditorCanvasVM canvasVM, ModifierKeys modifierKeys)
        {
            CanvasVM = CanvasVM ?? canvasVM;
            base.OnCanvasMouseDown(mouseInfo, CanvasVM, modifierKeys);

            StartPositions.Clear();

            var selectedJoint = (from joint in CanvasVM.Creature.CreatureStructureVM.JointCollectionVM
                                 let distance =
                                     (joint.Position - new Vector2(mouseInfo.RelativePosition.X, mouseInfo.RelativePosition.Y)).Length
                                     where distance < SinglePointSelectionTolerance
                                     orderby distance
                                     select joint).FirstOrDefault();

            if (selectedJoint != null)
            {
                if (CanvasVM.SelectedJoints.Count >= 1 && !CanvasVM.SelectedJoints.Contains(selectedJoint))
                {
                    CanvasVM.SelectedJoints.Clear();
                }
                if (!CanvasVM.SelectedJoints.Contains(selectedJoint))
                {
                    CanvasVM.SelectedJoints.Add(selectedJoint);
                }
            }
            else
            {
                CanvasVM.SelectedJoints.Clear();
            }

            var selectedJoins = CanvasVM.SelectedJoints.Select(j => j.Model.Tracker).ToList();

            StartPosition = mouseInfo.RelativePosition;

            foreach (var jointVM in
                     CanvasVM.Creature.CreatureStructureVM.JointCollectionVM.Where(j => selectedJoins.Contains(j.Model.Tracker)))
            {
                CanvasVM.SelectedJoints.Add(jointVM);
                StartPositions.Add(jointVM, jointVM.Position);
            }

            return(true);
        }
Пример #15
0
        /// <inheritdoc />
        public override bool OnCanvasMouseMove(MouseInfo mouseInfo, CreatureStructureEditorCanvasVM canvasVM, ModifierKeys modifierKeys)
        {
            CanvasVM = CanvasVM ?? canvasVM;
            if (base.OnCanvasMouseMove(mouseInfo, canvasVM, modifierKeys))
            {
                return(true);
            }

            var mousePosition = new Vector2(mouseInfo.RelativePosition.X, mouseInfo.RelativePosition.Y);

            if (IsSelecting)
            {
                var difference = mousePosition - CanvasVM.SelectionVM.StartPosition;
                CanvasVM.SelectionVM.Width      = difference.X;
                CanvasVM.SelectionVM.Height     = difference.Y;
                CanvasVM.SelectionVM.Visibility = difference.Length >= MinSelectionDiagonale ? Visibility.Visible : Visibility.Hidden;
                return(true);
            }

            return(false);
        }
Пример #16
0
        /// <inheritdoc />
        public override bool OnCanvasMouseMove(MouseInfo mouseInfo, CreatureStructureEditorCanvasVM canvasVM, ModifierKeys modifierKeys)
        {
            CanvasVM = CanvasVM ?? canvasVM;
            if (base.OnCanvasMouseMove(mouseInfo, canvasVM, modifierKeys))
            {
                return(true);
            }

            var mousePosition       = new Vector2(mouseInfo.RelativePosition.X, mouseInfo.RelativePosition.Y);
            var jointCollectionVM   = canvasVM.Creature.CreatureStructureVM.JointCollectionVM;
            var closestJointInRange =
                (from jointVM in jointCollectionVM
                 let distance = (jointVM.Position - mousePosition).Length
                                where distance < DistanceThreshold
                                orderby distance
                                select jointVM).FirstOrDefault();

            foreach (var highlightedJoint in canvasVM.PreviewBone.HighlightedJoints.ToList())
            {
                if (!Equals(highlightedJoint, FirstJoint) && !Equals(closestJointInRange, highlightedJoint))
                {
                    canvasVM.PreviewBone.HighlightedJoints.Remove(highlightedJoint);
                }
            }

            if (closestJointInRange != null && !canvasVM.PreviewBone.HighlightedJoints.Contains(closestJointInRange))
            {
                canvasVM.PreviewBone.HighlightedJoints.Add(closestJointInRange);
            }

            if (FirstJoint == null)
            {
                return(false);
            }
            canvasVM.PreviewBone.To         = closestJointInRange?.Position ?? mousePosition;
            canvasVM.PreviewBone.Visibility = Visibility.Visible;

            return(false);
        }
Пример #17
0
        /// <inheritdoc />
        public override bool OnCanvasMouseDown(MouseInfo mouseInfo, CreatureStructureEditorCanvasVM canvasVM, ModifierKeys modifierKeys)
        {
            CanvasVM = CanvasVM ?? canvasVM;
            base.OnCanvasMouseDown(mouseInfo, canvasVM, modifierKeys);

            if (mouseInfo.MiddleMouseButtonDown)
            {
                return(false);
            }

            var mousePosition = new Vector2(mouseInfo.RelativePosition.X, mouseInfo.RelativePosition.Y);

            if (!IsSelecting)
            {
                IsSelecting = true;
                CanvasVM.SelectionVM.StartPosition = mousePosition;
                CanvasVM.SelectionVM.Width         = 0;
                CanvasVM.SelectionVM.Height        = 0;
                return(true);
            }

            return(false);
        }
Пример #18
0
 public ToolEventArgs(Tool tool, CreatureStructureEditorCanvasVM canvasVM)
 {
     Tool     = tool;
     CanvasVM = canvasVM;
 }
Пример #19
0
 /// <inheritdoc />
 public override void OnCanvasMouseLeave(CreatureStructureEditorCanvasVM canvasVM, ModifierKeys modifierKeys)
 {
     CanvasVM = CanvasVM ?? canvasVM;
     base.OnCanvasMouseLeave(canvasVM, modifierKeys);
     canvasVM.PreviewJoint.Visibility = Visibility.Hidden;
 }
Пример #20
0
 /// <inheritdoc />
 public override bool OnCanvasMouseUp(MouseInfo mouseInfo, CreatureStructureEditorCanvasVM canvasVM, ModifierKeys modifierKeys)
 {
     IsDragging = false;
     return(false);
 }
Пример #21
0
 /// <inheritdoc />
 public override void OnCanvasMouseLeave(CreatureStructureEditorCanvasVM canvasVM, ModifierKeys modifierKeys)
 {
     OnCanvasMouseUp(default(MouseInfo), canvasVM, modifierKeys);
 }
Пример #22
0
        private void SelectElementsInSelectionArea(CreatureStructureEditorCanvasVM canvasVM, ModifierKeys modifierKeys)
        {
            CanvasVM = CanvasVM ?? canvasVM;
            if ((modifierKeys & ModifierKeys.Shift) == 0)
            {
                Reset();
            }
            CanvasVM.SelectionVM.Visibility = Visibility.Hidden;

            var creatureStructureVM = CanvasVM.Creature.CreatureStructureVM;
            var jointsInRectangle   =
                creatureStructureVM.JointCollectionVM.Where(jointVM => jointVM.Position.IsInsideRect(CanvasVM.SelectionVM.Rectangle));
            var bonesInRectangle =
                creatureStructureVM.BoneCollectionVM.Where(boneVM =>
                                                           boneVM.FirstJoint.Position.IsInsideRect(CanvasVM.SelectionVM.Rectangle) ||
                                                           boneVM.SecondJoint.Position.IsInsideRect(CanvasVM.SelectionVM.Rectangle) ||
                                                           CanvasVM.SelectionVM.Rectangle.IsBoneInside(boneVM.Model));

            if ((modifierKeys & ModifierKeys.Alt) == 0)
            {
                foreach (var jointVM in jointsInRectangle)
                {
                    if ((modifierKeys & ModifierKeys.Shift) == 0)
                    {
                        CanvasVM.SelectedJoints.Add(jointVM);
                    }
                    else
                    {
                        var joint = CanvasVM.SelectedJoints.FirstOrDefault(j => j.Model.Tracker == jointVM.Model.Tracker);
                        if (joint != null)
                        {
                            CanvasVM.SelectedJoints.Remove(joint);
                        }
                        else
                        {
                            CanvasVM.SelectedJoints.Add(jointVM);
                        }
                    }
                }
            }

            if ((modifierKeys & ModifierKeys.Control) == 0)
            {
                foreach (var boneVM in bonesInRectangle)
                {
                    if ((modifierKeys & ModifierKeys.Shift) == 0)
                    {
                        CanvasVM.SelectedBones.Add(boneVM);
                    }
                    else
                    {
                        var bone = CanvasVM.SelectedBones.FirstOrDefault(b => b.Model.Tracker == boneVM.Model.Tracker);
                        if (bone != null)
                        {
                            CanvasVM.SelectedBones.Remove(bone);
                        }
                        else
                        {
                            CanvasVM.SelectedBones.Add(boneVM);
                        }
                    }
                }
            }
        }
Пример #23
0
 /// <inheritdoc />
 public override void OnCanvasMouseEnter(CreatureStructureEditorCanvasVM canvasVM, ModifierKeys modifierKeys)
 {
     CanvasVM = CanvasVM ?? canvasVM;
     base.OnCanvasMouseEnter(canvasVM, modifierKeys);
 }