added new Terrain editor noise-based 'roughen' tool

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@8964 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
3.0
bre..ns 13 years ago
parent addfe4283b
commit da3b43174c
  1. 4
      sdk/jme3-core-baselibs/nbproject/genfiles.properties
  2. 6
      sdk/jme3-core-baselibs/nbproject/project.xml
  3. 11
      sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/Bundle.properties
  4. 13
      sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/ExtraToolParams.java
  5. 170
      sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/TerrainEditorTopComponent.form
  6. 252
      sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/TerrainEditorTopComponent.java
  7. 16
      sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/TerrainToolController.java
  8. 32
      sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/RoughExtraToolParams.java
  9. 55
      sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/RoughTerrainTool.java
  10. 182
      sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/RoughTerrainToolAction.java
  11. 12
      sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/TerrainTool.java

@ -1,8 +1,8 @@
build.xml.data.CRC32=05d5b002
build.xml.data.CRC32=06721bf2
build.xml.script.CRC32=cdae6a36
build.xml.stylesheet.CRC32=a56c6a5b@1.46.2
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
nbproject/build-impl.xml.data.CRC32=05d5b002
nbproject/build-impl.xml.data.CRC32=06721bf2
nbproject/build-impl.xml.script.CRC32=246f9b81
nbproject/build-impl.xml.stylesheet.CRC32=238281d1@1.46.2

@ -111,6 +111,11 @@
<package>com.jme3.terrain.geomipmap.lodcalc.util</package>
<package>com.jme3.terrain.geomipmap.picking</package>
<package>com.jme3.terrain.heightmap</package>
<package>com.jme3.terrain.noise</package>
<package>com.jme3.terrain.noise.basis</package>
<package>com.jme3.terrain.noise.filter</package>
<package>com.jme3.terrain.noise.fractal</package>
<package>com.jme3.terrain.noise.modulator</package>
<package>com.jme3.texture</package>
<package>com.jme3.texture.plugins</package>
<package>com.jme3.ui</package>
@ -122,7 +127,6 @@
<package>jme3tools.converters.model</package>
<package>jme3tools.converters.model.strip</package>
<package>jme3tools.navigation</package>
<package>jme3tools.nvtex</package>
<package>jme3tools.optimize</package>
<package>jme3tools.savegame</package>
</public-packages>

@ -108,5 +108,14 @@ TerrainEditorTopComponent.toolHint.level=Right click to set desired height value
TerrainEditorTopComponent.jPanel2.border.title=Material
TerrainEditorTopComponent.jLabel1.text=Shininess
TerrainEditorTopComponent.wardIsoCheckBox.text=WardIso
TerrainEditorTopComponent.shininessField.text=0.001
TerrainEditorTopComponent.shininessField.text=0.0
TerrainEditorTopComponent.shininessField.toolTipText=0 or greater
TerrainEditorTopComponent.jLabel3.text=Sharpness
TerrainEditorTopComponent.lacunarityField.text=2
TerrainEditorTopComponent.jLabel4.text=Hill frequency
TerrainEditorTopComponent.octavesField.text=6
TerrainEditorTopComponent.scaleLabel.text=Density
TerrainEditorTopComponent.scaleField.text=0.1
TerrainEditorTopComponent.jLabel3.toolTipText=How steep the slopes are. Lower is steeper (must be greater than 1.0)
TerrainEditorTopComponent.jLabel4.toolTipText=Hill area in terms of octaves. Larger is smaller hill, values of 8 or lower are wide hills.
TerrainEditorTopComponent.scaleLabel.toolTipText=How close together the bumps are. Larger is closer.

@ -0,0 +1,13 @@
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.jme3.gde.terraineditor;
/**
* Extra parameters for specific terrain tools.
* @author Brent Owens
*/
public interface ExtraToolParams {
}

@ -39,17 +39,20 @@
<Layout>
<DimensionLayout dim="0">
<Group type="103" groupAlignment="0" attributes="0">
<Component id="jScrollPane3" alignment="1" pref="920" max="32767" attributes="0"/>
<Component id="mainScrollPane" alignment="1" pref="920" max="32767" attributes="0"/>
</Group>
</DimensionLayout>
<DimensionLayout dim="1">
<Group type="103" groupAlignment="0" attributes="0">
<Component id="jScrollPane3" alignment="1" pref="253" max="32767" attributes="0"/>
<Group type="102" alignment="0" attributes="0">
<Component id="mainScrollPane" pref="333" max="32767" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
</Group>
</Group>
</DimensionLayout>
</Layout>
<SubComponents>
<Container class="javax.swing.JScrollPane" name="jScrollPane3">
<Container class="javax.swing.JScrollPane" name="mainScrollPane">
<Properties>
<Property name="verticalScrollBarPolicy" type="int" value="22"/>
</Properties>
@ -71,11 +74,11 @@
<EmptySpace max="-2" attributes="0"/>
<Component id="paintingPanel" max="32767" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" max="-2" attributes="0">
<Group type="103" groupAlignment="0" attributes="0">
<Component id="jPanel2" max="32767" attributes="1"/>
<Component id="terrainOpsPanel" alignment="0" max="32767" attributes="1"/>
<Component id="terrainOpsPanel" alignment="0" min="-2" max="-2" attributes="1"/>
</Group>
<EmptySpace pref="20" max="32767" attributes="0"/>
<EmptySpace min="-2" pref="20" max="-2" attributes="0"/>
<Component id="hintPanel" max="32767" attributes="0"/>
</Group>
<Component id="jToolBar1" alignment="0" pref="901" max="32767" attributes="0"/>
@ -86,16 +89,17 @@
<Group type="102" alignment="1" attributes="0">
<Component id="jToolBar1" min="-2" pref="27" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="1" attributes="0">
<Component id="toolSettingsPanel" pref="218" max="32767" attributes="1"/>
<Component id="paintingPanel" max="32767" attributes="1"/>
<Component id="hintPanel" alignment="1" max="32767" attributes="1"/>
<Group type="103" groupAlignment="0" attributes="0">
<Component id="hintPanel" max="32767" attributes="1"/>
<Group type="102" alignment="0" attributes="0">
<Component id="terrainOpsPanel" min="-2" max="-2" attributes="1"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="jPanel2" max="32767" attributes="0"/>
</Group>
<Component id="paintingPanel" alignment="0" max="32767" attributes="1"/>
<Component id="toolSettingsPanel" alignment="0" pref="285" max="32767" attributes="1"/>
</Group>
<EmptySpace min="-2" pref="148" max="-2" attributes="0"/>
</Group>
</Group>
</DimensionLayout>
@ -120,7 +124,7 @@
</DimensionLayout>
<DimensionLayout dim="1">
<Group type="103" groupAlignment="0" attributes="0">
<Component id="jScrollPane1" alignment="0" pref="191" max="32767" attributes="0"/>
<Component id="jScrollPane1" alignment="0" pref="258" max="32767" attributes="0"/>
</Group>
</DimensionLayout>
</Layout>
@ -203,6 +207,142 @@
<EventHandler event="stateChanged" listener="javax.swing.event.ChangeListener" parameters="javax.swing.event.ChangeEvent" handler="heightSliderStateChanged"/>
</Events>
</Component>
<Container class="javax.swing.JScrollPane" name="brushVariablesScrollPane">
<Properties>
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[158, 253]"/>
</Property>
</Properties>
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
<SubComponents>
<Container class="javax.swing.JPanel" name="fractalBrushPanel">
<Layout>
<DimensionLayout dim="0">
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" attributes="0">
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
<Component id="jLabel3" alignment="0" min="-2" max="-2" attributes="1"/>
<Group type="102" alignment="0" attributes="0">
<Group type="103" groupAlignment="0" attributes="0">
<Component id="scaleLabel" alignment="0" min="-2" max="-2" attributes="0"/>
<Component id="jLabel4" alignment="0" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace type="unrelated" max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" max="-2" attributes="0">
<Component id="scaleField" max="32767" attributes="1"/>
<Component id="octavesField" alignment="0" max="32767" attributes="1"/>
<Component id="lacunarityField" alignment="0" pref="36" max="32767" attributes="1"/>
</Group>
<EmptySpace max="32767" attributes="0"/>
</Group>
</Group>
<EmptySpace min="67" pref="67" max="-2" attributes="0"/>
</Group>
</Group>
</DimensionLayout>
<DimensionLayout dim="1">
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0">
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0">
<Component id="jLabel3" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="lacunarityField" alignment="3" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0">
<Component id="jLabel4" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="octavesField" alignment="3" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0">
<Component id="scaleLabel" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="scaleField" alignment="3" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace pref="96" max="32767" attributes="0"/>
</Group>
</Group>
</DimensionLayout>
</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>
</SubComponents>
</Container>
<Container class="javax.swing.JPanel" name="paintingPanel">
@ -250,7 +390,7 @@
<EmptySpace max="-2" attributes="0"/>
<Component id="removeTextureButton" min="-2" max="-2" attributes="0"/>
</Group>
<Component id="jScrollPane2" pref="166" max="32767" attributes="0"/>
<Component id="jScrollPane2" pref="233" max="32767" attributes="0"/>
</Group>
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0">
@ -523,8 +663,10 @@
<Property name="actionCommand" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="com/jme3/gde/terraineditor/Bundle.properties" key="TerrainEditorTopComponent.roughTerrainButton.actionCommand" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="enabled" type="boolean" value="false"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="roughTerrainButtonActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JToggleButton" name="levelTerrainButton">
<Properties>
@ -636,7 +778,7 @@
<Component id="shininessField" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="jLabel1" alignment="3" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace pref="43" max="32767" attributes="0"/>
<EmptySpace pref="110" max="32767" attributes="0"/>
</Group>
</Group>
</DimensionLayout>

@ -52,6 +52,8 @@ 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.math.Vector3f;
@ -62,6 +64,7 @@ import com.jme3.terrain.Terrain;
import com.jme3.terrain.heightmap.AbstractHeightMap;
import com.jme3.texture.Texture;
import java.awt.Component;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
@ -198,6 +201,25 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
} else {
hintTextArea.setText(org.openide.util.NbBundle.getMessage(TerrainEditorTopComponent.class, "TerrainEditorTopComponent.toolHint.default"));
}
// show/hide the extra tool variables scroll pane
if (tool == null) {
brushVariablesScrollPane.setVisible(false);
fractalBrushPanel.setVisible(false);
} else if (tool.getClass() == RoughTerrainTool.class) {
if (roughTerrainButton.isSelected()) {
brushVariablesScrollPane.setVisible(true);
fractalBrushPanel.setVisible(true);
} else {
brushVariablesScrollPane.setVisible(false);
fractalBrushPanel.setVisible(false);
}
} else {
brushVariablesScrollPane.setVisible(false);
fractalBrushPanel.setVisible(false);
}
mainScrollPane.validate();
}
/** This method is called from within the constructor to
@ -210,7 +232,7 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
terrainModButtonGroup = new ToggleButtonGroup();
textureFileChooser = new javax.swing.JFileChooser();
jScrollPane3 = new javax.swing.JScrollPane();
mainScrollPane = new javax.swing.JScrollPane();
jPanel1 = new javax.swing.JPanel();
hintPanel = new javax.swing.JPanel();
jScrollPane1 = new javax.swing.JScrollPane();
@ -220,6 +242,14 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
radiusSlider = new javax.swing.JSlider();
heightLabel = new javax.swing.JLabel();
heightSlider = new javax.swing.JSlider();
brushVariablesScrollPane = new javax.swing.JScrollPane();
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();
@ -252,7 +282,7 @@ 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());
jScrollPane3.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
mainScrollPane.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
jPanel1.setMaximumSize(new java.awt.Dimension(32767, 300));
@ -276,7 +306,7 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
);
hintPanelLayout.setVerticalGroup(
hintPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 191, Short.MAX_VALUE)
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 258, Short.MAX_VALUE)
);
toolSettingsPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(TerrainEditorTopComponent.class, "TerrainEditorTopComponent.toolSettingsPanel.border.title"))); // NOI18N
@ -312,6 +342,98 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
});
toolSettingsPanel.add(heightSlider);
brushVariablesScrollPane.setPreferredSize(new java.awt.Dimension(158, 253));
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
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);
}
});
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
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);
}
});
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
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);
}
});
javax.swing.GroupLayout fractalBrushPanelLayout = new javax.swing.GroupLayout(fractalBrushPanel);
fractalBrushPanel.setLayout(fractalBrushPanelLayout);
fractalBrushPanelLayout.setHorizontalGroup(
fractalBrushPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(fractalBrushPanelLayout.createSequentialGroup()
.addContainerGap()
.addGroup(fractalBrushPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jLabel3)
.addGroup(fractalBrushPanelLayout.createSequentialGroup()
.addGroup(fractalBrushPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(scaleLabel)
.addComponent(jLabel4))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(fractalBrushPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addComponent(scaleField)
.addComponent(octavesField)
.addComponent(lacunarityField, javax.swing.GroupLayout.DEFAULT_SIZE, 36, Short.MAX_VALUE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
.addGap(67, 67, 67))
);
fractalBrushPanelLayout.setVerticalGroup(
fractalBrushPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(fractalBrushPanelLayout.createSequentialGroup()
.addContainerGap()
.addGroup(fractalBrushPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel3)
.addComponent(lacunarityField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(fractalBrushPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel4)
.addComponent(octavesField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(fractalBrushPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(scaleLabel)
.addComponent(scaleField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addContainerGap(96, Short.MAX_VALUE))
);
brushVariablesScrollPane.setViewportView(fractalBrushPanel);
toolSettingsPanel.add(brushVariablesScrollPane);
paintingPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(TerrainEditorTopComponent.class, "TerrainEditorTopComponent.paintingPanel.border.title"))); // NOI18N
textureTable.setModel(new TextureTableModel());
@ -381,7 +503,7 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
.addComponent(addTextureButton)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(removeTextureButton))
.addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 166, Short.MAX_VALUE))
.addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 233, Short.MAX_VALUE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(paintingPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(remainingTexTitleLabel)
@ -480,7 +602,11 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
org.openide.awt.Mnemonics.setLocalizedText(roughTerrainButton, org.openide.util.NbBundle.getMessage(TerrainEditorTopComponent.class, "TerrainEditorTopComponent.roughTerrainButton.text")); // NOI18N
roughTerrainButton.setToolTipText(org.openide.util.NbBundle.getMessage(TerrainEditorTopComponent.class, "TerrainEditorTopComponent.roughTerrainButton.toolTipText")); // NOI18N
roughTerrainButton.setActionCommand(org.openide.util.NbBundle.getMessage(TerrainEditorTopComponent.class, "TerrainEditorTopComponent.roughTerrainButton.actionCommand")); // NOI18N
roughTerrainButton.setEnabled(false);
roughTerrainButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
roughTerrainButtonActionPerformed(evt);
}
});
jToolBar1.add(roughTerrainButton);
terrainModButtonGroup.add(levelTerrainButton);
@ -575,7 +701,7 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(shininessField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel1))
.addContainerGap(43, Short.MAX_VALUE))
.addContainerGap(110, Short.MAX_VALUE))
);
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
@ -587,10 +713,10 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(paintingPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(terrainOpsPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 20, Short.MAX_VALUE)
.addComponent(terrainOpsPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(20, 20, 20)
.addComponent(hintPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addComponent(jToolBar1, javax.swing.GroupLayout.DEFAULT_SIZE, 901, Short.MAX_VALUE)
);
@ -599,27 +725,30 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
.addComponent(jToolBar1, javax.swing.GroupLayout.PREFERRED_SIZE, 27, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(toolSettingsPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 218, Short.MAX_VALUE)
.addComponent(paintingPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(hintPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(javax.swing.GroupLayout.Alignment.LEADING, jPanel1Layout.createSequentialGroup()
.addGroup(jPanel1Layout.createSequentialGroup()
.addComponent(terrainOpsPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))
.addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addComponent(paintingPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(toolSettingsPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 285, Short.MAX_VALUE))
.addGap(148, 148, 148))
);
jScrollPane3.setViewportView(jPanel1);
mainScrollPane.setViewportView(jPanel1);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane3, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 920, Short.MAX_VALUE)
.addComponent(mainScrollPane, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 920, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane3, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 253, Short.MAX_VALUE)
.addGroup(layout.createSequentialGroup()
.addComponent(mainScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 333, Short.MAX_VALUE)
.addContainerGap())
);
}// </editor-fold>//GEN-END:initComponents
@ -788,10 +917,48 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
}
}//GEN-LAST:event_shininessFieldKeyTyped
private void octavesFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_octavesFieldActionPerformed
// TODO add your handling code here:
}//GEN-LAST:event_octavesFieldActionPerformed
private void roughTerrainButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_roughTerrainButtonActionPerformed
if (roughTerrainButton.isSelected()) {
RoughTerrainTool tool = new RoughTerrainTool();
toolController.setTerrainEditButtonState(tool);
updateRoughenFractalToolParams();
setHintText(tool);
} else {
toolController.setTerrainEditButtonState(null);
setHintText((TerrainTool) null);
}
}//GEN-LAST:event_roughTerrainButtonActionPerformed
private void lacunarityFieldKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_lacunarityFieldKeyTyped
updateRoughenFractalToolParams();
}//GEN-LAST:event_lacunarityFieldKeyTyped
private void octavesFieldKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_octavesFieldKeyTyped
updateRoughenFractalToolParams();
}//GEN-LAST:event_octavesFieldKeyTyped
private void scaleFieldKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_scaleFieldKeyTyped
updateRoughenFractalToolParams();
}//GEN-LAST:event_scaleFieldKeyTyped
private void lacunarityFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_lacunarityFieldActionPerformed
// TODO add your handling code here:
}//GEN-LAST:event_lacunarityFieldActionPerformed
private void scaleFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_scaleFieldActionPerformed
// TODO add your handling code here:
}//GEN-LAST:event_scaleFieldActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton addTextureButton;
private javax.swing.JScrollPane brushVariablesScrollPane;
private javax.swing.JButton createTerrainButton;
private javax.swing.JToggleButton eraseButton;
private javax.swing.JPanel fractalBrushPanel;
private javax.swing.JButton genEntropiesButton;
private javax.swing.JLabel heightLabel;
private javax.swing.JSlider heightSlider;
@ -799,16 +966,20 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
private javax.swing.JTextArea hintTextArea;
private javax.swing.JButton jButton1;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JScrollPane jScrollPane3;
private javax.swing.JToolBar.Separator jSeparator1;
private javax.swing.JToolBar.Separator jSeparator2;
private javax.swing.JToolBar jToolBar1;
private javax.swing.JTextField lacunarityField;
private javax.swing.JToggleButton levelTerrainButton;
private javax.swing.JToggleButton lowerTerrainButton;
private javax.swing.JScrollPane mainScrollPane;
private javax.swing.JTextField octavesField;
private javax.swing.JToggleButton paintButton;
private javax.swing.JPanel paintingPanel;
private javax.swing.JLabel radiusLabel;
@ -818,6 +989,8 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
private javax.swing.JLabel remainingTexturesLabel;
private javax.swing.JButton removeTextureButton;
private javax.swing.JToggleButton roughTerrainButton;
private javax.swing.JTextField scaleField;
private javax.swing.JLabel scaleLabel;
private javax.swing.JTextField shininessField;
private javax.swing.JToggleButton smoothTerrainButton;
private javax.swing.ButtonGroup terrainModButtonGroup;
@ -829,6 +1002,25 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
private javax.swing.JCheckBox wardIsoCheckBox;
// End of variables declaration//GEN-END:variables
/**
* Validate text fields for Float number values
*/
protected class NumberInputVerifier extends InputVerifier {
@Override
public boolean verify(JComponent input) {
try {
javax.swing.JTextField textField = (javax.swing.JTextField)input;
String a=textField.getText();
Float.parseFloat(a);
}
catch (NumberFormatException e) {
Toolkit.getDefaultToolkit().beep();
return false;
}
return true;
}
}
private class ShininessVerifier extends InputVerifier {
@Override
public boolean verify(JComponent input) {
@ -839,6 +1031,7 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
if (f > 0)
return true;
} catch (Exception e) {
Toolkit.getDefaultToolkit().beep();
return false;
}
}
@ -847,6 +1040,27 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
}
private void updateRoughenFractalToolParams() {
try {
RoughExtraToolParams params = new RoughExtraToolParams();
//params.amplitude = new Float(amplitudeField.getText());
//params.frequency = new Float(frequencyField.getText());
params.lacunarity = new Float(lacunarityField.getText());
params.octaves = new Float(octavesField.getText());
//params.roughness = new Float(roughnessField.getText());
params.scale = new Float(scaleField.getText());
toolController.setExtraToolParams(params);
} catch (NumberFormatException e) {}
}
protected void getExtraToolParams() {
if (toolController.getCurrentTerrainTool() != null) {
if (toolController.getCurrentTerrainTool().getClass() == RoughTerrainTool.class)
updateRoughenFractalToolParams();
}
}
/**
* Gets default instance. Do not use directly: reserved for *.settings files only,
* i.e. deserialization routines; otherwise you could get a non-deserialized instance.
@ -1172,6 +1386,7 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
camController.setEditorController(editorController);
toolController.setEditorController(editorController);
toolController.setCameraController(camController);
toolController.setTopComponent(this);
editorController.setToolController(toolController);
toolController.setHeightToolRadius((float) radiusSlider.getValue() / (float) radiusSlider.getMaximum());
@ -1183,6 +1398,7 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
if (editorController.getTerrain(null) != null) {
//createTerrainButton.setEnabled(false); // only let the user add one terrain
}
brushVariablesScrollPane.setVisible(false);
}
}

@ -56,6 +56,7 @@ public class TerrainToolController extends SceneToolController {
private TerrainTool terrainTool;
private TerrainEditorController editorController;
private TerrainCameraController cameraController;
private TerrainEditorTopComponent topComponent;
private float toolRadius;
private float toolWeight;
@ -75,6 +76,10 @@ public class TerrainToolController extends SceneToolController {
this.cameraController = cameraController;
}
public void setTopComponent(TerrainEditorTopComponent topComponent) {
this.topComponent = topComponent;
}
/**
* @param heightToolHeight percent of the slider
*/
@ -171,6 +176,7 @@ public class TerrainToolController extends SceneToolController {
if (terrainTool != null) {
Vector3f point = getMarkerLocation();
if (point != null) {
topComponent.getExtraToolParams();
terrainTool.actionPrimary(point, selectedTextureIndex, jmeRootNode, editorController.getCurrentDataObject());
}
@ -192,4 +198,14 @@ public class TerrainToolController extends SceneToolController {
}
void setExtraToolParams(ExtraToolParams params) {
if (terrainTool != null) {
terrainTool.setExtraParams(params);
}
}
public TerrainTool getCurrentTerrainTool() {
return terrainTool;
}
}

@ -0,0 +1,32 @@
/*
* 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;
/**
* Parameters, and default values, for the fractal roughen tool
* @author Brent Owens
*/
public class RoughExtraToolParams implements ExtraToolParams{
public float roughness = 1.2f;
public float frequency = 0.2f;
public float amplitude = 1.0f;
public float lacunarity = 2.12f;
public float octaves = 8;
public float scale = 1.0f;
// the below parameters are not get in the UI yet:
float perturbMagnitude = 0.2f;
float erodeRadius = 5;
float erodeTalus = 0.011f;
float smoothRadius = 1;
float smoothEffect = 0.1f;
int iterations = 1;
}

@ -0,0 +1,55 @@
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.jme3.gde.terraineditor.tools;
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;
import org.openide.loaders.DataObject;
/**
* Roughens the terrain using a fractal noise routine.
* @author Brent Owens
*/
public class RoughTerrainTool extends TerrainTool {
private RoughExtraToolParams params;
@Override
public void actionPrimary(Vector3f point, int textureIndex, AbstractSceneExplorerNode rootNode, DataObject dataObject) {
if (radius == 0 || weight == 0)
return;
RoughTerrainToolAction action = new RoughTerrainToolAction(point, radius, weight, (RoughExtraToolParams)params);
action.doActionPerformed(rootNode, dataObject);
}
@Override
public void actionSecondary(Vector3f point, int textureIndex, AbstractSceneExplorerNode rootNode, DataObject dataObject) {
// do nothing
}
@Override
public void addMarkerPrimary(Node parent) {
super.addMarkerPrimary(parent);
markerPrimary.getMaterial().setColor("Color", ColorRGBA.Yellow);
}
@Override
public void setExtraParams(ExtraToolParams params) {
this.params = (RoughExtraToolParams) params;
}
@Override
public ExtraToolParams getExtraParams() {
return params;
}
@Override
public void extraParamsChanged(ExtraToolParams params) {
this.params = (RoughExtraToolParams) params;
}
}

@ -0,0 +1,182 @@
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.jme3.gde.terraineditor.tools;
import com.jme3.gde.core.sceneexplorer.nodes.AbstractSceneExplorerNode;
import com.jme3.gde.terraineditor.ExtraToolParams;
import com.jme3.math.Vector2f;
import com.jme3.math.Vector3f;
import com.jme3.scene.Node;
import com.jme3.terrain.Terrain;
import com.jme3.terrain.noise.Basis;
import com.jme3.terrain.noise.ShaderUtils;
import com.jme3.terrain.noise.basis.FilteredBasis;
import com.jme3.terrain.noise.filter.IterativeFilter;
import com.jme3.terrain.noise.filter.OptimizedErode;
import com.jme3.terrain.noise.filter.PerturbFilter;
import com.jme3.terrain.noise.filter.SmoothFilter;
import com.jme3.terrain.noise.fractal.FractalSum;
import com.jme3.terrain.noise.modulator.NoiseModulator;
import java.nio.FloatBuffer;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author sploreg
*/
public class RoughTerrainToolAction extends AbstractTerrainToolAction {
private Vector3f worldLoc;
private float radius;
private float weight;
private RoughExtraToolParams params;
List<Vector2f> undoLocs;
List<Float> undoHeights;
public RoughTerrainToolAction(Vector3f markerLocation, float radius, float weight, ExtraToolParams params) {
this.worldLoc = markerLocation.clone();
this.radius = radius;
this.weight = weight;
this.params = (RoughExtraToolParams)params;
name = "Rough terrain";
}
@Override
protected Object doApplyTool(AbstractSceneExplorerNode rootNode) {
Terrain terrain = getTerrain(rootNode.getLookup().lookup(Node.class));
if (terrain == null)
return null;
roughen(terrain, radius, weight, params);
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);
}
private void roughen(Terrain terrain, float radius, float weight, RoughExtraToolParams params) {
Basis fractalFilter = createFractalGenerator(params, weight);
List<Vector2f> locs = new ArrayList<Vector2f>();
List<Float> heights = new ArrayList<Float>();
// offset it by radius because in the loop we iterate through 2 radii
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;
int r2 = (int) (radius*2);
FloatBuffer fb = fractalFilter.getBuffer(worldLoc.x, worldLoc.z, 0, r2);
//for (int y=0; y<r2; y++) {
// for (int x=0; x<r2; x++) {
int xfb=0,yfb=0;
for (int z = -radiusStepsZ; z < radiusStepsZ; z++) {
for (int x = -radiusStepsX; x < radiusStepsX; x++) {
float locX = worldLoc.x + (x * xStepAmount);
float locZ = worldLoc.z + (z * zStepAmount);
float height = fb.get(yfb*r2 + xfb);
if (isInRadius(locX - worldLoc.x, locZ - worldLoc.z, radius)) {
// see if it is in the radius of the tool
float h = calculateHeight(radius, height, locX - worldLoc.x, locZ - worldLoc.z);
locs.add(new Vector2f(locX, locZ));
heights.add(h);
}
xfb++;
}
yfb++;
xfb = 0;
}
undoLocs = locs;
undoHeights = heights;
// do the actual height adjustment
terrain.adjustHeight(locs, heights);
((Node)terrain).updateModelBound(); // or else we won't collide with it where we just edited
}
private boolean isInRadius(float x, float y, float radius) {
Vector2f point = new Vector2f(x, y);
// return true if the distance is less than equal to the radius
return point.length() <= radius;
}
private float calculateHeight(float radius, float heightFactor, float x, float z) {
// find percentage for each 'unit' in radius
Vector2f point = new Vector2f(x, z);
float val = point.length() / radius;
val = 1 - val;
if (val <= 0) {
val = 0;
}
return heightFactor * val * 0.1f; // 0.1 scales it down a bit to lower the impact of the tool
}
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);
((Node)terrain).updateModelBound();
}
private Basis createFractalGenerator(RoughExtraToolParams params, float weight) {
FractalSum base = new FractalSum();
base.setRoughness(params.roughness);
base.setFrequency(params.frequency);
base.setAmplitude(weight);
base.setLacunarity(params.lacunarity <= 1 ? 1.1f : params.lacunarity); // make it greater than 1.0f
base.setOctaves(params.octaves);
float scale = params.scale;
if (scale > 1.0f)
scale = 1.0f;
if (scale < 0)
scale = 0;
base.setScale(scale);//0.02125f
base.addModulator(new NoiseModulator() {
@Override
public float value(float... in) {
return ShaderUtils.clamp(in[0] * 0.5f + 0.5f, 0, 1);
}
});
FilteredBasis ground = new FilteredBasis(base);
PerturbFilter perturb = new PerturbFilter();
perturb.setMagnitude(0.2f);//0.119 the higher, the slower it is
OptimizedErode therm = new OptimizedErode();
therm.setRadius(5);
therm.setTalus(0.011f);
SmoothFilter smooth = new SmoothFilter();
smooth.setRadius(1);
smooth.setEffect(0.1f); // 0.7
IterativeFilter iterate = new IterativeFilter();
iterate.addPreFilter(perturb);
iterate.addPostFilter(smooth);
iterate.setFilter(therm);
iterate.setIterations(1);
ground.addPreFilter(iterate);
return ground;
}
}

@ -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.material.Material;
import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector3f;
@ -180,5 +181,16 @@ public abstract class TerrainTool {
this.toolHintTextKey = toolHintTextKey;
}
public void setExtraParams(ExtraToolParams params) {
// override in subclasses that need it
}
public ExtraToolParams getExtraParams() {
// override in subclasses that need it
return null;
}
public void extraParamsChanged(ExtraToolParams params) {
// override in subclasses that need it
}
}

Loading…
Cancel
Save