Пример #1
0
        private void PlaceBone(JointVM firstJoint, JointVM secondJoint)
        {
            var bone   = new Bone(firstJoint.Model, secondJoint.Model);
            var boneVM = new BoneVM(bone);

            if (CanvasVM.Creature.CreatureStructureVM.BoneCollectionVM.Any(b =>
            {
                if (b.FirstJoint.Model.Tracker == firstJoint.Model.Tracker &&
                    b.SecondJoint.Model.Tracker == secondJoint.Model.Tracker)
                {
                    return(true);
                }
                if (b.FirstJoint.Model.Tracker == secondJoint.Model.Tracker &&
                    b.SecondJoint.Model.Tracker == firstJoint.Model.Tracker)
                {
                    return(true);
                }
                return(false);
            }))
            {
                var infoMessage = new InfoMessage("Bone already placed between those joints", TimeSpan.FromSeconds(2), Brushes.Red);
                InfoMessageCollection.AddInfoMessageWithoutTracking(infoMessage);
                return;
            }

            var changeOperation = new ChangeOperation(c => { c.Creature.CreatureStructureVM.BoneCollectionVM.Add(boneVM); },
                                                      c => { c.Creature.CreatureStructureVM.BoneCollectionVM.Remove(boneVM); });

            CanvasVM.HistoryStack.AddOperation(changeOperation);
            Reset();
            FirstJoint = secondJoint;
            CanvasVM.PreviewBone.From = FirstJoint.Position;
        }
Пример #2
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);
        }