private void button_Apply_Click(object sender, EventArgs e)
        {
            if (!_bHasApplyButton)
            {
                return;
            }

            progress.Percentage = 0.0f;
            progressBar.Visible = true;
            TerrainShape terrain = TerrainEditor.CurrentTerrain;

            // in case this is a heightmap filter...
            IHeightmapFilter hmFilter = _filter as IHeightmapFilter;

            if (hmFilter != null)
            {
                if (!hmFilter.OnStart(terrain.Heightmap, x1, y1, x2, y2))
                {
                    string err = _filter.LastError;
                    string msg = "An error occurred while running this action.";
                    if (!string.IsNullOrEmpty(err))
                    {
                        msg += "\n\nDetailed message: " + err;
                    }

                    EditorManager.ShowMessageBox(msg, "Failed", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    hmFilter.OnFinish();
                    return;
                }
                terrain.EngineTerrain.ApplyHeightmapFilter(hmFilter, progress);
                hmFilter.OnFinish();
                // trigger the action that has the backed-up height values
                EditorManager.Actions.Add(new TerrainChangedAction(terrain.EngineTerrain, "Import Heightmap : " + _filter.Name));
            }

            // ...or decoration filter
            IDecorationFilter decoFilter = _filter as IDecorationFilter;

            if (decoFilter != null)
            {
                if (!decoFilter.OnStart())
                {
                    string err = decoFilter.LastError;
                    string msg = "An error occurred while running this action.";
                    if (!string.IsNullOrEmpty(err))
                    {
                        msg += "\n\nDetailed message: " + err;
                    }

                    EditorManager.ShowMessageBox(msg, "Failed", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    decoFilter.OnFinish();
                    return;
                }
                terrain.EngineTerrain.ApplyDecorationFilter(decoFilter, progress);
                EditorManager.Actions.Add(new TerrainChangedAction(terrain.EngineTerrain, "Decoration : " + _filter.Name));
                decoFilter.OnFinish();
            }
        }
        /// <summary>
        /// Static function to open the filter dialog with additional sample range
        /// </summary>
        /// <param name="filter"></param>
        /// <param name="x1"></param>
        /// <param name="y1"></param>
        /// <param name="x2"></param>
        /// <param name="y2"></param>
        /// <returns></returns>
        public static bool RunFilter(IHeightmapFilter filter, int x1, int y1, int x2, int y2)
        {
            if (filter == null || TerrainEditor.CurrentTerrain == null || TerrainEditor.CurrentTerrain.EngineTerrain == null)
            {
                return(false);
            }

            ApplyHeightmapFilterDlg dlg = new ApplyHeightmapFilterDlg();

            dlg.Filter = filter;
            dlg.x1     = x1;
            dlg.y1     = y1;
            dlg.x2     = x2;
            dlg.y2     = y2;
            return(dlg.ShowDialog() == DialogResult.OK);
        }
 /// <summary>
 /// Static function to open the filter dialog
 /// </summary>
 /// <param name="filter"></param>
 /// <returns></returns>
 public static bool RunFilter(IHeightmapFilter filter)
 {
     return(RunFilter(filter, 0, 0, -1, -1));
 }