Terrain tools can snap to 4 axis angles now. Paths thanks @Shirkit
git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@9846 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
This commit is contained in:
parent
bc544adb40
commit
c23685b298
@ -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;
|
||||
for (Vector3f v : cachedMap.keySet()) {
|
||||
cachedMap.put(v, sub.distance(v));
|
||||
}
|
||||
if ((ddist = sub.distance(Vector3f.UNIT_Z.negate())) < dist) {
|
||||
closest = Vector3f.UNIT_Z;
|
||||
dist = ddist;
|
||||
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();
|
||||
}
|
||||
if (sub.distance(Vector3f.UNIT_X.negate()) < dist) {
|
||||
closest = Vector3f.UNIT_X;
|
||||
}
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user