terrain height tool remembers undo history as an entire mouseDown event now. RMB now erases
git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@10474 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
This commit is contained in:
parent
ef700eff19
commit
3079ca689f
@ -9,7 +9,6 @@ OpenIDE-Module-Name=Terrain Editor
|
|||||||
OpenIDE-Module-Short-Description=Terrain Editor
|
OpenIDE-Module-Short-Description=Terrain Editor
|
||||||
TerrainEditorTopComponent.createTerrainButton.text=
|
TerrainEditorTopComponent.createTerrainButton.text=
|
||||||
TerrainEditorTopComponent.raiseTerrainButton.text=
|
TerrainEditorTopComponent.raiseTerrainButton.text=
|
||||||
TerrainEditorTopComponent.lowerTerrainButton.text=
|
|
||||||
TerrainEditorTopComponent.smoothTerrainButton.text=
|
TerrainEditorTopComponent.smoothTerrainButton.text=
|
||||||
TerrainEditorTopComponent.roughTerrainButton.text=
|
TerrainEditorTopComponent.roughTerrainButton.text=
|
||||||
TerrainEditorTopComponent.radiusLabel.text=Radius:
|
TerrainEditorTopComponent.radiusLabel.text=Radius:
|
||||||
@ -52,9 +51,7 @@ CreateTerrainVisualPanel2.imageFileChooser.approveButtonToolTipText=Use this hei
|
|||||||
CreateTerrainVisualPanel2.imageFileChooser.dialogTitle=Load a heightmap image
|
CreateTerrainVisualPanel2.imageFileChooser.dialogTitle=Load a heightmap image
|
||||||
TerrainEditorTopComponent.heightLabel.text=Height/Weight:
|
TerrainEditorTopComponent.heightLabel.text=Height/Weight:
|
||||||
TerrainEditorTopComponent.raiseTerrainButton.actionCommand=Raise
|
TerrainEditorTopComponent.raiseTerrainButton.actionCommand=Raise
|
||||||
TerrainEditorTopComponent.raiseTerrainButton.toolTipText=Raise terrain
|
TerrainEditorTopComponent.raiseTerrainButton.toolTipText=Raise terrain. RMB to lower
|
||||||
TerrainEditorTopComponent.lowerTerrainButton.toolTipText=Lower terrain
|
|
||||||
TerrainEditorTopComponent.lowerTerrainButton.actionCommand=Lower
|
|
||||||
TerrainEditorTopComponent.smoothTerrainButton.toolTipText=Smooth terrain
|
TerrainEditorTopComponent.smoothTerrainButton.toolTipText=Smooth terrain
|
||||||
TerrainEditorTopComponent.smoothTerrainButton.actionCommand=Smooth
|
TerrainEditorTopComponent.smoothTerrainButton.actionCommand=Smooth
|
||||||
TerrainEditorTopComponent.roughTerrainButton.toolTipText=Rough terrain (not implemented)
|
TerrainEditorTopComponent.roughTerrainButton.toolTipText=Rough terrain (not implemented)
|
||||||
|
@ -314,28 +314,6 @@
|
|||||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="raiseTerrainButtonActionPerformed"/>
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="raiseTerrainButtonActionPerformed"/>
|
||||||
</Events>
|
</Events>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JToggleButton" name="lowerTerrainButton">
|
|
||||||
<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-down.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.lowerTerrainButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
|
||||||
</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.lowerTerrainButton.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
|
||||||
</Property>
|
|
||||||
<Property name="actionCommand" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
|
||||||
<ResourceString bundle="com/jme3/gde/terraineditor/Bundle.properties" key="TerrainEditorTopComponent.lowerTerrainButton.actionCommand" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
|
||||||
</Property>
|
|
||||||
</Properties>
|
|
||||||
<Events>
|
|
||||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="lowerTerrainButtonActionPerformed"/>
|
|
||||||
</Events>
|
|
||||||
</Component>
|
|
||||||
<Component class="javax.swing.JToggleButton" name="smoothTerrainButton">
|
<Component class="javax.swing.JToggleButton" name="smoothTerrainButton">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor">
|
<Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor">
|
||||||
|
@ -244,7 +244,6 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
|
|||||||
createTerrainButton = new javax.swing.JButton();
|
createTerrainButton = new javax.swing.JButton();
|
||||||
jSeparator1 = new javax.swing.JToolBar.Separator();
|
jSeparator1 = new javax.swing.JToolBar.Separator();
|
||||||
raiseTerrainButton = new javax.swing.JToggleButton();
|
raiseTerrainButton = new javax.swing.JToggleButton();
|
||||||
lowerTerrainButton = new javax.swing.JToggleButton();
|
|
||||||
smoothTerrainButton = new javax.swing.JToggleButton();
|
smoothTerrainButton = new javax.swing.JToggleButton();
|
||||||
roughTerrainButton = new javax.swing.JToggleButton();
|
roughTerrainButton = new javax.swing.JToggleButton();
|
||||||
levelTerrainButton = new javax.swing.JToggleButton();
|
levelTerrainButton = new javax.swing.JToggleButton();
|
||||||
@ -422,18 +421,6 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
|
|||||||
});
|
});
|
||||||
jToolBar1.add(raiseTerrainButton);
|
jToolBar1.add(raiseTerrainButton);
|
||||||
|
|
||||||
terrainModButtonGroup.add(lowerTerrainButton);
|
|
||||||
lowerTerrainButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/jme3/gde/terraineditor/icon_terrain-down.png"))); // NOI18N
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(lowerTerrainButton, org.openide.util.NbBundle.getMessage(TerrainEditorTopComponent.class, "TerrainEditorTopComponent.lowerTerrainButton.text")); // NOI18N
|
|
||||||
lowerTerrainButton.setToolTipText(org.openide.util.NbBundle.getMessage(TerrainEditorTopComponent.class, "TerrainEditorTopComponent.lowerTerrainButton.toolTipText")); // NOI18N
|
|
||||||
lowerTerrainButton.setActionCommand(org.openide.util.NbBundle.getMessage(TerrainEditorTopComponent.class, "TerrainEditorTopComponent.lowerTerrainButton.actionCommand")); // NOI18N
|
|
||||||
lowerTerrainButton.addActionListener(new java.awt.event.ActionListener() {
|
|
||||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
|
||||||
lowerTerrainButtonActionPerformed(evt);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
jToolBar1.add(lowerTerrainButton);
|
|
||||||
|
|
||||||
terrainModButtonGroup.add(smoothTerrainButton);
|
terrainModButtonGroup.add(smoothTerrainButton);
|
||||||
smoothTerrainButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/jme3/gde/terraineditor/icon_terrain-smooth.png"))); // NOI18N
|
smoothTerrainButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/jme3/gde/terraineditor/icon_terrain-smooth.png"))); // NOI18N
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(smoothTerrainButton, org.openide.util.NbBundle.getMessage(TerrainEditorTopComponent.class, "TerrainEditorTopComponent.smoothTerrainButton.text")); // NOI18N
|
org.openide.awt.Mnemonics.setLocalizedText(smoothTerrainButton, org.openide.util.NbBundle.getMessage(TerrainEditorTopComponent.class, "TerrainEditorTopComponent.smoothTerrainButton.text")); // NOI18N
|
||||||
@ -729,17 +716,6 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
|
|||||||
}
|
}
|
||||||
}//GEN-LAST:event_raiseTerrainButtonActionPerformed
|
}//GEN-LAST:event_raiseTerrainButtonActionPerformed
|
||||||
|
|
||||||
private void lowerTerrainButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_lowerTerrainButtonActionPerformed
|
|
||||||
if (lowerTerrainButton.isSelected()) {
|
|
||||||
LowerTerrainTool tool = new LowerTerrainTool();
|
|
||||||
toolController.setTerrainEditButtonState(tool);
|
|
||||||
setHintText(tool);
|
|
||||||
} else {
|
|
||||||
toolController.setTerrainEditButtonState(null);
|
|
||||||
setHintText((TerrainTool) null);
|
|
||||||
}
|
|
||||||
}//GEN-LAST:event_lowerTerrainButtonActionPerformed
|
|
||||||
|
|
||||||
private void addTextureButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addTextureButtonActionPerformed
|
private void addTextureButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addTextureButtonActionPerformed
|
||||||
if (editorController == null || editorController.getTerrain(null) == null) {
|
if (editorController == null || editorController.getTerrain(null) == null) {
|
||||||
return;
|
return;
|
||||||
@ -949,7 +925,6 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
|
|||||||
private javax.swing.JPanel levelBrushPanel;
|
private javax.swing.JPanel levelBrushPanel;
|
||||||
private javax.swing.JCheckBox levelPrecisionCheckbox;
|
private javax.swing.JCheckBox levelPrecisionCheckbox;
|
||||||
private javax.swing.JToggleButton levelTerrainButton;
|
private javax.swing.JToggleButton levelTerrainButton;
|
||||||
private javax.swing.JToggleButton lowerTerrainButton;
|
|
||||||
private javax.swing.JTextField octavesField;
|
private javax.swing.JTextField octavesField;
|
||||||
private javax.swing.JPanel paintingPanel;
|
private javax.swing.JPanel paintingPanel;
|
||||||
private javax.swing.JLabel radiusLabel;
|
private javax.swing.JLabel radiusLabel;
|
||||||
|
@ -33,10 +33,18 @@ package com.jme3.gde.terraineditor.tools;
|
|||||||
|
|
||||||
import com.jme3.asset.AssetManager;
|
import com.jme3.asset.AssetManager;
|
||||||
import com.jme3.gde.core.sceneexplorer.nodes.AbstractSceneExplorerNode;
|
import com.jme3.gde.core.sceneexplorer.nodes.AbstractSceneExplorerNode;
|
||||||
|
import com.jme3.gde.core.undoredo.AbstractUndoableSceneEdit;
|
||||||
|
import com.jme3.gde.core.undoredo.SceneUndoRedoManager;
|
||||||
import com.jme3.math.ColorRGBA;
|
import com.jme3.math.ColorRGBA;
|
||||||
import com.jme3.math.Vector3f;
|
import com.jme3.math.Vector3f;
|
||||||
import com.jme3.scene.Node;
|
import com.jme3.scene.Node;
|
||||||
|
import com.jme3.terrain.Terrain;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import javax.swing.undo.CannotRedoException;
|
||||||
|
import javax.swing.undo.CannotUndoException;
|
||||||
import org.openide.loaders.DataObject;
|
import org.openide.loaders.DataObject;
|
||||||
|
import org.openide.util.Lookup;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Raise the terrain
|
* Raise the terrain
|
||||||
@ -45,20 +53,54 @@ import org.openide.loaders.DataObject;
|
|||||||
*/
|
*/
|
||||||
public class RaiseTerrainTool extends TerrainTool {
|
public class RaiseTerrainTool extends TerrainTool {
|
||||||
|
|
||||||
|
private boolean modifying = false; // to check when undo actions need to be set
|
||||||
|
List<RaiseTerrainToolAction> actions = new ArrayList<RaiseTerrainToolAction>();
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void actionPrimary(Vector3f point, int textureIndex, AbstractSceneExplorerNode rootNode, DataObject dataObject) {
|
public void actionPrimary(Vector3f point, int textureIndex, AbstractSceneExplorerNode rootNode, DataObject dataObject) {
|
||||||
if (radius == 0 || weight == 0)
|
setPrimary(true);
|
||||||
return;
|
action(point, textureIndex, rootNode, dataObject);
|
||||||
RaiseTerrainToolAction action = new RaiseTerrainToolAction(point, radius, weight, getMesh());
|
|
||||||
action.doActionPerformed(rootNode, dataObject);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void actionSecondary(Vector3f point, int textureIndex, AbstractSceneExplorerNode rootNode, DataObject dataObject) {
|
public void actionSecondary(Vector3f point, int textureIndex, AbstractSceneExplorerNode rootNode, DataObject dataObject) {
|
||||||
// no secondary option
|
setPrimary(false);
|
||||||
|
action(point, textureIndex, rootNode, dataObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void action(Vector3f point, int textureIndex, AbstractSceneExplorerNode rootNode, DataObject dataObject) {
|
||||||
|
if (radius == 0 || weight == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!modifying)
|
||||||
|
modifying = true;
|
||||||
|
|
||||||
|
RaiseTerrainToolAction action;
|
||||||
|
if (isPrimary())
|
||||||
|
action = new RaiseTerrainToolAction(point, radius, weight, getMesh());
|
||||||
|
else
|
||||||
|
action = new RaiseTerrainToolAction(point, radius, -weight, getMesh());
|
||||||
|
|
||||||
|
action.doActionPerformed(rootNode, dataObject, false);
|
||||||
|
actions.add(action);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void actionEnded(AbstractSceneExplorerNode rootNode, DataObject dataObject) {
|
||||||
|
if (modifying) {
|
||||||
|
modifying = false;
|
||||||
|
|
||||||
|
if (actions.isEmpty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
// record undo action
|
||||||
|
List<RaiseTerrainToolAction> cloned = new ArrayList<RaiseTerrainToolAction>();
|
||||||
|
cloned.addAll(actions);
|
||||||
|
recordUndo(cloned, rootNode, dataObject);
|
||||||
|
actions.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addMarkerPrimary(Node parent) {
|
public void addMarkerPrimary(Node parent) {
|
||||||
@ -66,4 +108,47 @@ public class RaiseTerrainTool extends TerrainTool {
|
|||||||
markerPrimary.getMaterial().setColor("Color", ColorRGBA.Green);
|
markerPrimary.getMaterial().setColor("Color", ColorRGBA.Green);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void recordUndo(final List<RaiseTerrainToolAction> actions, final AbstractSceneExplorerNode rootNode, final DataObject dataObject) {
|
||||||
|
Lookup lookup = Lookup.getDefault() ;
|
||||||
|
SceneUndoRedoManager manager = lookup.lookup(SceneUndoRedoManager.class);
|
||||||
|
|
||||||
|
AbstractUndoableSceneEdit undoer = new AbstractUndoableSceneEdit() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void sceneUndo() throws CannotUndoException {
|
||||||
|
Terrain terrain = null;
|
||||||
|
for (int i=actions.size()-1; i>=0; i--) {
|
||||||
|
RaiseTerrainToolAction a = actions.get(i);
|
||||||
|
if (terrain == null)
|
||||||
|
terrain = a.getTerrain(rootNode.getLookup().lookup(Node.class));
|
||||||
|
a.doUndoTool(rootNode, terrain);
|
||||||
|
}
|
||||||
|
setModified(rootNode, dataObject);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void sceneRedo() throws CannotRedoException {
|
||||||
|
for (int i=0; i<actions.size(); i++) {
|
||||||
|
RaiseTerrainToolAction a = actions.get(i);
|
||||||
|
a.applyTool(rootNode);
|
||||||
|
}
|
||||||
|
setModified(rootNode, dataObject);
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
if (manager != null) // this is a temporary check, it should never be null but occasionally is
|
||||||
|
manager.addEdit(this, undoer);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setModified(final AbstractSceneExplorerNode rootNode, final DataObject dataObject) {
|
||||||
|
if (dataObject.isModified())
|
||||||
|
return;
|
||||||
|
java.awt.EventQueue.invokeLater(new Runnable() {
|
||||||
|
|
||||||
|
public void run() {
|
||||||
|
dataObject.setModified(true);
|
||||||
|
rootNode.refresh(true);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -61,6 +61,10 @@ public class RaiseTerrainToolAction extends AbstractTerrainToolAction {
|
|||||||
name = "Raise terrain";
|
name = "Raise terrain";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Object applyTool(AbstractSceneExplorerNode rootNode) {
|
||||||
|
return doApplyTool(rootNode);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Object doApplyTool(AbstractSceneExplorerNode rootNode) {
|
protected Object doApplyTool(AbstractSceneExplorerNode rootNode) {
|
||||||
Terrain terrain = getTerrain(rootNode.getLookup().lookup(Node.class));
|
Terrain terrain = getTerrain(rootNode.getLookup().lookup(Node.class));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user