From cf103e191dd31cf6a8f656f3af1bcea05adfade4 Mon Sep 17 00:00:00 2001 From: "bre..ns" Date: Fri, 24 Aug 2012 17:04:41 +0000 Subject: [PATCH] axis-aligned terrain tool snapping support, thanks @shirkit git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@9683 75d07b2b-3a1a-0410-a2c5-0572b91ccdca --- .../jme3/gde/terraineditor/Bundle.properties | 2 +- .../terraineditor/tools/SlopeTerrainTool.java | 7 +++ .../gde/terraineditor/tools/TerrainTool.java | 53 +++++++++++++++++-- 3 files changed, 58 insertions(+), 4 deletions(-) diff --git a/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/Bundle.properties b/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/Bundle.properties index e325845c1..89be45313 100644 --- a/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/Bundle.properties +++ b/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/Bundle.properties @@ -119,7 +119,7 @@ CreateTerrainVisualPanel2.smoothIterationsLabel.text=Rough CreateTerrainVisualPanel2.jLabel6.text=Smooth CreateTerrainVisualPanel2.jLabel7.text=Height Scale: CreateTerrainVisualPanel2.heightScale.text=1 -TerrainEditorTopComponent.toolHint.slope=Right click to set the markers position. A simple right click set the first marker, holding ctrl sets the second marker. Hold the Left button to apply the slope in the area you are hovering. +TerrainEditorTopComponent.toolHint.slope=Right click to set the markers position. A simple right click set the first marker, holding CTRL and left-clicking sets the second marker. Holding CTRL will also snap the tool to axis-aligned angles. To build the slope, press the left mouse button after you have set the points. TerrainEditorTopComponent.jLabel6.text= TerrainEditorTopComponent.levelAbsoluteHeightField.text=0 TerrainEditorTopComponent.slopeTerrainButton.toolTipText=Slope terrain diff --git a/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/SlopeTerrainTool.java b/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/SlopeTerrainTool.java index ecb3db50a..ef74aa511 100644 --- a/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/SlopeTerrainTool.java +++ b/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/SlopeTerrainTool.java @@ -47,6 +47,7 @@ import com.jme3.scene.Node; import com.jme3.scene.Spatial; import com.jme3.scene.control.BillboardControl; import com.jme3.scene.shape.Line; +import com.jme3.scene.shape.Quad; import com.jme3.scene.shape.Sphere; import org.openide.loaders.DataObject; @@ -67,6 +68,11 @@ public class SlopeTerrainTool extends TerrainTool { toolHintTextKey = "TerrainEditorTopComponent.toolHint.slope"; } + @Override + protected boolean useStraightLine() { + return true; + } + @Override public void activate(AssetManager manager, Node parent) { super.activate(manager, parent); @@ -123,6 +129,7 @@ public class SlopeTerrainTool extends TerrainTool { @Override public void keyPressed(KeyInputEvent kie) { + super.keyPressed(kie); switch (kie.getKeyCode()) { case KeyInput.KEY_LCONTROL: leftCtrl = kie.isPressed(); diff --git a/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/TerrainTool.java b/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/TerrainTool.java index eee20b0b9..cd17c9855 100644 --- a/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/TerrainTool.java +++ b/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/tools/TerrainTool.java @@ -34,6 +34,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.input.KeyInput; import com.jme3.input.event.KeyInputEvent; import com.jme3.material.Material; import com.jme3.math.ColorRGBA; @@ -62,6 +63,9 @@ public abstract class TerrainTool { protected float radius; protected float weight; protected float maxToolSize = 20; // override in sub classes + private boolean doStraightline = false; + private Vector3f startPress; + private Vector3f axis; private Meshes mesh; public static enum Meshes { @@ -91,10 +95,25 @@ public abstract class TerrainTool { */ public abstract void actionSecondary(Vector3f point, int textureIndex, AbstractSceneExplorerNode rootNode, DataObject dataObject); + /** + * Signals that this tool will or will not snap to fixed axis angles + */ + protected boolean useStraightLine() { + return false; + } + /** * Key was pressed. */ - public void keyPressed(KeyInputEvent kie) {} + public void keyPressed(KeyInputEvent kie) { + if (useStraightLine() && (kie.getKeyCode() == KeyInput.KEY_LCONTROL || kie.getKeyCode() == KeyInput.KEY_RCONTROL)) { + doStraightline = kie.isPressed(); + if (!doStraightline) { // Clean the values + startPress = null; + axis = null; + } + } + } /** * Location of the primary editor marker @@ -111,8 +130,36 @@ public abstract class TerrainTool { * @param newLoc */ public void markerMoved(Vector3f newLoc) { - if (markerPrimary != null) - markerPrimary.setLocalTranslation(newLoc); + if (markerPrimary != null) { + if (!useStraightLine() || (!doStraightline && useStraightLine())) + markerPrimary.setLocalTranslation(newLoc); // if we're not using the straight line feature or the key isn't pressed + else { + if (startPress == null) + startPress = newLoc.clone(); // the user just started presseing + else { + Vector3f sub = newLoc.subtract(startPress); + if (axis == null) { + // grab the axis that the user is moving + Vector3f closest = Vector3f.UNIT_X; + float dist = sub.distance(closest); + float ddist; + if ((ddist = sub.distance(Vector3f.UNIT_Z)) < dist) { + closest = Vector3f.UNIT_Z; + dist = ddist; + } + if ((ddist = sub.distance(Vector3f.UNIT_Z.negate())) < dist) { + closest = Vector3f.UNIT_Z; + dist = ddist; + } + if (sub.distance(Vector3f.UNIT_X.negate()) < dist) { + closest = Vector3f.UNIT_X; + } + axis = closest; + } + markerPrimary.setLocalTranslation(sub.mult(axis).add(startPress)); // move the marker in straight line + } + } + } } /**