From d723af50095182f111e267fc21145dd26ec46541 Mon Sep 17 00:00:00 2001 From: "bre..om" Date: Fri, 1 Nov 2013 00:03:13 +0000 Subject: [PATCH] SDK's camera now focuses on the cursor, no more unresponsive zooming. Also fixed an issue with terrain editor's save cookies not resetting. Happy Halloween git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@10860 75d07b2b-3a1a-0410-a2c5-0572b91ccdca --- .../controller/AbstractCameraController.java | 11 +++-- .../scene/controller/SceneToolController.java | 8 +++ .../sceneexplorer/nodes/JmeTerrainQuad.java | 3 ++ .../SceneComposerTopComponent.java | 5 +- .../gde/scenecomposer/tools/SelectTool.java | 2 +- .../TerrainCameraController.java | 10 +++- .../TerrainEditorController.java | 49 +++++++++++++------ .../TerrainEditorTopComponent.java | 39 ++++++++++----- .../terraineditor/TerrainToolController.java | 1 + .../terraineditor/tools/PaintTerrainTool.java | 8 ++- 10 files changed, 99 insertions(+), 37 deletions(-) diff --git a/sdk/jme3-core/src/com/jme3/gde/core/scene/controller/AbstractCameraController.java b/sdk/jme3-core/src/com/jme3/gde/core/scene/controller/AbstractCameraController.java index 8f56bcaa5..4fbeef3a1 100644 --- a/sdk/jme3-core/src/com/jme3/gde/core/scene/controller/AbstractCameraController.java +++ b/sdk/jme3-core/src/com/jme3/gde/core/scene/controller/AbstractCameraController.java @@ -149,11 +149,11 @@ public abstract class AbstractCameraController extends AbstractAppState implemen }); } - public void setCamFocus(final Vector3f focus) { + public void setCamFocus(final Vector3f focus, final boolean moveCamera) { SceneApplication.getApplication().enqueue(new Callable() { public Object call() throws Exception { - doSetCamFocus(focus); + doSetCamFocus(focus, moveCamera); return null; } }); @@ -161,7 +161,12 @@ public abstract class AbstractCameraController extends AbstractAppState implemen } public void doSetCamFocus(Vector3f focus) { - cam.setLocation(cam.getLocation().add(focus.subtract(this.focus))); + doSetCamFocus(focus, false); + } + + public void doSetCamFocus(Vector3f focus, boolean moveCamera) { + if (moveCamera) + cam.setLocation(cam.getLocation().add(focus.subtract(this.focus))); this.focus.set(focus); } diff --git a/sdk/jme3-core/src/com/jme3/gde/core/scene/controller/SceneToolController.java b/sdk/jme3-core/src/com/jme3/gde/core/scene/controller/SceneToolController.java index bba62a46c..8dc190f77 100644 --- a/sdk/jme3-core/src/com/jme3/gde/core/scene/controller/SceneToolController.java +++ b/sdk/jme3-core/src/com/jme3/gde/core/scene/controller/SceneToolController.java @@ -27,6 +27,7 @@ import com.jme3.scene.Geometry; import com.jme3.scene.Mesh; import com.jme3.scene.Node; import com.jme3.scene.Spatial; +import com.jme3.scene.control.CameraControl; import com.jme3.scene.debug.Arrow; import com.jme3.scene.debug.Grid; import com.jme3.scene.debug.WireBox; @@ -48,6 +49,7 @@ public class SceneToolController implements AppState { protected Spatial selectionShape; protected AssetManager manager; protected Material blueMat; + protected AbstractCameraController camController; public SceneToolController(AssetManager manager) { this.toolsNode = new Node("ToolsNode"); @@ -62,6 +64,10 @@ public class SceneToolController implements AppState { SceneApplication.getApplication().getStateManager().attach(this); } + public void setCamController(AbstractCameraController camController) { + this.camController = camController; + } + protected void initTools() { blueMat = createBlueMat(); @@ -167,6 +173,8 @@ public class SceneToolController implements AppState { public void doSetCursorLocation(Vector3f location) { cursor.setLocalTranslation(location); + if (camController != null) + camController.doSetCamFocus(location); } public void snapCursorToSelection() { diff --git a/sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/JmeTerrainQuad.java b/sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/JmeTerrainQuad.java index c5066f41e..f3c8492f1 100644 --- a/sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/JmeTerrainQuad.java +++ b/sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/JmeTerrainQuad.java @@ -34,7 +34,10 @@ package com.jme3.gde.core.sceneexplorer.nodes; import com.jme3.gde.core.icons.IconList; import com.jme3.terrain.geomipmap.TerrainQuad; import java.awt.Image; +import java.io.IOException; +import org.openide.cookies.SaveCookie; import org.openide.loaders.DataObject; +import org.openide.nodes.Node; import org.openide.nodes.Sheet; /** diff --git a/sdk/jme3-scenecomposer/src/com/jme3/gde/scenecomposer/SceneComposerTopComponent.java b/sdk/jme3-scenecomposer/src/com/jme3/gde/scenecomposer/SceneComposerTopComponent.java index 50fcc2d23..28b38b629 100644 --- a/sdk/jme3-scenecomposer/src/com/jme3/gde/scenecomposer/SceneComposerTopComponent.java +++ b/sdk/jme3-scenecomposer/src/com/jme3/gde/scenecomposer/SceneComposerTopComponent.java @@ -571,7 +571,7 @@ public final class SceneComposerTopComponent extends TopComponent implements Sce }//GEN-LAST:event_resetCursorButtonActionPerformed private void camToCursorSelectionButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_camToCursorSelectionButtonActionPerformed - camController.setCamFocus(toolController.getCursorLocation()); + camController.setCamFocus(toolController.getCursorLocation(), true); }//GEN-LAST:event_camToCursorSelectionButtonActionPerformed private void cursorToSelectionButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cursorToSelectionButtonActionPerformed @@ -1017,7 +1017,8 @@ private void jToggleSelectGeomActionPerformed(java.awt.event.ActionEvent evt) {/ editorController.setToolController(toolController); toolController.refreshNonSpatialMarkers(); - + toolController.setCamController(camController); + editorController.setTerrainLodCamera(); final SpatialAssetDataObject dobj = ((SpatialAssetDataObject) currentRequest.getDataObject()); listener = new ProjectAssetManager.ClassPathChangeListener() { diff --git a/sdk/jme3-scenecomposer/src/com/jme3/gde/scenecomposer/tools/SelectTool.java b/sdk/jme3-scenecomposer/src/com/jme3/gde/scenecomposer/tools/SelectTool.java index 68df25a99..0e67666fb 100644 --- a/sdk/jme3-scenecomposer/src/com/jme3/gde/scenecomposer/tools/SelectTool.java +++ b/sdk/jme3-scenecomposer/src/com/jme3/gde/scenecomposer/tools/SelectTool.java @@ -421,7 +421,7 @@ public class SelectTool extends SceneEditTool { if (toolController.isSnapToGrid()) { result.set(Math.round(result.x), result.y, Math.round(result.z)); } - toolController.doSetCursorLocation(result); + toolController.setCursorLocation(result); } } } diff --git a/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/TerrainCameraController.java b/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/TerrainCameraController.java index e4deb552c..416b502d2 100644 --- a/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/TerrainCameraController.java +++ b/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/TerrainCameraController.java @@ -44,6 +44,7 @@ import com.jme3.math.Vector2f; import com.jme3.math.Vector3f; import com.jme3.renderer.Camera; + /** * Runs in the JME thread, not awt thread. * Listens to mouse/camera input and relays the movements @@ -124,14 +125,19 @@ public class TerrainCameraController extends AbstractCameraController { if (button == 0) { if (isTerrainEditButtonEnabled() && !forceCameraControls) { toolController.setPrimary(pressed); - System.out.println("primary "+pressed); + //System.out.println("primary "+pressed); + } else if (!isTerrainEditButtonEnabled() && !forceCameraControls) { + if (!pressed) { + Vector3f pick = getTerrainCollisionPoint(); + toolController.setCursorLocation(pick); + } } } if (button == 1) { if (isTerrainEditButtonEnabled() && !forceCameraControls) { toolController.setAlternate(pressed); - System.out.println("alternate "+pressed); + //System.out.println("alternate "+pressed); } } } diff --git a/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/TerrainEditorController.java b/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/TerrainEditorController.java index 5463210ef..9d3450ed7 100644 --- a/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/TerrainEditorController.java +++ b/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/TerrainEditorController.java @@ -79,6 +79,7 @@ import org.openide.nodes.NodeMemberEvent; import org.openide.nodes.NodeReorderEvent; import org.openide.util.Exceptions; import org.openide.util.Lookup; +import org.openide.util.lookup.InstanceContent; /** * Modifies the actual terrain in the scene. @@ -101,42 +102,48 @@ public class TerrainEditorController implements NodeListener { protected final int MAX_DIFFUSE = 12; protected final int MAX_TEXTURES = 16-NUM_ALPHA_TEXTURES; // 16 max (diffuse and normal), minus the ones we are reserving + private boolean alphaLayersChanged = false; + //private InstanceContent content; class TerrainSaveCookie implements SaveCookie { JmeSpatial rootNode; public void save() throws IOException { - SceneApplication.getApplication().enqueue(new Callable() { + if (alphaLayersChanged) { + SceneApplication.getApplication().enqueue(new Callable() { - public Object call() throws Exception { - currentFileObject.saveAsset(); - //TerrainSaveCookie sc = currentFileObject.getCookie(TerrainSaveCookie.class); - //if (sc != null) { - //Node root = rootNode.getLookup().lookup(Node.class); - doSaveAlphaImages(); - //} - return null; - } - }); + public Object call() throws Exception { + //currentFileObject.saveAsset(); + //TerrainSaveCookie sc = currentFileObject.getCookie(TerrainSaveCookie.class); + //if (sc != null) { + //Node root = rootNode.getLookup().lookup(Node.class); + doSaveAlphaImages(); + //content.remove(TerrainSaveCookie.this); + //} + return null; + } + }); + alphaLayersChanged = false; + } } } private TerrainSaveCookie terrainSaveCookie = new TerrainSaveCookie(); - public TerrainEditorController(JmeSpatial jmeRootNode, AssetDataObject currentFileObject, TerrainEditorTopComponent topComponent) { + public TerrainEditorController(JmeSpatial jmeRootNode, + AssetDataObject currentFileObject, + TerrainEditorTopComponent topComponent) + { this.jmeRootNode = jmeRootNode; rootNode = this.jmeRootNode.getLookup().lookup(Node.class); this.currentFileObject = currentFileObject; + //this.content = content; terrainSaveCookie.rootNode = jmeRootNode; this.currentFileObject.setSaveCookie(terrainSaveCookie); this.topComponent = topComponent; this.jmeRootNode.addNodeListener(this); } - public void setToolController(TerrainToolController toolController) { - - } - public FileObject getCurrentFileObject() { return currentFileObject.getPrimaryFile(); } @@ -218,6 +225,15 @@ public class TerrainEditorController implements NodeListener { return null; } + + /** + * Painting happened and the alpha maps need saving. + */ + public void alphaLayersChanged() { + //if (!alphaLayersChanged) + // content.add(terrainSaveCookie); + alphaLayersChanged = true; + } /** * Perform the actual height modification on the terrain. @@ -583,6 +599,7 @@ public class TerrainEditorController implements NodeListener { image.getData(0).rewind(); tex.getImage().setUpdateNeeded(); setNeedsSave(true); + alphaLayersChanged(); } /** diff --git a/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/TerrainEditorTopComponent.java b/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/TerrainEditorTopComponent.java index d918f0764..8a822b27c 100644 --- a/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/TerrainEditorTopComponent.java +++ b/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/TerrainEditorTopComponent.java @@ -66,6 +66,7 @@ import java.text.NumberFormat; import java.util.Collection; import java.util.HashMap; import java.util.Map; +import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.*; import javax.swing.event.ListSelectionEvent; @@ -91,6 +92,8 @@ import org.openide.nodes.NodeMemberEvent; import org.openide.nodes.NodeReorderEvent; import org.openide.util.Lookup.Result; import org.openide.util.*; +import org.openide.util.lookup.AbstractLookup; +import org.openide.util.lookup.InstanceContent; import org.openide.windows.TopComponent; import org.openide.windows.WindowManager; @@ -121,12 +124,23 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce private DDSPreview ddsPreview; private Map buttons = new HashMap(); private JPanel insideToolSettings; + + //private InstanceContent content; public TerrainEditorTopComponent() { initComponents(); setName(NbBundle.getMessage(TerrainEditorTopComponent.class, "CTL_TerrainEditorTopComponent")); setToolTipText(NbBundle.getMessage(TerrainEditorTopComponent.class, "HINT_TerrainEditorTopComponent")); - associateLookup(ExplorerUtils.createLookup(new ExplorerManager(), getActionMap())); + //content = new InstanceContent(); + + /*ActionMap actionMap = getActionMap(); + for (Object key : actionMap.allKeys() ) { + System.out.println("key: "+key+ actionMap.get(key)); + Action value = actionMap.get(key); + }*/ + //actionMap.put(, terrainWizard); + Lookup lookup = ExplorerUtils.createLookup(new ExplorerManager(), getActionMap()); + associateLookup(lookup); setIcon(ImageUtilities.loadImage(ICON_PATH, true)); result = Utilities.actionsGlobalContext().lookupResult(JmeSpatial.class); } @@ -745,7 +759,7 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce private void paintButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_paintButtonActionPerformed if (paintButton.isSelected()) { - PaintTerrainTool tool = new PaintTerrainTool(); + PaintTerrainTool tool = new PaintTerrainTool(editorController); toolController.setTerrainEditButtonState(tool); setHintText(tool); } else { @@ -802,7 +816,8 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce Float f = new Float(shininessField.getText()); editorController.setShininess(Math.max(0, f)); } catch (Exception e) { - return; + Logger.getLogger(TerrainEditorTopComponent.class.getName()).log(Level.WARNING, + "Error accessing shininess field in terrain material.", e); } }//GEN-LAST:event_shininessFieldActionPerformed @@ -1283,12 +1298,17 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce //SceneUndoRedoManager m = Lookup.getDefault().lookup(SceneUndoRedoManager.class);//TODO remove this line - Logger.getLogger(TerrainEditorTopComponent.class.getName()).finer("Terrain openScene " + file.getName()); + Logger.getLogger(TerrainEditorTopComponent.class.getName()).log(Level.FINER, "Terrain openScene {0}", file.getName()); if (editorController != null) { editorController.cleanup(); } + + //this.associateLookup( new AbstractLookup(content) ); // for saving alpha images + editorController = new TerrainEditorController(jmeNode, file, this); + + this.sentRequest = request; request.setWindowTitle("TerrainEditor - " + manager.getRelativeAssetPath(file.getPrimaryFile().getPath())); request.setToolNode(new Node("TerrainEditorToolNode")); @@ -1339,14 +1359,13 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce toolController.setEditorController(editorController); toolController.setCameraController(camController); toolController.setTopComponent(this); - editorController.setToolController(toolController); toolController.setHeightToolRadius((float) radiusSlider.getValue() / (float) radiusSlider.getMaximum()); toolController.setHeightToolHeight((float) heightSlider.getValue() / (float) heightSlider.getMaximum()); //toolController.setToolMesh(meshForm.isSelected()); // future for adding brush shape editorController.setTerrainLodCamera(); - + reinitTextureTable(); // update the UI if (editorController.getTerrain(null) != null) { //createTerrainButton.setEnabled(false); // only let the user add one terrain @@ -1449,10 +1468,6 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce while (textureTable.getModel().getRowCount() > 0) { ((TextureTableModel) textureTable.getModel()).removeRow(0); } - - if (editorController.getTerrain(null) == null) { - return; - } } /** @@ -1513,7 +1528,7 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce Float scale = editorController.getTextureScale(i); if (scale == null) { - scale = editorController.DEFAULT_TEXTURE_SCALE; + scale = TerrainEditorController.DEFAULT_TEXTURE_SCALE; } addRow(new Object[]{"", i, i, scale}); } @@ -1540,7 +1555,7 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce } protected void addNewTexture(int newIndex) { - float scale = editorController.DEFAULT_TEXTURE_SCALE; + float scale = TerrainEditorController.DEFAULT_TEXTURE_SCALE; // add it to the table model addRow(new Object[]{"", newIndex, null, scale}); // add to the table model diff --git a/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/TerrainToolController.java b/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/TerrainToolController.java index 531bd2fc6..e89175b76 100644 --- a/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/TerrainToolController.java +++ b/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/TerrainToolController.java @@ -80,6 +80,7 @@ public class TerrainToolController extends SceneToolController { public void setCameraController(TerrainCameraController cameraController) { this.cameraController = cameraController; + super.setCamController(cameraController); } public void setTopComponent(TerrainEditorTopComponent topComponent) { diff --git a/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/PaintTerrainTool.java b/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/PaintTerrainTool.java index 444148017..c87280a8e 100644 --- a/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/PaintTerrainTool.java +++ b/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/PaintTerrainTool.java @@ -32,9 +32,9 @@ package com.jme3.gde.terraineditor.tools; import com.jme3.gde.core.sceneexplorer.nodes.AbstractSceneExplorerNode; -import com.jme3.gde.core.sceneexplorer.nodes.actions.AbstractStatefulGLToolAction; import com.jme3.gde.core.undoredo.AbstractUndoableSceneEdit; import com.jme3.gde.core.undoredo.SceneUndoRedoManager; +import com.jme3.gde.terraineditor.TerrainEditorController; import com.jme3.math.ColorRGBA; import com.jme3.math.Vector3f; import com.jme3.scene.Node; @@ -55,7 +55,11 @@ public class PaintTerrainTool extends TerrainTool { private boolean painting = false; // to check when undo actions need to be set List actions = new ArrayList(); + TerrainEditorController controller; // used to we can flag when alpha maps changed + public PaintTerrainTool(TerrainEditorController controller) { + this.controller = controller; + } @Override public void actionPrimary(Vector3f point, int textureIndex, AbstractSceneExplorerNode rootNode, DataObject dataObject) { @@ -83,6 +87,7 @@ public class PaintTerrainTool extends TerrainTool { action = new PaintTerrainToolAction(point, radius, -weight, textureIndex); action.doActionPerformed(rootNode, dataObject, false); actions.add(action); + setModified(rootNode, dataObject); } @Override @@ -149,6 +154,7 @@ public class PaintTerrainTool extends TerrainTool { } protected void setModified(final AbstractSceneExplorerNode rootNode, final DataObject dataObject) { + controller.alphaLayersChanged(); if (dataObject.isModified()) return; java.awt.EventQueue.invokeLater(new Runnable() {