private Task ApplyFace(MapDocument document, PerspectiveCamera camera, Face face, IMapObject parent) { // Right: use defined action // Alt+Right: apply + align // Shift+Right: apply only // Ctrl+Right: nothing...? var action = _rightClickAction; if (KeyboardState.Alt) { action = ClickAction.Apply | ClickAction.AlignToSample; } if (KeyboardState.Shift) { action = ClickAction.Apply; } var sampleFace = GetSelection(document).FirstOrDefault(); var activeTexture = document.Map.Data.GetOne <ActiveTexture>()?.Name ?? sampleFace?.Texture.Name ?? ""; if (String.IsNullOrWhiteSpace(activeTexture)) { return(Task.CompletedTask); } var clone = (Face)face.Clone(); bool changed = false; // Apply texture if (!String.IsNullOrWhiteSpace(activeTexture) && action.HasFlag(ClickAction.Apply)) { clone.Texture.Name = activeTexture; changed = true; } // Apply values if (camera != null && action.HasFlag(ClickAction.AlignToView)) { // align to camera var uaxis = camera.GetRight(); var vaxis = camera.GetUp(); var pos = camera.Location; clone.Texture.SetRotation(0); clone.Texture.XScale = 1; clone.Texture.YScale = 1; clone.Texture.UAxis = uaxis; clone.Texture.VAxis = vaxis; clone.Texture.XShift = Vector3.Dot(uaxis, pos); clone.Texture.YShift = Vector3.Dot(vaxis, pos); changed = true; } else if (sampleFace != null && action.HasFlag(ClickAction.AlignToSample)) { // align to face clone.Texture.AlignWithTexture(clone.Plane, sampleFace.Plane, sampleFace.Texture); changed = true; } else if (sampleFace != null && action.HasFlag(ClickAction.Values)) { // apply values clone.Texture.SetRotation(sampleFace.Texture.Rotation); clone.Texture.XScale = sampleFace.Texture.XScale; clone.Texture.XShift = sampleFace.Texture.XShift; clone.Texture.YScale = sampleFace.Texture.YScale; clone.Texture.YShift = sampleFace.Texture.YShift; changed = true; } if (!changed) { return(Task.CompletedTask); } var edit = new Transaction( new RemoveMapObjectData(parent.ID, face), new AddMapObjectData(parent.ID, clone) ); return(MapDocumentOperation.Perform(document, edit)); }