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
3.0
bre..ns 13 years ago
parent 4f848ab5b5
commit d3b280c7e3
  1. 11
      sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/Bundle.properties
  2. 2
      sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/TerrainCameraController.java
  3. 291
      sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/TerrainEditorTopComponent.form
  4. 344
      sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/TerrainEditorTopComponent.java
  5. 2
      sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/TerrainToolController.java
  6. BIN
      sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/icon_terrain-slope.png
  7. 18
      sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/LevelExtraToolParams.java
  8. 13
      sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/LevelTerrainTool.java
  9. 41
      sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/LevelTerrainToolAction.java
  10. 37
      sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/RoughTerrainTool.java
  11. 31
      sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/RoughTerrainToolAction.java
  12. 44
      sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/SlopeExtraToolParams.java
  13. 144
      sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/SlopeTerrainTool.java
  14. 181
      sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/SlopeTerrainToolAction.java

@ -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=

@ -84,7 +84,7 @@ public class TerrainCameraController extends AbstractCameraController {
if (!isTerrainEditButtonEnabled()) {
return;
}
// move the marker
Vector3f pos = getTerrainCollisionPoint();
if (pos != null) {

@ -23,6 +23,180 @@
</Property>
</Properties>
</Component>
<Container class="javax.swing.JPanel" name="levelBrushPanel">
<Properties>
<Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
<Color blue="cc" green="cc" red="cc" type="rgb"/>
</Property>
<Property name="opaque" type="boolean" value="false"/>
</Properties>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridLayout">
<Property name="columns" type="int" value="2"/>
<Property name="rows" type="int" value="3"/>
</Layout>
<SubComponents>
<Component class="javax.swing.JCheckBox" name="levelPrecisionCheckbox">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/jme3/gde/terraineditor/Bundle.properties" key="TerrainEditorTopComponent.levelPrecisionCheckbox.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="levelPrecisionCheckboxActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JLabel" name="jLabel6">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/jme3/gde/terraineditor/Bundle.properties" key="TerrainEditorTopComponent.jLabel6.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
</Component>
<Component class="javax.swing.JCheckBox" name="levelAbsoluteCheckbox">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/jme3/gde/terraineditor/Bundle.properties" key="TerrainEditorTopComponent.levelAbsoluteCheckbox.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="levelAbsoluteCheckboxActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JFormattedTextField" name="levelAbsoluteHeightField">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/jme3/gde/terraineditor/Bundle.properties" key="TerrainEditorTopComponent.levelAbsoluteHeightField.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Events>
<EventHandler event="keyTyped" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="levelAbsoluteHeightFieldKeyTyped"/>
</Events>
<AuxValues>
<AuxValue name="JavaCodeGenerator_CreateCodeCustom" type="java.lang.String" value="new javax.swing.JFormattedTextField(NumberFormat.getInstance())"/>
</AuxValues>
</Component>
</SubComponents>
</Container>
<Container class="javax.swing.JPanel" name="fractalBrushPanel">
<Properties>
<Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
<Color blue="cc" green="cc" red="cc" type="rgb"/>
</Property>
<Property name="opaque" type="boolean" value="false"/>
</Properties>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridLayout">
<Property name="columns" type="int" value="2"/>
<Property name="rows" type="int" value="3"/>
</Layout>
<SubComponents>
<Component class="javax.swing.JLabel" name="jLabel3">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/jme3/gde/terraineditor/Bundle.properties" key="TerrainEditorTopComponent.jLabel3.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/jme3/gde/terraineditor/Bundle.properties" key="TerrainEditorTopComponent.jLabel3.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
</Component>
<Component class="javax.swing.JTextField" name="lacunarityField">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/jme3/gde/terraineditor/Bundle.properties" key="TerrainEditorTopComponent.lacunarityField.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="inputVerifier" type="javax.swing.InputVerifier" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
<Connection code="new NumberInputVerifier()" type="code"/>
</Property>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="lacunarityFieldActionPerformed"/>
<EventHandler event="keyTyped" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="lacunarityFieldKeyTyped"/>
</Events>
</Component>
<Component class="javax.swing.JLabel" name="jLabel4">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/jme3/gde/terraineditor/Bundle.properties" key="TerrainEditorTopComponent.jLabel4.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/jme3/gde/terraineditor/Bundle.properties" key="TerrainEditorTopComponent.jLabel4.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
</Component>
<Component class="javax.swing.JTextField" name="octavesField">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/jme3/gde/terraineditor/Bundle.properties" key="TerrainEditorTopComponent.octavesField.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="inputVerifier" type="javax.swing.InputVerifier" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
<Connection code="new NumberInputVerifier()" type="code"/>
</Property>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="octavesFieldActionPerformed"/>
<EventHandler event="keyTyped" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="octavesFieldKeyTyped"/>
</Events>
</Component>
<Component class="javax.swing.JLabel" name="scaleLabel">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/jme3/gde/terraineditor/Bundle.properties" key="TerrainEditorTopComponent.scaleLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/jme3/gde/terraineditor/Bundle.properties" key="TerrainEditorTopComponent.scaleLabel.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
</Component>
<Component class="javax.swing.JTextField" name="scaleField">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/jme3/gde/terraineditor/Bundle.properties" key="TerrainEditorTopComponent.scaleField.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="inputVerifier" type="javax.swing.InputVerifier" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
<Connection code="new NumberInputVerifier()" type="code"/>
</Property>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="scaleFieldActionPerformed"/>
<EventHandler event="keyTyped" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="scaleFieldKeyTyped"/>
</Events>
</Component>
</SubComponents>
</Container>
<Container class="javax.swing.JPanel" name="slopeBrushPanel">
<Properties>
<Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
<Color blue="cc" green="cc" red="cc" type="rgb"/>
</Property>
<Property name="opaque" type="boolean" value="false"/>
</Properties>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridLayout">
<Property name="columns" type="int" value="2"/>
<Property name="rows" type="int" value="3"/>
</Layout>
<SubComponents>
<Component class="javax.swing.JCheckBox" name="slopePrecisionCheckbox">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/jme3/gde/terraineditor/Bundle.properties" key="TerrainEditorTopComponent.slopePrecisionCheckbox.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="slopePrecisionCheckboxActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JLabel" name="jLabel7">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/jme3/gde/terraineditor/Bundle.properties" key="TerrainEditorTopComponent.jLabel7.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
</Component>
</SubComponents>
</Container>
</NonVisualComponents>
<Properties>
<Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
@ -53,7 +227,7 @@
<EmptySpace max="-2" attributes="0"/>
<Component id="hintPanel" max="32767" attributes="0"/>
</Group>
<Component id="jToolBar1" alignment="0" pref="898" max="32767" attributes="0"/>
<Component id="jToolBar1" alignment="0" pref="1015" max="32767" attributes="0"/>
</Group>
</DimensionLayout>
<DimensionLayout dim="1">
@ -213,6 +387,28 @@
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="levelTerrainButtonActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JToggleButton" name="slopeTerrainButton">
<Properties>
<Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor">
<ComponentRef name="terrainModButtonGroup"/>
</Property>
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
<Image iconType="3" name="/com/jme3/gde/terraineditor/icon_terrain-slope.png"/>
</Property>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/jme3/gde/terraineditor/Bundle.properties" key="TerrainEditorTopComponent.slopeTerrainButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/jme3/gde/terraineditor/Bundle.properties" key="TerrainEditorTopComponent.slopeTerrainButton.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="focusable" type="boolean" value="false"/>
<Property name="horizontalTextPosition" type="int" value="0"/>
<Property name="verticalTextPosition" type="int" value="3"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="slopeTerrainButtonActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JToolBar$Separator" name="jSeparator2">
</Component>
<Component class="javax.swing.JButton" name="addTextureButton">
@ -352,7 +548,7 @@
<Layout>
<DimensionLayout dim="0">
<Group type="103" groupAlignment="0" attributes="0">
<EmptySpace min="0" pref="57" max="32767" attributes="0"/>
<EmptySpace min="0" pref="147" max="32767" attributes="0"/>
</Group>
</DimensionLayout>
<DimensionLayout dim="1">
@ -383,95 +579,6 @@
<Property name="horizontalGap" type="int" value="0"/>
<Property name="verticalGap" type="int" value="0"/>
</Layout>
<SubComponents>
<Container class="javax.swing.JPanel" name="fractalBrushPanel">
<Properties>
<Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
<Color blue="cc" green="cc" red="cc" type="rgb"/>
</Property>
<Property name="opaque" type="boolean" value="false"/>
</Properties>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridLayout">
<Property name="columns" type="int" value="2"/>
<Property name="rows" type="int" value="3"/>
</Layout>
<SubComponents>
<Component class="javax.swing.JLabel" name="jLabel3">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/jme3/gde/terraineditor/Bundle.properties" key="TerrainEditorTopComponent.jLabel3.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/jme3/gde/terraineditor/Bundle.properties" key="TerrainEditorTopComponent.jLabel3.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
</Component>
<Component class="javax.swing.JTextField" name="lacunarityField">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/jme3/gde/terraineditor/Bundle.properties" key="TerrainEditorTopComponent.lacunarityField.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="inputVerifier" type="javax.swing.InputVerifier" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
<Connection code="new NumberInputVerifier()" type="code"/>
</Property>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="lacunarityFieldActionPerformed"/>
<EventHandler event="keyTyped" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="lacunarityFieldKeyTyped"/>
</Events>
</Component>
<Component class="javax.swing.JLabel" name="jLabel4">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/jme3/gde/terraineditor/Bundle.properties" key="TerrainEditorTopComponent.jLabel4.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/jme3/gde/terraineditor/Bundle.properties" key="TerrainEditorTopComponent.jLabel4.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
</Component>
<Component class="javax.swing.JTextField" name="octavesField">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/jme3/gde/terraineditor/Bundle.properties" key="TerrainEditorTopComponent.octavesField.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="inputVerifier" type="javax.swing.InputVerifier" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
<Connection code="new NumberInputVerifier()" type="code"/>
</Property>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="octavesFieldActionPerformed"/>
<EventHandler event="keyTyped" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="octavesFieldKeyTyped"/>
</Events>
</Component>
<Component class="javax.swing.JLabel" name="scaleLabel">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/jme3/gde/terraineditor/Bundle.properties" key="TerrainEditorTopComponent.scaleLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/jme3/gde/terraineditor/Bundle.properties" key="TerrainEditorTopComponent.scaleLabel.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
</Component>
<Component class="javax.swing.JTextField" name="scaleField">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/jme3/gde/terraineditor/Bundle.properties" key="TerrainEditorTopComponent.scaleField.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="inputVerifier" type="javax.swing.InputVerifier" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
<Connection code="new NumberInputVerifier()" type="code"/>
</Property>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="scaleFieldActionPerformed"/>
<EventHandler event="keyTyped" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="scaleFieldKeyTyped"/>
</Events>
</Component>
</SubComponents>
</Container>
</SubComponents>
</Container>
<Container class="javax.swing.JPanel" name="paintingPanel">
<Properties>
@ -671,7 +778,7 @@
<Layout>
<DimensionLayout dim="0">
<Group type="103" groupAlignment="0" attributes="0">
<Component id="jScrollPane1" alignment="0" pref="244" max="32767" attributes="0"/>
<Component id="jScrollPane1" alignment="0" pref="361" max="32767" attributes="0"/>
</Group>
</DimensionLayout>
<DimensionLayout dim="1">

@ -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<String, JButton> buttons = new HashMap<String, JButton>();
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();
}
}

@ -214,4 +214,4 @@ public class TerrainToolController extends SceneToolController {
terrainTool.keyPressed(kie);
}
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

@ -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;
}

@ -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;
}
}

@ -53,15 +53,17 @@ public class LevelTerrainToolAction extends AbstractTerrainToolAction {
private float radius;
private float height;
private Vector3f levelTerrainLocation;
private boolean precision;
List<Vector2f> undoLocs;
List<Float> 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<Vector2f> locs = new ArrayList<Vector2f>();
List<Float> heights = new ArrayList<Float>();
undoHeights = new ArrayList<Float>();
for (int z=-radiusStepsZ; z<radiusStepsZ; z++) {
for (int x=-radiusStepsZ; x<radiusStepsX; x++) {
@ -130,29 +133,41 @@ public class LevelTerrainToolAction extends AbstractTerrainToolAction {
if (!ToolUtils.floatEquals(adj, 0, 0.001f)) {
locs.add(terrainLoc);
heights.add(adj);
if (precision) {
heights.add(desiredHeight);
undoHeights.add(terrainHeightAtLoc);
} else
heights.add(adj);
}
}
}
}
undoLocs = locs;
undoHeights = heights;
if (!precision)
undoHeights = heights;
// do the actual height adjustment
terrain.adjustHeight(locs, heights);
if (precision)
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<Vector2f> undoLocs, List<Float> undoHeights) {
List<Float> neg = new ArrayList<Float>();
for (Float f : undoHeights)
neg.add( f * -1f );
terrain.adjustHeight(undoLocs, neg);
private void resetHeight(Terrain terrain, List<Vector2f> undoLocs, List<Float> undoHeights, boolean precision) {
if (precision)
terrain.setHeight(undoLocs, undoHeights);
else {
List<Float> neg = new ArrayList<Float>();
for (Float f : undoHeights) {
neg.add(f * -1f);
}
terrain.adjustHeight(undoLocs, neg);
}
((Node)terrain).updateModelBound();
}

@ -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;
}
}

@ -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;

@ -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;
}

@ -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;
}
}

@ -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<Vector2f> undoLocs;
private List<Float> 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<Vector2f> locs = new ArrayList<Vector2f>();
List<Float> heights = new ArrayList<Float>();
undoHeights = new ArrayList<Float>();
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<Vector2f> undoLocs, List<Float> undoHeights, boolean precise) {
if (precise)
terrain.setHeight(undoLocs, undoHeights);
else {
List<Float> neg = new ArrayList<Float>();
for (Float f : undoHeights) {
neg.add(f * -1f);
}
terrain.adjustHeight(undoLocs, neg);
}
((Node) terrain).updateModelBound();
}
}
Loading…
Cancel
Save