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 cd17c9855..e4da78020 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 @@ -46,6 +46,8 @@ import com.jme3.scene.VertexBuffer; import com.jme3.scene.shape.Box; import com.jme3.scene.shape.Sphere; import com.jme3.util.IntMap.Entry; +import java.util.HashMap; +import java.util.Map; import org.openide.loaders.DataObject; /** @@ -53,10 +55,21 @@ import org.openide.loaders.DataObject; * It has a primary and secondary action, activated from left and right mouse button respectively. * It will also attach tool geometries to the scene so the user can see where they are editing. * - * @author Brent Owens + * @author Brent Owens, Shirkit */ public abstract class TerrainTool { + private static final Vector3f[] axisVectors = { + Vector3f.UNIT_X, + Vector3f.UNIT_Z, + Vector3f.UNIT_X.negate(), + Vector3f.UNIT_Z.negate(), + Vector3f.UNIT_X.add(Vector3f.UNIT_Z).normalize(), + Vector3f.UNIT_X.add(Vector3f.UNIT_Z.negate()).normalize(), + Vector3f.UNIT_X.negate().addLocal(Vector3f.UNIT_Z.negate()).normalize(), + Vector3f.UNIT_X.negate().addLocal(Vector3f.UNIT_Z).normalize() + }; + protected AssetManager manager; protected Geometry markerPrimary; protected Geometry markerSecondary; @@ -67,6 +80,7 @@ public abstract class TerrainTool { private Vector3f startPress; private Vector3f axis; private Meshes mesh; + private final Map cachedMap = new HashMap(); // caching only public static enum Meshes { Box, Sphere @@ -75,6 +89,11 @@ public abstract class TerrainTool { // the key to load the tool hint text from the resource bundle protected String toolHintTextKey = "TerrainEditorTopComponent.toolHint.default"; + public TerrainTool() { + for (Vector3f v : axisVectors) + cachedMap.put(v, Float.MAX_VALUE); + } + /** * The tool was selected, start showing the marker. * @param manager @@ -138,25 +157,23 @@ public abstract class TerrainTool { startPress = newLoc.clone(); // the user just started presseing else { Vector3f sub = newLoc.subtract(startPress); - if (axis == null) { + if (axis == null && newLoc.distance(startPress) > 3f) { // 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; + for (Vector3f v : cachedMap.keySet()) { + cachedMap.put(v, sub.distance(v)); } - if (sub.distance(Vector3f.UNIT_X.negate()) < dist) { - closest = Vector3f.UNIT_X; + Vector3f closest = null; + float dist = Float.MAX_VALUE; + for (Map.Entry entry : cachedMap.entrySet()) { + if (entry.getValue() < dist) { + dist = entry.getValue(); + closest = entry.getKey(); + } } - axis = closest; + axis = closest.clone(); } - markerPrimary.setLocalTranslation(sub.mult(axis).add(startPress)); // move the marker in straight line + if (axis != null) + markerPrimary.setLocalTranslation(startPress.add(sub.project(axis))); // move the marker in straight line } } }