|
@@ -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<Vector3f, Float> cachedMap = new HashMap<Vector3f, Float>(); // 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<Vector3f,Float> 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
|
|
|
}
|
|
|
}
|
|
|
}
|