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