private void Apply() { string actionText = null; var ac = new ActionCollection(); // Check if it's actually editing keyvalues if (_values != null) { var editAction = GetEditEntityDataAction(); if (editAction != null) { // The entity change is more important to show actionText = "Edit entity data"; ac.Add(editAction); } } var visgroupAction = GetUpdateVisgroupsAction(); if (visgroupAction != null) { // Visgroup change shows if entity data not changed if (actionText == null) { actionText = "Edit object visgroups"; } ac.Add(visgroupAction); } if (!ac.IsEmpty()) { // Run if either action shows changes Document.PerformAction(actionText, ac); } Class.BackColor = Color.White; }
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); } }