|
@@ -33,10 +33,18 @@ package com.jme3.gde.terraineditor.tools;
|
|
|
|
|
|
import com.jme3.asset.AssetManager;
|
|
|
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.Vector3f;
|
|
|
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.util.Lookup;
|
|
|
|
|
|
/**
|
|
|
* Raise the terrain
|
|
@@ -45,20 +53,54 @@ import org.openide.loaders.DataObject;
|
|
|
*/
|
|
|
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
|
|
|
public void actionPrimary(Vector3f point, int textureIndex, AbstractSceneExplorerNode rootNode, DataObject dataObject) {
|
|
|
- if (radius == 0 || weight == 0)
|
|
|
- return;
|
|
|
- RaiseTerrainToolAction action = new RaiseTerrainToolAction(point, radius, weight, getMesh());
|
|
|
- action.doActionPerformed(rootNode, dataObject);
|
|
|
+ setPrimary(true);
|
|
|
+ action(point, textureIndex, rootNode, dataObject);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
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
|
|
|
public void addMarkerPrimary(Node parent) {
|
|
@@ -66,4 +108,47 @@ public class RaiseTerrainTool extends TerrainTool {
|
|
|
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);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
}
|