diff --git a/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/Bundle.properties b/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/Bundle.properties
index 8ecab7707..6b0ae7e7c 100644
--- a/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/Bundle.properties
+++ b/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/Bundle.properties
@@ -99,7 +99,7 @@ TerrainEditorTopComponent.levelTerrainButton.toolTipText=Level terrain
TerrainEditorTopComponent.toolHint.none=
TerrainEditorTopComponent.toolHint.default=Switch between camera and tool controls by holding down SHIFT
-TerrainEditorTopComponent.toolHint.level=Right click to set desired height value, left click to adjust height to that desired value.
+TerrainEditorTopComponent.toolHint.level=Right click to set desired height value, left click to adjust height to that desired value. Use the 'Absolute' field to specify the height you want to level off to (ignoring the height marker). You can use the 'Precision' option to jump the terrain to the height immediately.
TerrainEditorTopComponent.jPanel2.border.title=Material
TerrainEditorTopComponent.jLabel1.text=Shininess
@@ -119,3 +119,12 @@ CreateTerrainVisualPanel2.smoothIterationsLabel.text=Rough
CreateTerrainVisualPanel2.jLabel6.text=Smooth
CreateTerrainVisualPanel2.jLabel7.text=Height Scale:
CreateTerrainVisualPanel2.heightScale.text=1
+TerrainEditorTopComponent.toolHint.shirkit=Right click to set the markers position. A simple right click set the first marker, holding ctrl sets the second marker. Hold the Left button to apply the slope in the area you are hovering.
+TerrainEditorTopComponent.jLabel6.text=
+TerrainEditorTopComponent.jLabel7.text=
+TerrainEditorTopComponent.levelPrecisionCheckbox.text=Precision
+TerrainEditorTopComponent.levelAbsoluteCheckbox.text=Absolute
+TerrainEditorTopComponent.levelAbsoluteHeightField.text=0
+TerrainEditorTopComponent.slopePrecisionCheckbox.text=Precision
+TerrainEditorTopComponent.slopeTerrainButton.toolTipText=Slope terrain
+TerrainEditorTopComponent.slopeTerrainButton.text=
diff --git a/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/TerrainCameraController.java b/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/TerrainCameraController.java
index b35027faf..a60118776 100644
--- a/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/TerrainCameraController.java
+++ b/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/TerrainCameraController.java
@@ -84,7 +84,7 @@ public class TerrainCameraController extends AbstractCameraController {
if (!isTerrainEditButtonEnabled()) {
return;
}
-
+
// move the marker
Vector3f pos = getTerrainCollisionPoint();
if (pos != null) {
diff --git a/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/TerrainEditorTopComponent.form b/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/TerrainEditorTopComponent.form
index 6d64a8499..7459ee179 100644
--- a/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/TerrainEditorTopComponent.form
+++ b/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/TerrainEditorTopComponent.form
@@ -23,6 +23,180 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -53,7 +227,7 @@
-
+
@@ -213,6 +387,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -352,7 +548,7 @@
-
+
@@ -383,95 +579,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -671,7 +778,7 @@
-
+
diff --git a/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/TerrainEditorTopComponent.java b/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/TerrainEditorTopComponent.java
index f4caa4b76..2cc370eb1 100644
--- a/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/TerrainEditorTopComponent.java
+++ b/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/TerrainEditorTopComponent.java
@@ -33,29 +33,20 @@ package com.jme3.gde.terraineditor;
import com.jme3.gde.core.assets.AssetDataObject;
import com.jme3.gde.core.assets.ProjectAssetManager;
+import com.jme3.gde.core.properties.TexturePropertyEditor;
+import com.jme3.gde.core.properties.preview.DDSPreview;
import com.jme3.gde.core.scene.PreviewRequest;
import com.jme3.gde.core.scene.SceneApplication;
import com.jme3.gde.core.scene.SceneListener;
import com.jme3.gde.core.scene.SceneRequest;
import com.jme3.gde.core.sceneexplorer.nodes.JmeNode;
import com.jme3.gde.core.sceneexplorer.nodes.JmeSpatial;
-import com.jme3.gde.core.sceneexplorer.nodes.JmeTerrainQuad;
import com.jme3.gde.core.sceneexplorer.nodes.NodeUtility;
-import com.jme3.gde.core.properties.TexturePropertyEditor;
-import com.jme3.gde.core.properties.preview.DDSPreview;
import com.jme3.gde.core.sceneviewer.SceneViewerTopComponent;
import com.jme3.gde.core.util.DataObjectSaveNode;
import com.jme3.gde.core.util.ToggleButtonGroup;
import com.jme3.gde.terraineditor.sky.SkyboxWizardAction;
-import com.jme3.gde.terraineditor.tools.EraseTerrainTool;
-import com.jme3.gde.terraineditor.tools.LevelTerrainTool;
-import com.jme3.gde.terraineditor.tools.LowerTerrainTool;
-import com.jme3.gde.terraineditor.tools.PaintTerrainTool;
-import com.jme3.gde.terraineditor.tools.RaiseTerrainTool;
-import com.jme3.gde.terraineditor.tools.RoughExtraToolParams;
-import com.jme3.gde.terraineditor.tools.RoughTerrainTool;
-import com.jme3.gde.terraineditor.tools.SmoothTerrainTool;
-import com.jme3.gde.terraineditor.tools.TerrainTool;
+import com.jme3.gde.terraineditor.tools.*;
import com.jme3.math.Vector3f;
import com.jme3.scene.Node;
import com.jme3.scene.Spatial;
@@ -71,19 +62,12 @@ import java.awt.event.KeyEvent;
import java.beans.PropertyChangeEvent;
import java.io.File;
import java.io.IOException;
+import java.text.NumberFormat;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Logger;
-import javax.swing.AbstractCellEditor;
-import javax.swing.DefaultListSelectionModel;
-import javax.swing.Icon;
-import javax.swing.ImageIcon;
-import javax.swing.InputVerifier;
-import javax.swing.JButton;
-import javax.swing.JComponent;
-import javax.swing.JTable;
-import javax.swing.ListSelectionModel;
+import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.filechooser.FileFilter;
@@ -94,13 +78,6 @@ import javax.swing.table.TableCellRenderer;
import jme3tools.converters.ImageToAwt;
import org.netbeans.api.progress.ProgressHandle;
import org.netbeans.api.progress.ProgressHandleFactory;
-import org.openide.nodes.NodeEvent;
-import org.openide.nodes.NodeMemberEvent;
-import org.openide.nodes.NodeReorderEvent;
-import org.openide.util.NbBundle;
-import org.openide.windows.TopComponent;
-import org.openide.windows.WindowManager;
-import org.openide.util.ImageUtilities;
import org.netbeans.api.settings.ConvertAsProperties;
import org.openide.DialogDisplayer;
import org.openide.NotifyDescriptor;
@@ -108,13 +85,14 @@ import org.openide.NotifyDescriptor.Confirmation;
import org.openide.WizardDescriptor;
import org.openide.explorer.ExplorerManager;
import org.openide.explorer.ExplorerUtils;
+import org.openide.nodes.NodeEvent;
import org.openide.nodes.NodeListener;
-import org.openide.util.Exceptions;
-import org.openide.util.HelpCtx;
+import org.openide.nodes.NodeMemberEvent;
+import org.openide.nodes.NodeReorderEvent;
import org.openide.util.Lookup.Result;
-import org.openide.util.LookupEvent;
-import org.openide.util.LookupListener;
-import org.openide.util.Utilities;
+import org.openide.util.*;
+import org.openide.windows.TopComponent;
+import org.openide.windows.WindowManager;
/**
* Top component which displays something.
@@ -142,6 +120,7 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
private HelpCtx ctx = new HelpCtx("sdk.terrain_editor");
private DDSPreview ddsPreview;
private Map buttons = new HashMap();
+ private JPanel insideToolSettings;
public TerrainEditorTopComponent() {
initComponents();
@@ -203,17 +182,35 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
}
// show/hide the extra tool variables scroll pane
- if (tool == null) {
- fractalBrushPanel.setVisible(false);
- } else if (tool.getClass() == RoughTerrainTool.class) {
- if (roughTerrainButton.isSelected()) {
- fractalBrushPanel.setVisible(true);
- } else {
- fractalBrushPanel.setVisible(false);
+ if (insideToolSettings != null) {
+ insideToolSettings.setVisible(false);
+ toolSettingsPanel.remove(insideToolSettings);
+ insideToolSettings = null;
+ }
+
+ if (tool != null) {
+ if (tool.getClass() == RoughTerrainTool.class) {
+ if (roughTerrainButton.isSelected()) {
+ toolSettingsPanel.add(fractalBrushPanel);
+ insideToolSettings = fractalBrushPanel;
+ }
+ } else if (tool.getClass() == LevelTerrainTool.class) {
+ if (levelTerrainButton.isSelected()) {
+ toolSettingsPanel.add(levelBrushPanel);
+ insideToolSettings = levelBrushPanel;
+ }
+ } else if (tool.getClass() == SlopeTerrainTool.class) {
+ if (slopeTerrainButton.isSelected()) {
+ toolSettingsPanel.add(slopeBrushPanel);
+ insideToolSettings = slopeBrushPanel;
+ }
}
- } else {
- fractalBrushPanel.setVisible(false);
}
+
+ if (insideToolSettings != null)
+ insideToolSettings.setVisible(true);
+
+ toolSettingsPanel.validate();
validate();
}
@@ -228,6 +225,21 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
terrainModButtonGroup = new ToggleButtonGroup();
textureFileChooser = new javax.swing.JFileChooser();
+ levelBrushPanel = new javax.swing.JPanel();
+ levelPrecisionCheckbox = new javax.swing.JCheckBox();
+ jLabel6 = new javax.swing.JLabel();
+ levelAbsoluteCheckbox = new javax.swing.JCheckBox();
+ levelAbsoluteHeightField = new javax.swing.JFormattedTextField(NumberFormat.getInstance());
+ fractalBrushPanel = new javax.swing.JPanel();
+ jLabel3 = new javax.swing.JLabel();
+ lacunarityField = new javax.swing.JTextField();
+ jLabel4 = new javax.swing.JLabel();
+ octavesField = new javax.swing.JTextField();
+ scaleLabel = new javax.swing.JLabel();
+ scaleField = new javax.swing.JTextField();
+ slopeBrushPanel = new javax.swing.JPanel();
+ slopePrecisionCheckbox = new javax.swing.JCheckBox();
+ jLabel7 = new javax.swing.JLabel();
jToolBar1 = new javax.swing.JToolBar();
createTerrainButton = new javax.swing.JButton();
jSeparator1 = new javax.swing.JToolBar.Separator();
@@ -236,6 +248,7 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
smoothTerrainButton = new javax.swing.JToggleButton();
roughTerrainButton = new javax.swing.JToggleButton();
levelTerrainButton = new javax.swing.JToggleButton();
+ slopeTerrainButton = new javax.swing.JToggleButton();
jSeparator2 = new javax.swing.JToolBar.Separator();
addTextureButton = new javax.swing.JButton();
removeTextureButton = new javax.swing.JButton();
@@ -248,13 +261,6 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
heightSlider = new javax.swing.JSlider();
jPanel3 = new javax.swing.JPanel();
toolSettingsPanel = new javax.swing.JPanel();
- fractalBrushPanel = new javax.swing.JPanel();
- jLabel3 = new javax.swing.JLabel();
- lacunarityField = new javax.swing.JTextField();
- jLabel4 = new javax.swing.JLabel();
- octavesField = new javax.swing.JTextField();
- scaleLabel = new javax.swing.JLabel();
- scaleField = new javax.swing.JTextField();
paintingPanel = new javax.swing.JPanel();
jScrollPane2 = new javax.swing.JScrollPane();
textureTable = new javax.swing.JTable();
@@ -274,6 +280,110 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
textureFileChooser.setDialogTitle(org.openide.util.NbBundle.getMessage(TerrainEditorTopComponent.class, "TerrainEditorTopComponent.textureFileChooser.dialogTitle_1")); // NOI18N
textureFileChooser.setFileFilter(new ImageFilter());
+ levelBrushPanel.setBackground(new java.awt.Color(204, 204, 204));
+ levelBrushPanel.setOpaque(false);
+ levelBrushPanel.setLayout(new java.awt.GridLayout(3, 2));
+
+ org.openide.awt.Mnemonics.setLocalizedText(levelPrecisionCheckbox, org.openide.util.NbBundle.getMessage(TerrainEditorTopComponent.class, "TerrainEditorTopComponent.levelPrecisionCheckbox.text")); // NOI18N
+ levelPrecisionCheckbox.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ levelPrecisionCheckboxActionPerformed(evt);
+ }
+ });
+ levelBrushPanel.add(levelPrecisionCheckbox);
+
+ org.openide.awt.Mnemonics.setLocalizedText(jLabel6, org.openide.util.NbBundle.getMessage(TerrainEditorTopComponent.class, "TerrainEditorTopComponent.jLabel6.text")); // NOI18N
+ levelBrushPanel.add(jLabel6);
+
+ org.openide.awt.Mnemonics.setLocalizedText(levelAbsoluteCheckbox, org.openide.util.NbBundle.getMessage(TerrainEditorTopComponent.class, "TerrainEditorTopComponent.levelAbsoluteCheckbox.text")); // NOI18N
+ levelAbsoluteCheckbox.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ levelAbsoluteCheckboxActionPerformed(evt);
+ }
+ });
+ levelBrushPanel.add(levelAbsoluteCheckbox);
+
+ levelAbsoluteHeightField.setText(org.openide.util.NbBundle.getMessage(TerrainEditorTopComponent.class, "TerrainEditorTopComponent.levelAbsoluteHeightField.text")); // NOI18N
+ levelAbsoluteHeightField.addKeyListener(new java.awt.event.KeyAdapter() {
+ public void keyTyped(java.awt.event.KeyEvent evt) {
+ levelAbsoluteHeightFieldKeyTyped(evt);
+ }
+ });
+ levelBrushPanel.add(levelAbsoluteHeightField);
+
+ fractalBrushPanel.setBackground(new java.awt.Color(204, 204, 204));
+ fractalBrushPanel.setOpaque(false);
+ fractalBrushPanel.setLayout(new java.awt.GridLayout(3, 2));
+
+ org.openide.awt.Mnemonics.setLocalizedText(jLabel3, org.openide.util.NbBundle.getMessage(TerrainEditorTopComponent.class, "TerrainEditorTopComponent.jLabel3.text")); // NOI18N
+ jLabel3.setToolTipText(org.openide.util.NbBundle.getMessage(TerrainEditorTopComponent.class, "TerrainEditorTopComponent.jLabel3.toolTipText")); // NOI18N
+ fractalBrushPanel.add(jLabel3);
+
+ lacunarityField.setText(org.openide.util.NbBundle.getMessage(TerrainEditorTopComponent.class, "TerrainEditorTopComponent.lacunarityField.text")); // NOI18N
+ lacunarityField.setInputVerifier(new NumberInputVerifier());
+ lacunarityField.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ lacunarityFieldActionPerformed(evt);
+ }
+ });
+ lacunarityField.addKeyListener(new java.awt.event.KeyAdapter() {
+ public void keyTyped(java.awt.event.KeyEvent evt) {
+ lacunarityFieldKeyTyped(evt);
+ }
+ });
+ fractalBrushPanel.add(lacunarityField);
+
+ org.openide.awt.Mnemonics.setLocalizedText(jLabel4, org.openide.util.NbBundle.getMessage(TerrainEditorTopComponent.class, "TerrainEditorTopComponent.jLabel4.text")); // NOI18N
+ jLabel4.setToolTipText(org.openide.util.NbBundle.getMessage(TerrainEditorTopComponent.class, "TerrainEditorTopComponent.jLabel4.toolTipText")); // NOI18N
+ fractalBrushPanel.add(jLabel4);
+
+ octavesField.setText(org.openide.util.NbBundle.getMessage(TerrainEditorTopComponent.class, "TerrainEditorTopComponent.octavesField.text")); // NOI18N
+ octavesField.setInputVerifier(new NumberInputVerifier());
+ octavesField.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ octavesFieldActionPerformed(evt);
+ }
+ });
+ octavesField.addKeyListener(new java.awt.event.KeyAdapter() {
+ public void keyTyped(java.awt.event.KeyEvent evt) {
+ octavesFieldKeyTyped(evt);
+ }
+ });
+ fractalBrushPanel.add(octavesField);
+
+ org.openide.awt.Mnemonics.setLocalizedText(scaleLabel, org.openide.util.NbBundle.getMessage(TerrainEditorTopComponent.class, "TerrainEditorTopComponent.scaleLabel.text")); // NOI18N
+ scaleLabel.setToolTipText(org.openide.util.NbBundle.getMessage(TerrainEditorTopComponent.class, "TerrainEditorTopComponent.scaleLabel.toolTipText")); // NOI18N
+ fractalBrushPanel.add(scaleLabel);
+
+ scaleField.setText(org.openide.util.NbBundle.getMessage(TerrainEditorTopComponent.class, "TerrainEditorTopComponent.scaleField.text")); // NOI18N
+ scaleField.setInputVerifier(new NumberInputVerifier());
+ scaleField.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ scaleFieldActionPerformed(evt);
+ }
+ });
+ scaleField.addKeyListener(new java.awt.event.KeyAdapter() {
+ public void keyTyped(java.awt.event.KeyEvent evt) {
+ scaleFieldKeyTyped(evt);
+ }
+ });
+ fractalBrushPanel.add(scaleField);
+
+ slopeBrushPanel.setBackground(new java.awt.Color(204, 204, 204));
+ slopeBrushPanel.setOpaque(false);
+ slopeBrushPanel.setLayout(new java.awt.GridLayout(3, 2));
+
+ org.openide.awt.Mnemonics.setLocalizedText(slopePrecisionCheckbox, org.openide.util.NbBundle.getMessage(TerrainEditorTopComponent.class, "TerrainEditorTopComponent.slopePrecisionCheckbox.text")); // NOI18N
+ slopePrecisionCheckbox.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ slopePrecisionCheckboxActionPerformed(evt);
+ }
+ });
+ slopeBrushPanel.add(slopePrecisionCheckbox);
+
+ org.openide.awt.Mnemonics.setLocalizedText(jLabel7, org.openide.util.NbBundle.getMessage(TerrainEditorTopComponent.class, "TerrainEditorTopComponent.jLabel7.text")); // NOI18N
+ slopeBrushPanel.add(jLabel7);
+
setBackground(java.awt.Color.gray);
jToolBar1.setBackground(new java.awt.Color(204, 204, 204));
@@ -354,6 +464,20 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
}
});
jToolBar1.add(levelTerrainButton);
+
+ terrainModButtonGroup.add(slopeTerrainButton);
+ slopeTerrainButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/jme3/gde/terraineditor/icon_terrain-slope.png"))); // NOI18N
+ org.openide.awt.Mnemonics.setLocalizedText(slopeTerrainButton, org.openide.util.NbBundle.getMessage(TerrainEditorTopComponent.class, "TerrainEditorTopComponent.slopeTerrainButton.text")); // NOI18N
+ slopeTerrainButton.setToolTipText(org.openide.util.NbBundle.getMessage(TerrainEditorTopComponent.class, "TerrainEditorTopComponent.slopeTerrainButton.toolTipText")); // NOI18N
+ slopeTerrainButton.setFocusable(false);
+ slopeTerrainButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
+ slopeTerrainButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
+ slopeTerrainButton.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ slopeTerrainButtonActionPerformed(evt);
+ }
+ });
+ jToolBar1.add(slopeTerrainButton);
jToolBar1.add(jSeparator2);
addTextureButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/jme3/gde/terraineditor/icon_terrain-add-texture.png"))); // NOI18N
@@ -448,7 +572,7 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
jPanel3.setLayout(jPanel3Layout);
jPanel3Layout.setHorizontalGroup(
jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGap(0, 57, Short.MAX_VALUE)
+ .addGap(0, 147, Short.MAX_VALUE)
);
jPanel3Layout.setVerticalGroup(
jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
@@ -462,66 +586,6 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
toolSettingsPanel.setOpaque(false);
toolSettingsPanel.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.CENTER, 0, 0));
- fractalBrushPanel.setBackground(new java.awt.Color(204, 204, 204));
- fractalBrushPanel.setOpaque(false);
- fractalBrushPanel.setLayout(new java.awt.GridLayout(3, 2));
-
- org.openide.awt.Mnemonics.setLocalizedText(jLabel3, org.openide.util.NbBundle.getMessage(TerrainEditorTopComponent.class, "TerrainEditorTopComponent.jLabel3.text")); // NOI18N
- jLabel3.setToolTipText(org.openide.util.NbBundle.getMessage(TerrainEditorTopComponent.class, "TerrainEditorTopComponent.jLabel3.toolTipText")); // NOI18N
- fractalBrushPanel.add(jLabel3);
-
- lacunarityField.setText(org.openide.util.NbBundle.getMessage(TerrainEditorTopComponent.class, "TerrainEditorTopComponent.lacunarityField.text")); // NOI18N
- lacunarityField.setInputVerifier(new NumberInputVerifier());
- lacunarityField.addActionListener(new java.awt.event.ActionListener() {
- public void actionPerformed(java.awt.event.ActionEvent evt) {
- lacunarityFieldActionPerformed(evt);
- }
- });
- lacunarityField.addKeyListener(new java.awt.event.KeyAdapter() {
- public void keyTyped(java.awt.event.KeyEvent evt) {
- lacunarityFieldKeyTyped(evt);
- }
- });
- fractalBrushPanel.add(lacunarityField);
-
- org.openide.awt.Mnemonics.setLocalizedText(jLabel4, org.openide.util.NbBundle.getMessage(TerrainEditorTopComponent.class, "TerrainEditorTopComponent.jLabel4.text")); // NOI18N
- jLabel4.setToolTipText(org.openide.util.NbBundle.getMessage(TerrainEditorTopComponent.class, "TerrainEditorTopComponent.jLabel4.toolTipText")); // NOI18N
- fractalBrushPanel.add(jLabel4);
-
- octavesField.setText(org.openide.util.NbBundle.getMessage(TerrainEditorTopComponent.class, "TerrainEditorTopComponent.octavesField.text")); // NOI18N
- octavesField.setInputVerifier(new NumberInputVerifier());
- octavesField.addActionListener(new java.awt.event.ActionListener() {
- public void actionPerformed(java.awt.event.ActionEvent evt) {
- octavesFieldActionPerformed(evt);
- }
- });
- octavesField.addKeyListener(new java.awt.event.KeyAdapter() {
- public void keyTyped(java.awt.event.KeyEvent evt) {
- octavesFieldKeyTyped(evt);
- }
- });
- fractalBrushPanel.add(octavesField);
-
- org.openide.awt.Mnemonics.setLocalizedText(scaleLabel, org.openide.util.NbBundle.getMessage(TerrainEditorTopComponent.class, "TerrainEditorTopComponent.scaleLabel.text")); // NOI18N
- scaleLabel.setToolTipText(org.openide.util.NbBundle.getMessage(TerrainEditorTopComponent.class, "TerrainEditorTopComponent.scaleLabel.toolTipText")); // NOI18N
- fractalBrushPanel.add(scaleLabel);
-
- scaleField.setText(org.openide.util.NbBundle.getMessage(TerrainEditorTopComponent.class, "TerrainEditorTopComponent.scaleField.text")); // NOI18N
- scaleField.setInputVerifier(new NumberInputVerifier());
- scaleField.addActionListener(new java.awt.event.ActionListener() {
- public void actionPerformed(java.awt.event.ActionEvent evt) {
- scaleFieldActionPerformed(evt);
- }
- });
- scaleField.addKeyListener(new java.awt.event.KeyAdapter() {
- public void keyTyped(java.awt.event.KeyEvent evt) {
- scaleFieldKeyTyped(evt);
- }
- });
- fractalBrushPanel.add(scaleField);
-
- toolSettingsPanel.add(fractalBrushPanel);
-
paintingPanel.setBackground(new java.awt.Color(204, 204, 204));
paintingPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(TerrainEditorTopComponent.class, "TerrainEditorTopComponent.paintingPanel.border.title"))); // NOI18N
paintingPanel.setOpaque(false);
@@ -637,7 +701,7 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
hintPanel.setLayout(hintPanelLayout);
hintPanelLayout.setHorizontalGroup(
hintPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 244, Short.MAX_VALUE)
+ .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 361, Short.MAX_VALUE)
);
hintPanelLayout.setVerticalGroup(
hintPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
@@ -656,7 +720,7 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
.addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(hintPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
- .addComponent(jToolBar1, javax.swing.GroupLayout.DEFAULT_SIZE, 898, Short.MAX_VALUE)
+ .addComponent(jToolBar1, javax.swing.GroupLayout.DEFAULT_SIZE, 1015, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
@@ -773,6 +837,7 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
if (levelTerrainButton.isSelected()) {
LevelTerrainTool tool = new LevelTerrainTool();
toolController.setTerrainEditButtonState(tool);
+ updateLevelToolParams();
setHintText(tool);
} else {
toolController.setTerrainEditButtonState(null);
@@ -860,6 +925,34 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
// TODO add your handling code here:
}//GEN-LAST:event_scaleFieldActionPerformed
+ private void slopeTerrainButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_slopeTerrainButtonActionPerformed
+ if (slopeTerrainButton.isSelected()) {
+ SlopeTerrainTool tool = new SlopeTerrainTool();
+ toolController.setTerrainEditButtonState(tool);
+ updateSlopeToolParams();
+ setHintText(tool);
+ } else {
+ toolController.setTerrainEditButtonState(null);
+ setHintText((TerrainTool) null);
+ }
+ }//GEN-LAST:event_slopeTerrainButtonActionPerformed
+
+ private void levelPrecisionCheckboxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_levelPrecisionCheckboxActionPerformed
+ updateLevelToolParams();
+ }//GEN-LAST:event_levelPrecisionCheckboxActionPerformed
+
+ private void levelAbsoluteHeightFieldKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_levelAbsoluteHeightFieldKeyTyped
+ updateLevelToolParams();
+ }//GEN-LAST:event_levelAbsoluteHeightFieldKeyTyped
+
+ private void levelAbsoluteCheckboxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_levelAbsoluteCheckboxActionPerformed
+ updateLevelToolParams();
+ }//GEN-LAST:event_levelAbsoluteCheckboxActionPerformed
+
+ private void slopePrecisionCheckboxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_slopePrecisionCheckboxActionPerformed
+ updateSlopeToolParams();
+ }//GEN-LAST:event_slopePrecisionCheckboxActionPerformed
+
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton addTextureButton;
private javax.swing.JButton createTerrainButton;
@@ -872,6 +965,8 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
+ private javax.swing.JLabel jLabel6;
+ private javax.swing.JLabel jLabel7;
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel3;
private javax.swing.JScrollPane jScrollPane1;
@@ -881,6 +976,10 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
private javax.swing.JToolBar.Separator jSeparator3;
private javax.swing.JToolBar jToolBar1;
private javax.swing.JTextField lacunarityField;
+ private javax.swing.JCheckBox levelAbsoluteCheckbox;
+ private javax.swing.JFormattedTextField levelAbsoluteHeightField;
+ private javax.swing.JPanel levelBrushPanel;
+ private javax.swing.JCheckBox levelPrecisionCheckbox;
private javax.swing.JToggleButton levelTerrainButton;
private javax.swing.JToggleButton lowerTerrainButton;
private javax.swing.JTextField octavesField;
@@ -896,6 +995,9 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
private javax.swing.JTextField scaleField;
private javax.swing.JLabel scaleLabel;
private javax.swing.JTextField shininessField;
+ private javax.swing.JPanel slopeBrushPanel;
+ private javax.swing.JCheckBox slopePrecisionCheckbox;
+ private javax.swing.JToggleButton slopeTerrainButton;
private javax.swing.JToggleButton smoothTerrainButton;
private javax.swing.ButtonGroup terrainModButtonGroup;
private javax.swing.JFileChooser textureFileChooser;
@@ -943,6 +1045,20 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
}
+ private void updateSlopeToolParams() {
+ SlopeExtraToolParams params = new SlopeExtraToolParams();
+ params.precision = slopePrecisionCheckbox.isSelected();
+ toolController.setExtraToolParams(params);
+ }
+
+ private void updateLevelToolParams() {
+ LevelExtraToolParams params = new LevelExtraToolParams();
+ params.absolute = levelAbsoluteCheckbox.isSelected();
+ params.precision = levelPrecisionCheckbox.isSelected();
+ params.height = new Float(levelAbsoluteHeightField.getText());
+ toolController.setExtraToolParams(params);
+ }
+
private void updateRoughenFractalToolParams() {
try {
RoughExtraToolParams params = new RoughExtraToolParams();
@@ -961,6 +1077,10 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
if (toolController.getCurrentTerrainTool() != null) {
if (toolController.getCurrentTerrainTool().getClass() == RoughTerrainTool.class)
updateRoughenFractalToolParams();
+ else if (toolController.getCurrentTerrainTool().getClass() == LevelTerrainTool.class)
+ updateLevelToolParams();
+ else if (toolController.getCurrentTerrainTool().getClass() == SlopeTerrainTool.class)
+ updateSlopeToolParams();
}
}
diff --git a/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/TerrainToolController.java b/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/TerrainToolController.java
index b47e9b533..8a875c16a 100644
--- a/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/TerrainToolController.java
+++ b/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/TerrainToolController.java
@@ -214,4 +214,4 @@ public class TerrainToolController extends SceneToolController {
terrainTool.keyPressed(kie);
}
}
-}
+}
diff --git a/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/icon_terrain-slope.png b/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/icon_terrain-slope.png
new file mode 100644
index 000000000..3ca33a035
Binary files /dev/null and b/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/icon_terrain-slope.png differ
diff --git a/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/LevelExtraToolParams.java b/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/LevelExtraToolParams.java
new file mode 100644
index 000000000..21135cf97
--- /dev/null
+++ b/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/LevelExtraToolParams.java
@@ -0,0 +1,18 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package com.jme3.gde.terraineditor.tools;
+
+import com.jme3.gde.terraineditor.ExtraToolParams;
+
+/**
+ *
+ * @author Shirkit
+ */
+public class LevelExtraToolParams implements ExtraToolParams {
+
+ public boolean precision;
+ public boolean absolute;
+ public float height;
+}
diff --git a/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/LevelTerrainTool.java b/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/LevelTerrainTool.java
index 35f35d005..56cdcb96d 100644
--- a/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/LevelTerrainTool.java
+++ b/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/LevelTerrainTool.java
@@ -33,6 +33,7 @@ package com.jme3.gde.terraineditor.tools;
import com.jme3.asset.AssetManager;
import com.jme3.gde.core.sceneexplorer.nodes.AbstractSceneExplorerNode;
+import com.jme3.gde.terraineditor.ExtraToolParams;
import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector3f;
import com.jme3.scene.Node;
@@ -48,7 +49,7 @@ import org.openide.loaders.DataObject;
public class LevelTerrainTool extends TerrainTool {
private Vector3f desiredHeight;
-
+ private LevelExtraToolParams toolParams;
public LevelTerrainTool() {
toolHintTextKey = "TerrainEditorTopComponent.toolHint.level";
@@ -66,7 +67,9 @@ public class LevelTerrainTool extends TerrainTool {
return;
if (desiredHeight == null)
desiredHeight = point.clone();
- LevelTerrainToolAction action = new LevelTerrainToolAction(point, radius, weight, desiredHeight);
+ if (toolParams.absolute)
+ desiredHeight.y = toolParams.height;
+ LevelTerrainToolAction action = new LevelTerrainToolAction(point, radius, weight, desiredHeight, toolParams.precision);
action.doActionPerformed(rootNode, dataObject);
}
@@ -81,4 +84,10 @@ public class LevelTerrainTool extends TerrainTool {
super.addMarkerPrimary(parent);
markerPrimary.getMaterial().setColor("Color", ColorRGBA.Red);
}
+
+ @Override
+ public void setExtraParams(ExtraToolParams params) {
+ if (params instanceof LevelExtraToolParams)
+ this.toolParams = (LevelExtraToolParams) params;
+ }
}
diff --git a/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/LevelTerrainToolAction.java b/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/LevelTerrainToolAction.java
index 90d345420..e7e8d83cb 100644
--- a/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/LevelTerrainToolAction.java
+++ b/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/LevelTerrainToolAction.java
@@ -53,15 +53,17 @@ public class LevelTerrainToolAction extends AbstractTerrainToolAction {
private float radius;
private float height;
private Vector3f levelTerrainLocation;
+ private boolean precision;
List undoLocs;
List undoHeights;
- public LevelTerrainToolAction(Vector3f markerLocation, float radius, float height, Vector3f levelTerrainLocation) {
+ public LevelTerrainToolAction(Vector3f markerLocation, float radius, float height, Vector3f levelTerrainLocation, boolean precision) {
this.worldLoc = markerLocation.clone();
this.radius = radius;
this.height = height;
this.levelTerrainLocation = levelTerrainLocation;
+ this.precision = precision;
name = "Level terrain";
}
@@ -70,7 +72,7 @@ public class LevelTerrainToolAction extends AbstractTerrainToolAction {
Terrain terrain = getTerrain(rootNode.getLookup().lookup(Node.class));
if (terrain == null)
return null;
- modifyHeight(terrain, radius, height);
+ modifyHeight(terrain, radius, height, precision);
return terrain;
}
@@ -80,10 +82,10 @@ public class LevelTerrainToolAction extends AbstractTerrainToolAction {
return;
if (undoLocs == null || undoHeights == null)
return;
- resetHeight((Terrain)undoObject, undoLocs, undoHeights);
+ resetHeight((Terrain)undoObject, undoLocs, undoHeights, precision);
}
- private void modifyHeight(Terrain terrain, float radius, float height) {
+ private void modifyHeight(Terrain terrain, float radius, float height, boolean precision) {
if (levelTerrainLocation == null)
return;
@@ -97,6 +99,7 @@ public class LevelTerrainToolAction extends AbstractTerrainToolAction {
List locs = new ArrayList();
List heights = new ArrayList();
+ undoHeights = new ArrayList();
for (int z=-radiusStepsZ; z undoLocs, List undoHeights) {
- List neg = new ArrayList();
- for (Float f : undoHeights)
- neg.add( f * -1f );
-
- terrain.adjustHeight(undoLocs, neg);
+ private void resetHeight(Terrain terrain, List undoLocs, List undoHeights, boolean precision) {
+ if (precision)
+ terrain.setHeight(undoLocs, undoHeights);
+ else {
+ List neg = new ArrayList();
+ for (Float f : undoHeights) {
+ neg.add(f * -1f);
+ }
+ terrain.adjustHeight(undoLocs, neg);
+ }
((Node)terrain).updateModelBound();
}
diff --git a/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/RoughTerrainTool.java b/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/RoughTerrainTool.java
index bca1095c6..beb76cb01 100644
--- a/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/RoughTerrainTool.java
+++ b/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/RoughTerrainTool.java
@@ -1,6 +1,33 @@
/*
- * To change this template, choose Tools | Templates
- * and open the template in the editor.
+ * Copyright (c) 2009-2011 jMonkeyEngine
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package com.jme3.gde.terraineditor.tools;
@@ -40,7 +67,8 @@ public class RoughTerrainTool extends TerrainTool {
@Override
public void setExtraParams(ExtraToolParams params) {
- this.params = (RoughExtraToolParams) params;
+ if (params instanceof RoughExtraToolParams)
+ this.params = (RoughExtraToolParams) params;
}
@Override
@@ -50,6 +78,7 @@ public class RoughTerrainTool extends TerrainTool {
@Override
public void extraParamsChanged(ExtraToolParams params) {
- this.params = (RoughExtraToolParams) params;
+ if (params instanceof RoughExtraToolParams)
+ this.params = (RoughExtraToolParams) params;
}
}
diff --git a/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/RoughTerrainToolAction.java b/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/RoughTerrainToolAction.java
index c40983b1f..c589aa750 100644
--- a/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/RoughTerrainToolAction.java
+++ b/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/RoughTerrainToolAction.java
@@ -1,6 +1,33 @@
/*
- * To change this template, choose Tools | Templates
- * and open the template in the editor.
+ * Copyright (c) 2009-2011 jMonkeyEngine
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package com.jme3.gde.terraineditor.tools;
diff --git a/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/SlopeExtraToolParams.java b/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/SlopeExtraToolParams.java
new file mode 100644
index 000000000..8309335e1
--- /dev/null
+++ b/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/SlopeExtraToolParams.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2009-2011 jMonkeyEngine
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.jme3.gde.terraineditor.tools;
+
+import com.jme3.gde.terraineditor.ExtraToolParams;
+
+/**
+ *
+ * @author Shirkit
+ */
+public class SlopeExtraToolParams implements ExtraToolParams {
+
+ public boolean precision;
+
+}
diff --git a/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/SlopeTerrainTool.java b/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/SlopeTerrainTool.java
new file mode 100644
index 000000000..cc85371a2
--- /dev/null
+++ b/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/SlopeTerrainTool.java
@@ -0,0 +1,144 @@
+/*
+ * Copyright (c) 2009-2011 jMonkeyEngine
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.jme3.gde.terraineditor.tools;
+
+import com.jme3.asset.AssetManager;
+import com.jme3.gde.core.sceneexplorer.nodes.AbstractSceneExplorerNode;
+import com.jme3.gde.terraineditor.ExtraToolParams;
+import com.jme3.input.KeyInput;
+import com.jme3.input.event.KeyInputEvent;
+import com.jme3.material.Material;
+import com.jme3.math.ColorRGBA;
+import com.jme3.math.Vector3f;
+import com.jme3.scene.Geometry;
+import com.jme3.scene.Mesh;
+import com.jme3.scene.Node;
+import com.jme3.scene.shape.Sphere;
+import org.openide.loaders.DataObject;
+
+/**
+ * Generates a slope between two control points.
+ * @author Shirkit
+ */
+public class SlopeTerrainTool extends TerrainTool {
+
+ private Vector3f point1, point2;
+ private Geometry markerThird;
+ private Node parent;
+ private SlopeExtraToolParams toolParams;
+
+ public SlopeTerrainTool() {
+ toolHintTextKey = "TerrainEditorTopComponent.toolHint.shirkit";
+ }
+
+ @Override
+ public void activate(AssetManager manager, Node parent) {
+ super.activate(manager, parent);
+ addMarkerSecondary(parent);
+ addMarkerThird(parent);
+ this.parent = parent;
+ }
+
+ @Override
+ public void hideMarkers() {
+ super.hideMarkers();
+ if (markerThird != null) {
+ markerThird.removeFromParent();
+ }
+ }
+
+ private void addMarkerThird(Node parent) {
+ if (markerThird == null) {
+ markerThird = new Geometry("edit marker secondary");
+ Mesh m2 = new Sphere(8, 8, 0.5f);
+ markerThird.setMesh(m2);
+ Material mat2 = new Material(manager, "Common/MatDefs/Misc/Unshaded.j3md");
+ mat2.getAdditionalRenderState().setWireframe(false);
+ markerThird.setMaterial(mat2);
+ markerThird.setLocalTranslation(0, 0, 0);
+ mat2.setColor("Color", ColorRGBA.Blue);
+ }
+ parent.attachChild(markerThird);
+ }
+
+ @Override
+ public void actionPrimary(Vector3f point, int textureIndex, AbstractSceneExplorerNode rootNode, DataObject dataObject) {
+ if (point1 != null && point2 != null) {
+ SlopeTerrainToolAction action = new SlopeTerrainToolAction(point, point1, point2, radius, weight, toolParams.precision);
+ action.actionPerformed(rootNode, dataObject);
+ }
+ }
+ private boolean leftCtrl = false;
+
+ @Override
+ public void keyPressed(KeyInputEvent kie) {
+ if (kie.getKeyCode() == KeyInput.KEY_LCONTROL) {
+ leftCtrl = kie.isPressed();
+ }
+ switch (kie.getKeyCode()) {
+ case KeyInput.KEY_LCONTROL:
+ leftCtrl = kie.isPressed();
+ break;
+ case KeyInput.KEY_C:
+ point1 = null;
+ point2 = null;
+ markerSecondary.removeFromParent();
+ markerThird.removeFromParent();
+ break;
+ }
+ }
+
+ @Override
+ public void actionSecondary(Vector3f point, int textureIndex, AbstractSceneExplorerNode rootNode, DataObject dataObject) {
+ if (leftCtrl) {
+ point2 = point;
+ if (markerThird.getParent() == null) {
+ parent.attachChild(markerThird);
+ }
+ markerThird.setLocalTranslation(point);
+ } else {
+ point1 = point;
+ if (markerSecondary.getParent() == null) {
+ parent.attachChild(markerSecondary);
+ }
+ markerSecondary.setLocalTranslation(point);
+ }
+ }
+
+ @Override
+ public void setExtraParams(ExtraToolParams params) {
+ if (params instanceof SlopeExtraToolParams)
+ this.toolParams = (SlopeExtraToolParams) params;
+ }
+
+
+}
diff --git a/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/SlopeTerrainToolAction.java b/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/SlopeTerrainToolAction.java
new file mode 100644
index 000000000..d55ab6e80
--- /dev/null
+++ b/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/SlopeTerrainToolAction.java
@@ -0,0 +1,181 @@
+/*
+ * Copyright (c) 2009-2011 jMonkeyEngine
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.jme3.gde.terraineditor.tools;
+
+import com.jme3.gde.core.sceneexplorer.nodes.AbstractSceneExplorerNode;
+import com.jme3.math.*;
+import com.jme3.scene.Node;
+import com.jme3.terrain.Terrain;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author Shirkit
+ */
+public class SlopeTerrainToolAction extends AbstractTerrainToolAction {
+
+ private final Vector3f current;
+ private Vector3f point1;
+ private Vector3f point2;
+ private final float radius;
+ private final float weight;
+ private List undoLocs;
+ private List undoHeights;
+ private final boolean precise;
+
+ public SlopeTerrainToolAction(Vector3f current, Vector3f point1, Vector3f point2, float radius, float weight, boolean precise) {
+ this.current = current.clone();
+ this.point1 = point1;
+ this.point2 = point2;
+ this.radius = radius;
+ this.weight = weight;
+ this.precise = precise;
+ name = "Slope terrain";
+ }
+
+ @Override
+ protected Object doApplyTool(AbstractSceneExplorerNode rootNode) {
+ Terrain terrain = getTerrain(rootNode.getLookup().lookup(Node.class));
+ if (terrain == null) {
+ return null;
+ }
+
+ modifyHeight(terrain, point1, point2, current, radius, weight, precise);
+
+ return terrain;
+ }
+
+ @Override
+ protected void doUndoTool(AbstractSceneExplorerNode rootNode, Object undoObject) {
+ if (undoObject == null) {
+ return;
+ }
+ if (undoLocs == null || undoHeights == null) {
+ return;
+ }
+ resetHeight((Terrain) undoObject, undoLocs, undoHeights, precise);
+ }
+
+ private void modifyHeight(Terrain terrain, Vector3f point1, Vector3f point2, Vector3f current, float radius, float weight, boolean precise) {
+ if (point1.y > point2.y) {
+ Vector3f temp = point1;
+ point1 = point2;
+ point2 = temp;
+ }
+
+ float totaldistance = point1.distance(point2);
+
+ int radiusStepsX = (int) (radius / ((Node) terrain).getLocalScale().x);
+ int radiusStepsZ = (int) (radius / ((Node) terrain).getLocalScale().z);
+
+ float xStepAmount = ((Node) terrain).getLocalScale().x;
+ float zStepAmount = ((Node) terrain).getLocalScale().z;
+
+ List locs = new ArrayList();
+ List heights = new ArrayList();
+ undoHeights = new ArrayList();
+
+ for (int z = -radiusStepsZ; z < radiusStepsZ; z++) {
+ for (int x = -radiusStepsZ; x < radiusStepsX; x++) {
+
+ float locX = current.x + (x * xStepAmount);
+ float locZ = current.z + (z * zStepAmount);
+
+ // see if it is in the radius of the tool
+ if (ToolUtils.isInRadius(locX - current.x, locZ - current.z, radius)) {
+
+ Vector2f terrainLoc = new Vector2f(locX, locZ);
+ // adjust height based on radius of the tool
+ float terrainHeightAtLoc = terrain.getHeightmapHeight(terrainLoc) * ((Node) terrain).getWorldScale().y;
+ float radiusWeight = ToolUtils.calculateRadiusPercent(radius, locX - current.x, locZ - current.z);
+
+ float point1Distance = point1.distance(new Vector3f(locX, terrainHeightAtLoc, locZ));
+ float desiredHeight = point1.y + (point2.y - point1.y) * (point1Distance / totaldistance);
+
+ if (!precise) {
+ float epsilon = 0.1f * weight; // rounding error for snapping
+
+ float adj = 0;
+ if (terrainHeightAtLoc < desiredHeight) {
+ adj = 1;
+ } else if (terrainHeightAtLoc > desiredHeight) {
+ adj = -1;
+ }
+
+ adj *= radiusWeight * weight;
+
+ // test if adjusting too far and then cap it
+ if (adj > 0 && ToolUtils.floatGreaterThan((terrainHeightAtLoc + adj), desiredHeight, epsilon)) {
+ adj = desiredHeight - terrainHeightAtLoc;
+ } else if (adj < 0 && ToolUtils.floatLessThan((terrainHeightAtLoc + adj), desiredHeight, epsilon)) {
+ adj = terrainHeightAtLoc - desiredHeight;
+ }
+
+ if (!ToolUtils.floatEquals(adj, 0, 0.001f)) {
+ locs.add(terrainLoc);
+ heights.add(adj);
+ }
+ } else {
+ locs.add(terrainLoc);
+ heights.add(desiredHeight);
+ undoHeights.add(terrainHeightAtLoc);
+ }
+ }
+ }
+ }
+ undoLocs = locs;
+ if (!precise)
+ undoHeights = heights;
+
+ // do the actual height adjustment
+ if (precise)
+ terrain.setHeight(locs, heights);
+ else
+ terrain.adjustHeight(locs, heights);
+
+ ((Node) terrain).updateModelBound(); // or else we won't collide with it where we just edited
+ }
+
+ private void resetHeight(Terrain terrain, List undoLocs, List undoHeights, boolean precise) {
+ if (precise)
+ terrain.setHeight(undoLocs, undoHeights);
+ else {
+ List neg = new ArrayList();
+ for (Float f : undoHeights) {
+ neg.add(f * -1f);
+ }
+ terrain.adjustHeight(undoLocs, neg);
+ }
+ ((Node) terrain).updateModelBound();
+ }
+}