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 b3ba5493b..18550f9a3 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 @@ -44,26 +44,23 @@ import org.openide.util.Lookup; public class SelectTool extends SceneEditTool { protected Spatial selected; - - private enum State {translate, rotate, scale}; + + private enum State { + + translate, rotate, scale + }; private State currentState = null; - - private Vector3f currentAxis = Vector3f.UNIT_XYZ; - private StringBuilder numberBuilder = new StringBuilder(); // gets appended with numbers - private Quaternion startRot; private Vector3f startTrans; private Vector3f startScale; - private boolean wasDraggingL = false; private boolean wasDraggingR = false; private boolean wasDownR = false; private boolean ctrlDown = false; private boolean shiftDown = false; private boolean altDown = false; - private MoveManager.MoveUndo moving; private ScaleUndo scaling; private RotateUndo rotating; @@ -90,12 +87,12 @@ public class SelectTool extends SceneEditTool { */ @Override public void keyPressed(KeyInputEvent kie) { - + checkModificatorKeys(kie); // alt,shift,ctrl - - if (selected == null) + + if (selected == null) { return; // only do anything if a spatial is selected - + } // key released if (kie.isReleased()) { boolean commandUsed = checkCommandKey(kie); @@ -104,59 +101,62 @@ public class SelectTool extends SceneEditTool { boolean numberChange = checkNumberKey(kie); boolean enterHit = checkEnterHit(kie); boolean escHit = checkEscHit(kie); - - if (commandUsed) + + if (commandUsed) { return; // commands take priority - + } if (stateChange) { currentAxis = Vector3f.UNIT_XYZ; numberBuilder = new StringBuilder(); recordInitialState(selected); - } - else if (axisChange) {} - else if (numberChange) {} - else if (enterHit) { + } else if (axisChange) { + } else if (numberChange) { + } else if (enterHit) { if (currentState != null && numberBuilder.length() > 0) { applyKeyedChangeState(selected); clearState(false); - } + } } - - + + // ----------------------- // reset conditions below: - + if (escHit) { - if (moving != null) + if (moving != null) { moving.sceneUndo(); - + } + moving = null; clearState(); } - + if (!stateChange && !axisChange && !numberChange && !enterHit && !escHit) { // nothing valid was hit, reset the state //clearState(); // this will be } } } - + /** * Abort any manipulations */ private void clearState() { clearState(true); } - + private void clearState(boolean resetSelected) { if (resetSelected && selected != null) { // reset the transforms - if (startRot != null) + if (startRot != null) { selected.setLocalRotation(startRot); - if (startTrans != null) + } + if (startTrans != null) { selected.setLocalTranslation(startTrans); - if (startScale != null) + } + if (startScale != null) { selected.setLocalScale(startScale); + } } currentState = null; currentAxis = Vector3f.UNIT_XYZ; @@ -167,14 +167,13 @@ public class SelectTool extends SceneEditTool { startMouseCoord = null; startSelectedCoord = null; } - - + private void recordInitialState(Spatial selected) { startRot = selected.getLocalRotation().clone(); startTrans = selected.getLocalTranslation().clone(); startScale = selected.getLocalScale().clone(); } - + /** * Applies the changes entered by a number, not by mouse. * Translate: adds the value to the current local translation @@ -185,10 +184,10 @@ public class SelectTool extends SceneEditTool { Float value = null; try { value = new Float(numberBuilder.toString()); - } catch (NumberFormatException e){ + } catch (NumberFormatException e) { return; } - + if (currentState == State.translate) { MoveManager moveManager = Lookup.getDefault().lookup(MoveManager.class); moveManager.moveAcross(currentAxis, value, toolController.isSnapToGrid()); @@ -196,14 +195,14 @@ public class SelectTool extends SceneEditTool { actionPerformed(moving); moving = null; } else if (currentState == State.scale) { - float x = 1, y= 1, z = 1; - if (currentAxis == Vector3f.UNIT_X) + float x = 1, y = 1, z = 1; + if (currentAxis == Vector3f.UNIT_X) { x = value; - else if (currentAxis == Vector3f.UNIT_Y) + } else if (currentAxis == Vector3f.UNIT_Y) { y = value; - else if (currentAxis == Vector3f.UNIT_Z) + } else if (currentAxis == Vector3f.UNIT_Z) { z = value; - else if (currentAxis == Vector3f.UNIT_XYZ) { + } else if (currentAxis == Vector3f.UNIT_XYZ) { x = value; y = value; z = value; @@ -213,17 +212,18 @@ public class SelectTool extends SceneEditTool { selected.setLocalScale(after); actionPerformed(new ScaleUndo(selected, before, after)); } else if (currentState == State.rotate) { - float x = 0, y= 0, z = 0; - if (currentAxis == Vector3f.UNIT_X) + float x = 0, y = 0, z = 0; + if (currentAxis == Vector3f.UNIT_X) { x = 1; - else if (currentAxis == Vector3f.UNIT_Y) + } else if (currentAxis == Vector3f.UNIT_Y) { y = 1; - else if (currentAxis == Vector3f.UNIT_Z) + } else if (currentAxis == Vector3f.UNIT_Z) { z = 1; - Vector3f axis = new Vector3f(x,y,z); + } + Vector3f axis = new Vector3f(x, y, z); Quaternion initialRot = selected.getLocalRotation().clone(); Quaternion rot = new Quaternion(); - rot = rot.fromAngleAxis(value*FastMath.DEG_TO_RAD, axis); + rot = rot.fromAngleAxis(value * FastMath.DEG_TO_RAD, axis); selected.setLocalRotation(selected.getLocalRotation().mult(rot)); RotateUndo undo = new RotateUndo(selected, initialRot, rot); actionPerformed(undo); @@ -232,18 +232,21 @@ public class SelectTool extends SceneEditTool { } clearState(false); } - + private void checkModificatorKeys(KeyInputEvent kie) { - if (kie.getKeyCode() == KeyInput.KEY_LCONTROL || kie.getKeyCode() == KeyInput.KEY_RCONTROL) + if (kie.getKeyCode() == KeyInput.KEY_LCONTROL || kie.getKeyCode() == KeyInput.KEY_RCONTROL) { ctrlDown = kie.isPressed(); - - if (kie.getKeyCode() == KeyInput.KEY_LSHIFT || kie.getKeyCode() == KeyInput.KEY_RSHIFT) + } + + if (kie.getKeyCode() == KeyInput.KEY_LSHIFT || kie.getKeyCode() == KeyInput.KEY_RSHIFT) { shiftDown = kie.isPressed(); - - if (kie.getKeyCode() == KeyInput.KEY_LMENU || kie.getKeyCode() == KeyInput.KEY_RMENU) + } + + if (kie.getKeyCode() == KeyInput.KEY_LMENU || kie.getKeyCode() == KeyInput.KEY_RMENU) { altDown = kie.isPressed(); + } } - + private boolean checkCommandKey(KeyInputEvent kie) { if (kie.getKeyCode() == KeyInput.KEY_D) { if (shiftDown) { @@ -260,13 +263,13 @@ public class SelectTool extends SceneEditTool { } return false; } - + private boolean checkStateKey(KeyInputEvent kie) { if (kie.getKeyCode() == KeyInput.KEY_G) { currentState = State.translate; MoveManager moveManager = Lookup.getDefault().lookup(MoveManager.class); moveManager.reset(); - Quaternion rot = camera.getRotation().mult(new Quaternion().fromAngleAxis(FastMath.PI,Vector3f.UNIT_Y)); + Quaternion rot = camera.getRotation().mult(new Quaternion().fromAngleAxis(FastMath.PI, Vector3f.UNIT_Y)); moveManager.initiateMove(selected, rot, false); moving = moveManager.makeUndo(); return true; @@ -279,48 +282,48 @@ public class SelectTool extends SceneEditTool { } return false; } - + private boolean checkAxisKey(KeyInputEvent kie) { if (kie.getKeyCode() == KeyInput.KEY_X) { currentAxis = Vector3f.UNIT_X; MoveManager moveManager = Lookup.getDefault().lookup(MoveManager.class); - Quaternion rot = camera.getRotation().mult(new Quaternion().fromAngleAxis(FastMath.PI,Vector3f.UNIT_Y)); - Quaternion planRot = null; - if(rot.dot(MoveManager.XY) 0) { @@ -329,8 +332,9 @@ public class SelectTool extends SceneEditTool { } else { numberBuilder.insert(0, '-'); } - } else + } else { numberBuilder.append('-'); + } return true; } else if (kie.getKeyCode() == KeyInput.KEY_0 || kie.getKeyCode() == KeyInput.KEY_NUMPAD0) { numberBuilder.append('0'); @@ -363,33 +367,34 @@ public class SelectTool extends SceneEditTool { numberBuilder.append('9'); return true; } else if (kie.getKeyCode() == KeyInput.KEY_PERIOD) { - if (numberBuilder.indexOf(".") == -1){ // if it doesn't exist yet - if (numberBuilder.length() == 0 || - (numberBuilder.length() == 1 && numberBuilder.charAt(0) == '-')) + if (numberBuilder.indexOf(".") == -1) { // if it doesn't exist yet + if (numberBuilder.length() == 0 + || (numberBuilder.length() == 1 && numberBuilder.charAt(0) == '-')) { numberBuilder.append("0."); - else + } else { numberBuilder.append("."); + } } return true; } - + return false; } - + private boolean checkEnterHit(KeyInputEvent kie) { if (kie.getKeyCode() == KeyInput.KEY_RETURN) { return true; } return false; } - + private boolean checkEscHit(KeyInputEvent kie) { if (kie.getKeyCode() == KeyInput.KEY_ESCAPE) { return true; } return false; } - + @Override public void actionPrimary(Vector2f screenCoord, boolean pressed, final JmeNode rootNode, DataObject dataObject) { if (!pressed) { @@ -419,8 +424,9 @@ public class SelectTool extends SceneEditTool { // mouse released and wasn't dragging, place cursor final Vector3f result = pickWorldLocation(getCamera(), screenCoord, rootNode); if (result != null) { - if (toolController.isSnapToGrid()) + if (toolController.isSnapToGrid()) { result.set(Math.round(result.x), result.y, Math.round(result.z)); + } toolController.doSetCursorLocation(result); } } @@ -433,7 +439,7 @@ public class SelectTool extends SceneEditTool { public void actionSecondary(final Vector2f screenCoord, boolean pressed, final JmeNode rootNode, DataObject dataObject) { if (pressed) { // mouse down - + if (moving != null) { moving.sceneUndo(); moving = null; @@ -446,25 +452,26 @@ public class SelectTool extends SceneEditTool { rotating.sceneUndo(); rotating = null; clearState(); - } - else if (!wasDraggingR && !wasDownR) { // wasn't dragging and was not down already + } else if (!wasDraggingR && !wasDownR) { // wasn't dragging and was not down already // pick on the spot Spatial s = pickWorldSpatial(camera, screenCoord, rootNode); - if (!toolController.selectTerrain() && isTerrain(s) ) { + if (!toolController.selectTerrain() && isTerrain(s)) { // only select non-terrain selected = null; return; } else { - + // climb up and find the Model Node (parent) and select that, don't select the geom Spatial linkNodeParent = findModelNodeParent(s); - if (linkNodeParent != null) + if (linkNodeParent != null) { s = linkNodeParent; - else + } else { return; + } final Spatial selec = s; selected = selec; java.awt.EventQueue.invokeLater(new Runnable() { + @Override public void run() { if (selec != null) { @@ -477,7 +484,7 @@ public class SelectTool extends SceneEditTool { } }); } - + toolController.updateSelection(selected); } wasDownR = true; @@ -487,28 +494,31 @@ public class SelectTool extends SceneEditTool { wasDraggingR = false; } } - + /** * Climb up the spatial until we find the first node parent. * TODO: use userData to determine the actual model's parent. */ private Spatial findModelNodeParent(Spatial child) { - if (child == null) + if (child == null) { return null; - - if (child instanceof Node) + } + + if (child instanceof Node) { return child; - - if (child.getParent() != null) + } + + if (child.getParent() != null) { return findModelNodeParent(child.getParent()); - + } + return null; } @Override public void mouseMoved(Vector2f screenCoord, JmeNode rootNode, DataObject currentDataObject, JmeSpatial selectedSpatial) { if (currentState != null) { - handleMouseManipulate(screenCoord, currentState, currentAxis, rootNode, currentDataObject, selectedSpatial); + handleMouseManipulate(screenCoord, currentState, currentAxis, rootNode, currentDataObject, selectedSpatial); } } @@ -521,88 +531,92 @@ public class SelectTool extends SceneEditTool { public void draggedSecondary(Vector2f screenCoord, boolean pressed, JmeNode rootNode, DataObject currentDataObject) { wasDraggingR = pressed; } - + /** * Manipulate the spatial */ - private void handleMouseManipulate( Vector2f screenCoord, - State state, - Vector3f axis, - JmeNode rootNode, - DataObject currentDataObject, - JmeSpatial selectedSpatial) - { + private void handleMouseManipulate(Vector2f screenCoord, + State state, + Vector3f axis, + JmeNode rootNode, + DataObject currentDataObject, + JmeSpatial selectedSpatial) { if (state == State.translate) { doMouseTranslate(axis, screenCoord, rootNode, selectedSpatial); - } - else if (state == State.scale) { + } else if (state == State.scale) { doMouseScale(axis, screenCoord, rootNode, selectedSpatial); - } - else if (state == State.rotate) { + } else if (state == State.rotate) { doMouseRotate(axis, screenCoord, rootNode, selectedSpatial); } - + } private void doMouseTranslate(Vector3f axis, Vector2f screenCoord, JmeNode rootNode, JmeSpatial selectedSpatial) { MoveManager moveManager = Lookup.getDefault().lookup(MoveManager.class); - if(toolController.isSnapToScene()){ + if (toolController.isSnapToScene()) { moveManager.setAlternativePickTarget(rootNode.getLookup().lookup(Node.class)); } // free form translation - moveManager.move(camera, screenCoord, axis,toolController.isSnapToGrid()); + moveManager.move(camera, screenCoord, axis, toolController.isSnapToGrid()); } - + private void doMouseScale(Vector3f axis, Vector2f screenCoord, JmeNode rootNode, JmeSpatial selectedSpatial) { // scale based on the original mouse position and original model-to-screen position // and compare that to the distance from the new mouse position and the original distance - if (startMouseCoord == null) + if (startMouseCoord == null) { startMouseCoord = screenCoord.clone(); + } if (startSelectedCoord == null) { Vector3f screen = getCamera().getScreenCoordinates(selected.getWorldTranslation()); startSelectedCoord = new Vector2f(screen.x, screen.y); } - if (scaling == null) + if (scaling == null) { scaling = new ScaleUndo(selected, selected.getLocalScale().clone(), null); + } float origDist = startMouseCoord.distanceSquared(startSelectedCoord); float newDist = screenCoord.distanceSquared(startSelectedCoord); - if (origDist == 0) + if (origDist == 0) { origDist = 1; - float ratio = newDist/origDist; + } + float ratio = newDist / origDist; Vector3f prev = selected.getLocalScale(); - if (axis == Vector3f.UNIT_X) + if (axis == Vector3f.UNIT_X) { selected.setLocalScale(ratio, prev.y, prev.z); - else if (axis == Vector3f.UNIT_Y) + } else if (axis == Vector3f.UNIT_Y) { selected.setLocalScale(prev.x, ratio, prev.z); - else if (axis == Vector3f.UNIT_Z) + } else if (axis == Vector3f.UNIT_Z) { selected.setLocalScale(prev.x, prev.y, ratio); - else + } else { selected.setLocalScale(ratio, ratio, ratio); + } } - + private void doMouseRotate(Vector3f axis, Vector2f screenCoord, JmeNode rootNode, JmeSpatial selectedSpatial) { - if (startMouseCoord == null) + if (startMouseCoord == null) { startMouseCoord = screenCoord.clone(); + } if (startSelectedCoord == null) { Vector3f screen = getCamera().getScreenCoordinates(selected.getWorldTranslation()); startSelectedCoord = new Vector2f(screen.x, screen.y); } - if (rotating == null) + if (rotating == null) { rotating = new RotateUndo(selected, selected.getLocalRotation().clone(), null); - + } + Vector2f origRot = startMouseCoord.subtract(startSelectedCoord); Vector2f newRot = screenCoord.subtract(startSelectedCoord); float newRotAngle = origRot.angleBetween(newRot); float temp = newRotAngle; - - if (lastRotAngle != 0) + + if (lastRotAngle != 0) { newRotAngle -= lastRotAngle; - + } + lastRotAngle = temp; - + Quaternion rotate = new Quaternion(); if (axis != Vector3f.UNIT_XYZ) { rotate = rotate.fromAngleAxis(newRotAngle, axis); @@ -611,24 +625,26 @@ public class SelectTool extends SceneEditTool { rotate = rotate.fromAngleAxis(newRotAngle, getCamera().getDirection()); } selected.setLocalRotation(selected.getLocalRotation().mult(rotate)); - - + + } - + private void duplicateSelected() { - if (selected == null) + if (selected == null) { return; + } Spatial clone = selected.clone(); clone.move(1, 0, 1); - + selected.getParent().attachChild(clone); actionPerformed(new DuplicateUndo(clone, selected.getParent())); selected = clone; final Spatial cloned = clone; final JmeNode rootNode = toolController.getRootNode(); refreshSelected(rootNode, selected.getParent()); - + java.awt.EventQueue.invokeLater(new Runnable() { + @Override public void run() { if (cloned != null) { @@ -640,47 +656,49 @@ public class SelectTool extends SceneEditTool { } } }); - + // set to automatically 'grab'/'translate' the new cloned model toolController.updateSelection(selected); currentState = State.translate; currentAxis = Vector3f.UNIT_XYZ; } - + private void deleteSelected() { - if (selected == null) + if (selected == null) { return; + } Node parent = selected.getParent(); selected.removeFromParent(); actionPerformed(new DeleteUndo(selected, parent)); - + selected = null; toolController.updateSelection(selected); - + final JmeNode rootNode = toolController.getRootNode(); refreshSelected(rootNode, parent); } - + private void refreshSelected(final JmeNode jmeRootNode, final Node parent) { java.awt.EventQueue.invokeLater(new Runnable() { + @Override public void run() { jmeRootNode.getChild(parent).refresh(false); } }); } - + private class ScaleUndo extends AbstractUndoableSceneEdit { private Spatial spatial; - private Vector3f before,after; - + private Vector3f before, after; + ScaleUndo(Spatial spatial, Vector3f before, Vector3f after) { this.spatial = spatial; this.before = before; this.after = after; } - + @Override public void sceneUndo() { spatial.setLocalScale(before); @@ -691,18 +709,18 @@ public class SelectTool extends SceneEditTool { spatial.setLocalScale(after); } } - + private class RotateUndo extends AbstractUndoableSceneEdit { private Spatial spatial; - private Quaternion before,after; - + private Quaternion before, after; + RotateUndo(Spatial spatial, Quaternion before, Quaternion after) { this.spatial = spatial; this.before = before; this.after = after; } - + @Override public void sceneUndo() { spatial.setLocalRotation(before); @@ -713,17 +731,17 @@ public class SelectTool extends SceneEditTool { spatial.setLocalRotation(after); } } - + private class DeleteUndo extends AbstractUndoableSceneEdit { private Spatial spatial; private Node parent; - + DeleteUndo(Spatial spatial, Node parent) { this.spatial = spatial; this.parent = parent; } - + @Override public void sceneUndo() { parent.attachChild(spatial); @@ -734,17 +752,17 @@ public class SelectTool extends SceneEditTool { spatial.removeFromParent(); } } - + private class DuplicateUndo extends AbstractUndoableSceneEdit { private Spatial spatial; private Node parent; - + DuplicateUndo(Spatial spatial, Node parent) { this.spatial = spatial; this.parent = parent; } - + @Override public void sceneUndo() { spatial.removeFromParent(); @@ -755,7 +773,7 @@ public class SelectTool extends SceneEditTool { parent.attachChild(spatial); } } - + /** * Check if the selected item is a Terrain * It will climb up the parent tree to see if @@ -763,15 +781,16 @@ public class SelectTool extends SceneEditTool { * Recursive call. */ protected boolean isTerrain(Spatial s) { - if (s == null) + if (s == null) { return false; - if (s instanceof Terrain) + } + if (s instanceof Terrain) { return true; - + } + if (s.getParent() != null) { return isTerrain(s.getParent()); } return false; } - }