From d3b280c7e302f4d7a4dc440b77b2ee7b2b99b7e2 Mon Sep 17 00:00:00 2001 From: "bre..ns" Date: Mon, 23 Jul 2012 22:38:09 +0000 Subject: [PATCH] added 'slope' tool to terrain editor, and some more options to the 'level terrain' tool. Thanks @shirkit git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@9582 75d07b2b-3a1a-0410-a2c5-0572b91ccdca --- .../jme3/gde/terraineditor/Bundle.properties | 11 +- .../TerrainCameraController.java | 2 +- .../TerrainEditorTopComponent.form | 291 ++++++++++----- .../TerrainEditorTopComponent.java | 344 ++++++++++++------ .../terraineditor/TerrainToolController.java | 2 +- .../gde/terraineditor/icon_terrain-slope.png | Bin 0 -> 2963 bytes .../tools/LevelExtraToolParams.java | 18 + .../terraineditor/tools/LevelTerrainTool.java | 13 +- .../tools/LevelTerrainToolAction.java | 41 ++- .../terraineditor/tools/RoughTerrainTool.java | 37 +- .../tools/RoughTerrainToolAction.java | 31 +- .../tools/SlopeExtraToolParams.java | 44 +++ .../terraineditor/tools/SlopeTerrainTool.java | 144 ++++++++ .../tools/SlopeTerrainToolAction.java | 181 +++++++++ 14 files changed, 931 insertions(+), 228 deletions(-) create mode 100644 sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/icon_terrain-slope.png create mode 100644 sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/LevelExtraToolParams.java create mode 100644 sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/SlopeExtraToolParams.java create mode 100644 sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/SlopeTerrainTool.java create mode 100644 sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/SlopeTerrainToolAction.java 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 0000000000000000000000000000000000000000..3ca33a035ab75257a41189ea143e1e6e3521d113 GIT binary patch literal 2963 zcmV;E3vBd>P)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0002KNkl!7Xs;xj#)WOh6RuCZ>PW_BVw&BEBK#}2uEPzKSRf-CH zhT}^qs@S002ov JPDHLkV1iObdHMhV literal 0 HcmV?d00001 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(); + } +}