Beispiel #1
0
        public override bool CanDrag(MapDocument document, MapViewport viewport, OrthographicCamera camera, ViewportEvent e, Vector3 position)
        {
            const int width          = 8;
            var       pos            = GetWorldPositionAndScreenOffset(viewport.Viewport.Camera);
            var       screenPosition = camera.WorldToScreen(pos.Item1) + pos.Item2;
            var       diff           = Vector3.Abs(e.Location - screenPosition);

            return(diff.X < width && diff.Y < width);
        }
Beispiel #2
0
 protected virtual void LeftMouseClickOnResizeHandle(Viewport2D vp, ViewportEvent e)
 {
     State.Action = BoxAction.ReadyToResize;
 }
Beispiel #3
0
 public override void MouseWheel(ViewportBase viewport, ViewportEvent e)
 {
     // Nope.
 }
Beispiel #4
0
 public override void MouseClick(ViewportBase viewport, ViewportEvent e)
 {
 }
Beispiel #5
0
 public override void MouseLeave(ViewportBase viewport, ViewportEvent e)
 {
     _activeViewport = null;
 }
Beispiel #6
0
 public override void MouseMove(ViewportBase viewport, ViewportEvent e)
 {
     //
 }
Beispiel #7
0
 public override void KeyDown(ViewportBase viewport, ViewportEvent e)
 {
 }
 public void KeyUp(ViewportEvent e)
 {
     // Not used
 }
 public void KeyDown(ViewportEvent e)
 {
     // Not used
 }
 public bool CanDrag(MapDocument document, MapViewport viewport, OrthographicCamera camera, ViewportEvent e, Vector3 position) => false;
 public void EndDrag(MapDocument document, MapViewport viewport, OrthographicCamera camera, ViewportEvent e, Vector3 position)
 {
 }
Beispiel #12
0
 public override void EndDrag(MapDocument document, MapViewport viewport, OrthographicCamera camera, ViewportEvent e, Vector3 position)
 {
     BoxState.FixBounds();
     BoxState.Action = BoxAction.Drawn;
     MoveOrigin      = SnappedMoveOrigin = null;
     base.EndDrag(document, viewport, camera, e, position);
 }
Beispiel #13
0
 public override void Drag(MapDocument document, MapViewport viewport, OrthographicCamera camera, ViewportEvent e, Vector3 lastPosition, Vector3 position)
 {
     if (Handle == ResizeHandle.Center)
     {
         var delta     = position - lastPosition;
         var newOrigin = MoveOrigin + delta;
         var snapped   = State.Tool.SnapIfNeeded(newOrigin.Value);
         BoxState.Move(camera, snapped - SnappedMoveOrigin.Value);
         SnappedMoveOrigin = snapped;
         MoveOrigin        = newOrigin;
     }
     else
     {
         var snapped = State.Tool.SnapIfNeeded(position);
         BoxState.Resize(Handle, viewport, camera, snapped);
     }
     base.Drag(document, viewport, camera, e, lastPosition, position);
 }
Beispiel #14
0
 public override void StartDrag(MapDocument document, MapViewport viewport, OrthographicCamera camera, ViewportEvent e, Vector3 position)
 {
     BoxState.OrigStart = BoxState.Start;
     BoxState.OrigEnd   = BoxState.End;
     if (!MoveOrigin.HasValue)
     {
         MoveOrigin = GetResizeOrigin(viewport, camera, position);
     }
     if (!SnappedMoveOrigin.HasValue)
     {
         SnappedMoveOrigin = MoveOrigin;
     }
     BoxState.Action = BoxAction.Resizing;
     base.StartDrag(document, viewport, camera, e, position);
 }
Beispiel #15
0
        public override void MouseDown(ViewportBase viewport, ViewportEvent e)
        {
            var vp = viewport as Viewport3D;

            if (vp == null || (e.Button != MouseButtons.Left && e.Button != MouseButtons.Right))
            {
                return;
            }

            var behaviour = e.Button == MouseButtons.Left
                                ? _form.GetLeftClickBehaviour(KeyboardState.Ctrl, KeyboardState.Shift, KeyboardState.Alt)
                                : _form.GetRightClickBehaviour(KeyboardState.Ctrl, KeyboardState.Shift, KeyboardState.Alt);

            var ray         = vp.CastRayFromScreen(e.X, e.Y);
            var hits        = Document.Map.WorldSpawn.GetAllNodesIntersectingWith(ray).OfType <Solid>();
            var clickedFace = hits.SelectMany(f => f.Faces)
                              .Select(x => new { Item = x, Intersection = x.GetIntersectionPoint(ray) })
                              .Where(x => x.Intersection != null)
                              .OrderBy(x => (x.Intersection - ray.Start).VectorMagnitude())
                              .Select(x => x.Item)
                              .FirstOrDefault();

            if (clickedFace == null)
            {
                return;
            }

            var faces = new List <Face>();

            if (KeyboardState.Shift)
            {
                faces.AddRange(clickedFace.Parent.Faces);
            }
            else
            {
                faces.Add(clickedFace);
            }

            var firstSelected = Document.Selection.GetSelectedFaces().FirstOrDefault();
            var firstClicked  = faces.FirstOrDefault(face => !String.IsNullOrWhiteSpace(face.Texture.Name));

            var ac = new ActionCollection();

            var select = new ChangeFaceSelection(
                KeyboardState.Ctrl ? faces.Where(x => !x.IsSelected) : faces,
                KeyboardState.Ctrl ? faces.Where(x => x.IsSelected) : Document.Selection.GetSelectedFaces().Where(x => !faces.Contains(x)));

            Action lift = () =>
            {
                if (firstClicked == null)
                {
                    return;
                }
                var itemToSelect = Document.TextureCollection.GetItem(firstClicked.Texture.Name)
                                   ?? new TextureItem(null, firstClicked.Texture.Name, TextureFlags.Missing, 64, 64);
                Mediator.Publish(EditorMediator.TextureSelected, itemToSelect);
            };

            switch (behaviour)
            {
            case SelectBehaviour.Select:
                ac.Add(select);
                break;

            case SelectBehaviour.LiftSelect:
                lift();
                ac.Add(select);
                break;

            case SelectBehaviour.Lift:
                lift();
                break;

            case SelectBehaviour.Apply:
            case SelectBehaviour.ApplyWithValues:
                var item = _form.GetFirstSelectedTexture();
                if (item != null)
                {
                    var texture = item.GetTexture();
                    ac.Add(new EditFace(faces, (document, face) =>
                    {
                        face.Texture.Name    = item.Name;
                        face.Texture.Texture = texture;
                        if (behaviour == SelectBehaviour.ApplyWithValues && firstSelected != null)
                        {
                            // Calculates the texture coordinates
                            face.AlignTextureWithFace(firstSelected);
                        }
                        else if (behaviour == SelectBehaviour.ApplyWithValues)
                        {
                            face.Texture.XScale = _form.CurrentProperties.XScale;
                            face.Texture.YScale = _form.CurrentProperties.YScale;
                            face.Texture.XShift = _form.CurrentProperties.XShift;
                            face.Texture.YShift = _form.CurrentProperties.YShift;
                            face.SetTextureRotation(_form.CurrentProperties.Rotation);
                        }
                        else
                        {
                            face.CalculateTextureCoordinates(true);
                        }
                    }, true));
                }
                break;

            case SelectBehaviour.AlignToView:
                var right = vp.Camera.GetRight();
                var up    = vp.Camera.GetUp();
                var loc   = vp.Camera.Location;
                var point = new Coordinate((decimal)loc.X, (decimal)loc.Y, (decimal)loc.Z);
                var uaxis = new Coordinate((decimal)right.X, (decimal)right.Y, (decimal)right.Z);
                var vaxis = new Coordinate((decimal)up.X, (decimal)up.Y, (decimal)up.Z);
                ac.Add(new EditFace(faces, (document, face) =>
                {
                    face.Texture.XScale   = 1;
                    face.Texture.YScale   = 1;
                    face.Texture.UAxis    = uaxis;
                    face.Texture.VAxis    = vaxis;
                    face.Texture.XShift   = face.Texture.UAxis.Dot(point);
                    face.Texture.YShift   = face.Texture.VAxis.Dot(point);
                    face.Texture.Rotation = 0;
                    face.CalculateTextureCoordinates(true);
                }, false));
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
            if (!ac.IsEmpty())
            {
                Document.PerformAction("Texture selection", ac);
            }
        }
 public void KeyPress(ViewportEvent e)
 {
     // Not used
 }
Beispiel #17
0
 public override void KeyDown(ViewportBase viewport, ViewportEvent e)
 {
     //throw new NotImplementedException();
 }
 public void MouseWheel(ViewportEvent e)
 {
     // Not used
 }
Beispiel #19
0
 public override void KeyUp(ViewportBase viewport, ViewportEvent e)
 {
     //
 }
 public void MouseUp(ViewportEvent e)
 {
     // Not used
 }
Beispiel #21
0
 public override void KeyPress(ViewportBase viewport, ViewportEvent e)
 {
 }
 public void MouseDown(ViewportEvent e)
 {
     // Not used
 }
Beispiel #23
0
 public override void MouseEnter(ViewportBase viewport, ViewportEvent e)
 {
     _activeViewport = viewport;
 }
 public void MouseDoubleClick(ViewportEvent e)
 {
     // Not used
 }
Beispiel #25
0
 public override void MouseDoubleClick(ViewportBase viewport, ViewportEvent e)
 {
     // Not used
 }
 public void MouseEnter(ViewportEvent e)
 {
     // Not used
 }
Beispiel #27
0
 protected virtual void MouseMove3D(Viewport3D viewport, ViewportEvent e)
 {
     // Virtual
 }
 public void MouseLeave(ViewportEvent e)
 {
     // Not used
 }
Beispiel #29
0
        protected Tuple <Coordinate, Coordinate> GetResizedBoxCoordinates(Viewport2D viewport, ViewportEvent e)
        {
            if (State.Action != BoxAction.Resizing && State.Action != BoxAction.Drawing)
            {
                return(Tuple.Create(State.BoxStart, State.BoxEnd));
            }
            var now    = SnapIfNeeded(viewport.ScreenToWorld(e.X, viewport.Height - e.Y));
            var cstart = viewport.Flatten(State.BoxStart);
            var cend   = viewport.Flatten(State.BoxEnd);

            // Proportional scaling
            var ostart       = viewport.Flatten(State.PreTransformBoxStart ?? Coordinate.Zero);
            var oend         = viewport.Flatten(State.PreTransformBoxEnd ?? Coordinate.Zero);
            var owidth       = oend.X - ostart.X;
            var oheight      = oend.Y - ostart.Y;
            var proportional = KeyboardState.Ctrl && State.Action == BoxAction.Resizing && owidth != 0 && oheight != 0;

            switch (State.Handle)
            {
            case ResizeHandle.TopLeft:
                cstart.X = now.X;
                cend.Y   = now.Y;
                break;

            case ResizeHandle.Top:
                cend.Y = now.Y;
                break;

            case ResizeHandle.TopRight:
                cend.X = now.X;
                cend.Y = now.Y;
                break;

            case ResizeHandle.Left:
                cstart.X = now.X;
                break;

            case ResizeHandle.Center:
                var cdiff = cend - cstart;
                cstart = viewport.Flatten(State.PreTransformBoxStart) + now - SnapIfNeeded(State.MoveStart);
                cend   = cstart + cdiff;
                break;

            case ResizeHandle.Right:
                cend.X = now.X;
                break;

            case ResizeHandle.BottomLeft:
                cstart.X = now.X;
                cstart.Y = now.Y;
                break;

            case ResizeHandle.Bottom:
                cstart.Y = now.Y;
                break;

            case ResizeHandle.BottomRight:
                cend.X   = now.X;
                cstart.Y = now.Y;
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
            if (proportional)
            {
                var nwidth  = cend.X - cstart.X;
                var nheight = cend.Y - cstart.Y;
                var mult    = Math.Max(nwidth / owidth, nheight / oheight);
                var pwidth  = owidth * mult;
                var pheight = oheight * mult;
                var wdiff   = pwidth - nwidth;
                var hdiff   = pheight - nheight;
                switch (State.Handle)
                {
                case ResizeHandle.TopLeft:
                    cstart.X -= wdiff;
                    cend.Y   += hdiff;
                    break;

                case ResizeHandle.TopRight:
                    cend.X += wdiff;
                    cend.Y += hdiff;
                    break;

                case ResizeHandle.BottomLeft:
                    cstart.X -= wdiff;
                    cstart.Y -= hdiff;
                    break;

                case ResizeHandle.BottomRight:
                    cend.X   += wdiff;
                    cstart.Y -= hdiff;
                    break;
                }
            }
            return(SnapBoxCoordinatesIfNeeded(viewport, cstart, cend));
        }
Beispiel #30
0
 public override void Click(MapDocument document, MapViewport viewport, OrthographicCamera camera, ViewportEvent e, Vector3 position)
 {
 }