/// <summary> /// Creates a clipboard object that holds the clone of relevant terrain data /// </summary> /// <param name="selection">Selection to clone. Can be null to use TerrainEditor.CurrentSelection</param> /// <returns>The clipboard data object</returns> public ITerrainClipboardObject CopySelection(TerrainSelection selection) { if (!HasEngineInstance()) return null; if (selection == null) selection = TerrainEditor.CurrentSelection; if (selection == null || !selection.Valid) return null; ITerrainClipboardObject data = EngineTerrain.CopySelection(selection); // add shapes to clone if ((selection.SelectionFilter & TerrainSelection.SelectionFilter_e.Shapes) != 0) { ShapeCollection shapesOnTerrain = new ShapeCollection(); ShapeCollection roots = EditorManager.Scene.RootShapes; Rectangle2D rect = selection.WorldSpaceExtent; foreach (ShapeBase root in roots) AddShapesRecursive(shapesOnTerrain, root, rect); if (shapesOnTerrain.Count > 0) { data.ShapesToPaste = shapesOnTerrain.CloneForClipboard(); // remap position xy to [0..1] range inside the selection float fInvX = 1.0f / rect.GetSizeX(); float fInvY = 1.0f / rect.GetSizeY(); foreach (Shape3D shape in data.ShapesToPaste) shape.Position = new Vector3F((shape.x - rect.X1) * fInvX, (shape.y - rect.Y1) * fInvY, shape.z); } } return data; }