|
|
@ -45,25 +45,22 @@ public class SelectTool extends SceneEditTool { |
|
|
|
|
|
|
|
|
|
|
|
protected Spatial selected; |
|
|
|
protected Spatial selected; |
|
|
|
|
|
|
|
|
|
|
|
private enum State {translate, rotate, scale}; |
|
|
|
private enum State { |
|
|
|
private State currentState = null; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
translate, rotate, scale |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
private State currentState = null; |
|
|
|
private Vector3f currentAxis = Vector3f.UNIT_XYZ; |
|
|
|
private Vector3f currentAxis = Vector3f.UNIT_XYZ; |
|
|
|
|
|
|
|
|
|
|
|
private StringBuilder numberBuilder = new StringBuilder(); // gets appended with numbers
|
|
|
|
private StringBuilder numberBuilder = new StringBuilder(); // gets appended with numbers
|
|
|
|
|
|
|
|
|
|
|
|
private Quaternion startRot; |
|
|
|
private Quaternion startRot; |
|
|
|
private Vector3f startTrans; |
|
|
|
private Vector3f startTrans; |
|
|
|
private Vector3f startScale; |
|
|
|
private Vector3f startScale; |
|
|
|
|
|
|
|
|
|
|
|
private boolean wasDraggingL = false; |
|
|
|
private boolean wasDraggingL = false; |
|
|
|
private boolean wasDraggingR = false; |
|
|
|
private boolean wasDraggingR = false; |
|
|
|
private boolean wasDownR = false; |
|
|
|
private boolean wasDownR = false; |
|
|
|
private boolean ctrlDown = false; |
|
|
|
private boolean ctrlDown = false; |
|
|
|
private boolean shiftDown = false; |
|
|
|
private boolean shiftDown = false; |
|
|
|
private boolean altDown = false; |
|
|
|
private boolean altDown = false; |
|
|
|
|
|
|
|
|
|
|
|
private MoveManager.MoveUndo moving; |
|
|
|
private MoveManager.MoveUndo moving; |
|
|
|
private ScaleUndo scaling; |
|
|
|
private ScaleUndo scaling; |
|
|
|
private RotateUndo rotating; |
|
|
|
private RotateUndo rotating; |
|
|
@ -93,9 +90,9 @@ public class SelectTool extends SceneEditTool { |
|
|
|
|
|
|
|
|
|
|
|
checkModificatorKeys(kie); // alt,shift,ctrl
|
|
|
|
checkModificatorKeys(kie); // alt,shift,ctrl
|
|
|
|
|
|
|
|
|
|
|
|
if (selected == null) |
|
|
|
if (selected == null) { |
|
|
|
return; // only do anything if a spatial is selected
|
|
|
|
return; // only do anything if a spatial is selected
|
|
|
|
|
|
|
|
} |
|
|
|
// key released
|
|
|
|
// key released
|
|
|
|
if (kie.isReleased()) { |
|
|
|
if (kie.isReleased()) { |
|
|
|
boolean commandUsed = checkCommandKey(kie); |
|
|
|
boolean commandUsed = checkCommandKey(kie); |
|
|
@ -105,17 +102,16 @@ public class SelectTool extends SceneEditTool { |
|
|
|
boolean enterHit = checkEnterHit(kie); |
|
|
|
boolean enterHit = checkEnterHit(kie); |
|
|
|
boolean escHit = checkEscHit(kie); |
|
|
|
boolean escHit = checkEscHit(kie); |
|
|
|
|
|
|
|
|
|
|
|
if (commandUsed) |
|
|
|
if (commandUsed) { |
|
|
|
return; // commands take priority
|
|
|
|
return; // commands take priority
|
|
|
|
|
|
|
|
} |
|
|
|
if (stateChange) { |
|
|
|
if (stateChange) { |
|
|
|
currentAxis = Vector3f.UNIT_XYZ; |
|
|
|
currentAxis = Vector3f.UNIT_XYZ; |
|
|
|
numberBuilder = new StringBuilder(); |
|
|
|
numberBuilder = new StringBuilder(); |
|
|
|
recordInitialState(selected); |
|
|
|
recordInitialState(selected); |
|
|
|
} |
|
|
|
} else if (axisChange) { |
|
|
|
else if (axisChange) {} |
|
|
|
} else if (numberChange) { |
|
|
|
else if (numberChange) {} |
|
|
|
} else if (enterHit) { |
|
|
|
else if (enterHit) { |
|
|
|
|
|
|
|
if (currentState != null && numberBuilder.length() > 0) { |
|
|
|
if (currentState != null && numberBuilder.length() > 0) { |
|
|
|
applyKeyedChangeState(selected); |
|
|
|
applyKeyedChangeState(selected); |
|
|
|
clearState(false); |
|
|
|
clearState(false); |
|
|
@ -127,8 +123,9 @@ public class SelectTool extends SceneEditTool { |
|
|
|
// reset conditions below:
|
|
|
|
// reset conditions below:
|
|
|
|
|
|
|
|
|
|
|
|
if (escHit) { |
|
|
|
if (escHit) { |
|
|
|
if (moving != null) |
|
|
|
if (moving != null) { |
|
|
|
moving.sceneUndo(); |
|
|
|
moving.sceneUndo(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
moving = null; |
|
|
|
moving = null; |
|
|
|
clearState(); |
|
|
|
clearState(); |
|
|
@ -151,13 +148,16 @@ public class SelectTool extends SceneEditTool { |
|
|
|
private void clearState(boolean resetSelected) { |
|
|
|
private void clearState(boolean resetSelected) { |
|
|
|
if (resetSelected && selected != null) { |
|
|
|
if (resetSelected && selected != null) { |
|
|
|
// reset the transforms
|
|
|
|
// reset the transforms
|
|
|
|
if (startRot != null) |
|
|
|
if (startRot != null) { |
|
|
|
selected.setLocalRotation(startRot); |
|
|
|
selected.setLocalRotation(startRot); |
|
|
|
if (startTrans != null) |
|
|
|
} |
|
|
|
|
|
|
|
if (startTrans != null) { |
|
|
|
selected.setLocalTranslation(startTrans); |
|
|
|
selected.setLocalTranslation(startTrans); |
|
|
|
if (startScale != null) |
|
|
|
} |
|
|
|
|
|
|
|
if (startScale != null) { |
|
|
|
selected.setLocalScale(startScale); |
|
|
|
selected.setLocalScale(startScale); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
currentState = null; |
|
|
|
currentState = null; |
|
|
|
currentAxis = Vector3f.UNIT_XYZ; |
|
|
|
currentAxis = Vector3f.UNIT_XYZ; |
|
|
|
numberBuilder = new StringBuilder(); |
|
|
|
numberBuilder = new StringBuilder(); |
|
|
@ -168,7 +168,6 @@ public class SelectTool extends SceneEditTool { |
|
|
|
startSelectedCoord = null; |
|
|
|
startSelectedCoord = null; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void recordInitialState(Spatial selected) { |
|
|
|
private void recordInitialState(Spatial selected) { |
|
|
|
startRot = selected.getLocalRotation().clone(); |
|
|
|
startRot = selected.getLocalRotation().clone(); |
|
|
|
startTrans = selected.getLocalTranslation().clone(); |
|
|
|
startTrans = selected.getLocalTranslation().clone(); |
|
|
@ -197,13 +196,13 @@ public class SelectTool extends SceneEditTool { |
|
|
|
moving = null; |
|
|
|
moving = null; |
|
|
|
} else if (currentState == State.scale) { |
|
|
|
} else if (currentState == State.scale) { |
|
|
|
float x = 1, y = 1, z = 1; |
|
|
|
float x = 1, y = 1, z = 1; |
|
|
|
if (currentAxis == Vector3f.UNIT_X) |
|
|
|
if (currentAxis == Vector3f.UNIT_X) { |
|
|
|
x = value; |
|
|
|
x = value; |
|
|
|
else if (currentAxis == Vector3f.UNIT_Y) |
|
|
|
} else if (currentAxis == Vector3f.UNIT_Y) { |
|
|
|
y = value; |
|
|
|
y = value; |
|
|
|
else if (currentAxis == Vector3f.UNIT_Z) |
|
|
|
} else if (currentAxis == Vector3f.UNIT_Z) { |
|
|
|
z = value; |
|
|
|
z = value; |
|
|
|
else if (currentAxis == Vector3f.UNIT_XYZ) { |
|
|
|
} else if (currentAxis == Vector3f.UNIT_XYZ) { |
|
|
|
x = value; |
|
|
|
x = value; |
|
|
|
y = value; |
|
|
|
y = value; |
|
|
|
z = value; |
|
|
|
z = value; |
|
|
@ -214,12 +213,13 @@ public class SelectTool extends SceneEditTool { |
|
|
|
actionPerformed(new ScaleUndo(selected, before, after)); |
|
|
|
actionPerformed(new ScaleUndo(selected, before, after)); |
|
|
|
} else if (currentState == State.rotate) { |
|
|
|
} else if (currentState == State.rotate) { |
|
|
|
float x = 0, y = 0, z = 0; |
|
|
|
float x = 0, y = 0, z = 0; |
|
|
|
if (currentAxis == Vector3f.UNIT_X) |
|
|
|
if (currentAxis == Vector3f.UNIT_X) { |
|
|
|
x = 1; |
|
|
|
x = 1; |
|
|
|
else if (currentAxis == Vector3f.UNIT_Y) |
|
|
|
} else if (currentAxis == Vector3f.UNIT_Y) { |
|
|
|
y = 1; |
|
|
|
y = 1; |
|
|
|
else if (currentAxis == Vector3f.UNIT_Z) |
|
|
|
} else if (currentAxis == Vector3f.UNIT_Z) { |
|
|
|
z = 1; |
|
|
|
z = 1; |
|
|
|
|
|
|
|
} |
|
|
|
Vector3f axis = new Vector3f(x, y, z); |
|
|
|
Vector3f axis = new Vector3f(x, y, z); |
|
|
|
Quaternion initialRot = selected.getLocalRotation().clone(); |
|
|
|
Quaternion initialRot = selected.getLocalRotation().clone(); |
|
|
|
Quaternion rot = new Quaternion(); |
|
|
|
Quaternion rot = new Quaternion(); |
|
|
@ -234,15 +234,18 @@ public class SelectTool extends SceneEditTool { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private void checkModificatorKeys(KeyInputEvent kie) { |
|
|
|
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(); |
|
|
|
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(); |
|
|
|
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(); |
|
|
|
altDown = kie.isPressed(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private boolean checkCommandKey(KeyInputEvent kie) { |
|
|
|
private boolean checkCommandKey(KeyInputEvent kie) { |
|
|
|
if (kie.getKeyCode() == KeyInput.KEY_D) { |
|
|
|
if (kie.getKeyCode() == KeyInput.KEY_D) { |
|
|
@ -329,8 +332,9 @@ public class SelectTool extends SceneEditTool { |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
numberBuilder.insert(0, '-'); |
|
|
|
numberBuilder.insert(0, '-'); |
|
|
|
} |
|
|
|
} |
|
|
|
} else |
|
|
|
} else { |
|
|
|
numberBuilder.append('-'); |
|
|
|
numberBuilder.append('-'); |
|
|
|
|
|
|
|
} |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} else if (kie.getKeyCode() == KeyInput.KEY_0 || kie.getKeyCode() == KeyInput.KEY_NUMPAD0) { |
|
|
|
} else if (kie.getKeyCode() == KeyInput.KEY_0 || kie.getKeyCode() == KeyInput.KEY_NUMPAD0) { |
|
|
|
numberBuilder.append('0'); |
|
|
|
numberBuilder.append('0'); |
|
|
@ -364,12 +368,13 @@ public class SelectTool extends SceneEditTool { |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} else if (kie.getKeyCode() == KeyInput.KEY_PERIOD) { |
|
|
|
} else if (kie.getKeyCode() == KeyInput.KEY_PERIOD) { |
|
|
|
if (numberBuilder.indexOf(".") == -1) { // if it doesn't exist yet
|
|
|
|
if (numberBuilder.indexOf(".") == -1) { // if it doesn't exist yet
|
|
|
|
if (numberBuilder.length() == 0 || |
|
|
|
if (numberBuilder.length() == 0 |
|
|
|
(numberBuilder.length() == 1 && numberBuilder.charAt(0) == '-')) |
|
|
|
|| (numberBuilder.length() == 1 && numberBuilder.charAt(0) == '-')) { |
|
|
|
numberBuilder.append("0."); |
|
|
|
numberBuilder.append("0."); |
|
|
|
else |
|
|
|
} else { |
|
|
|
numberBuilder.append("."); |
|
|
|
numberBuilder.append("."); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -419,8 +424,9 @@ public class SelectTool extends SceneEditTool { |
|
|
|
// mouse released and wasn't dragging, place cursor
|
|
|
|
// mouse released and wasn't dragging, place cursor
|
|
|
|
final Vector3f result = pickWorldLocation(getCamera(), screenCoord, rootNode); |
|
|
|
final Vector3f result = pickWorldLocation(getCamera(), screenCoord, rootNode); |
|
|
|
if (result != null) { |
|
|
|
if (result != null) { |
|
|
|
if (toolController.isSnapToGrid()) |
|
|
|
if (toolController.isSnapToGrid()) { |
|
|
|
result.set(Math.round(result.x), result.y, Math.round(result.z)); |
|
|
|
result.set(Math.round(result.x), result.y, Math.round(result.z)); |
|
|
|
|
|
|
|
} |
|
|
|
toolController.doSetCursorLocation(result); |
|
|
|
toolController.doSetCursorLocation(result); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
@ -446,8 +452,7 @@ public class SelectTool extends SceneEditTool { |
|
|
|
rotating.sceneUndo(); |
|
|
|
rotating.sceneUndo(); |
|
|
|
rotating = null; |
|
|
|
rotating = null; |
|
|
|
clearState(); |
|
|
|
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
|
|
|
|
// pick on the spot
|
|
|
|
Spatial s = pickWorldSpatial(camera, screenCoord, rootNode); |
|
|
|
Spatial s = pickWorldSpatial(camera, screenCoord, rootNode); |
|
|
|
if (!toolController.selectTerrain() && isTerrain(s)) { |
|
|
|
if (!toolController.selectTerrain() && isTerrain(s)) { |
|
|
@ -458,13 +463,15 @@ public class SelectTool extends SceneEditTool { |
|
|
|
|
|
|
|
|
|
|
|
// climb up and find the Model Node (parent) and select that, don't select the geom
|
|
|
|
// climb up and find the Model Node (parent) and select that, don't select the geom
|
|
|
|
Spatial linkNodeParent = findModelNodeParent(s); |
|
|
|
Spatial linkNodeParent = findModelNodeParent(s); |
|
|
|
if (linkNodeParent != null) |
|
|
|
if (linkNodeParent != null) { |
|
|
|
s = linkNodeParent; |
|
|
|
s = linkNodeParent; |
|
|
|
else |
|
|
|
} else { |
|
|
|
return; |
|
|
|
return; |
|
|
|
|
|
|
|
} |
|
|
|
final Spatial selec = s; |
|
|
|
final Spatial selec = s; |
|
|
|
selected = selec; |
|
|
|
selected = selec; |
|
|
|
java.awt.EventQueue.invokeLater(new Runnable() { |
|
|
|
java.awt.EventQueue.invokeLater(new Runnable() { |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public void run() { |
|
|
|
public void run() { |
|
|
|
if (selec != null) { |
|
|
|
if (selec != null) { |
|
|
@ -493,14 +500,17 @@ public class SelectTool extends SceneEditTool { |
|
|
|
* TODO: use userData to determine the actual model's parent. |
|
|
|
* TODO: use userData to determine the actual model's parent. |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
private Spatial findModelNodeParent(Spatial child) { |
|
|
|
private Spatial findModelNodeParent(Spatial child) { |
|
|
|
if (child == null) |
|
|
|
if (child == null) { |
|
|
|
return null; |
|
|
|
return null; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (child instanceof Node) |
|
|
|
if (child instanceof Node) { |
|
|
|
return child; |
|
|
|
return child; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (child.getParent() != null) |
|
|
|
if (child.getParent() != null) { |
|
|
|
return findModelNodeParent(child.getParent()); |
|
|
|
return findModelNodeParent(child.getParent()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return null; |
|
|
|
return null; |
|
|
|
} |
|
|
|
} |
|
|
@ -530,15 +540,12 @@ public class SelectTool extends SceneEditTool { |
|
|
|
Vector3f axis, |
|
|
|
Vector3f axis, |
|
|
|
JmeNode rootNode, |
|
|
|
JmeNode rootNode, |
|
|
|
DataObject currentDataObject, |
|
|
|
DataObject currentDataObject, |
|
|
|
JmeSpatial selectedSpatial) |
|
|
|
JmeSpatial selectedSpatial) { |
|
|
|
{ |
|
|
|
|
|
|
|
if (state == State.translate) { |
|
|
|
if (state == State.translate) { |
|
|
|
doMouseTranslate(axis, screenCoord, rootNode, selectedSpatial); |
|
|
|
doMouseTranslate(axis, screenCoord, rootNode, selectedSpatial); |
|
|
|
} |
|
|
|
} else if (state == State.scale) { |
|
|
|
else if (state == State.scale) { |
|
|
|
|
|
|
|
doMouseScale(axis, screenCoord, rootNode, selectedSpatial); |
|
|
|
doMouseScale(axis, screenCoord, rootNode, selectedSpatial); |
|
|
|
} |
|
|
|
} else if (state == State.rotate) { |
|
|
|
else if (state == State.rotate) { |
|
|
|
|
|
|
|
doMouseRotate(axis, screenCoord, rootNode, selectedSpatial); |
|
|
|
doMouseRotate(axis, screenCoord, rootNode, selectedSpatial); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -556,50 +563,57 @@ public class SelectTool extends SceneEditTool { |
|
|
|
private void doMouseScale(Vector3f axis, Vector2f screenCoord, JmeNode rootNode, JmeSpatial selectedSpatial) { |
|
|
|
private void doMouseScale(Vector3f axis, Vector2f screenCoord, JmeNode rootNode, JmeSpatial selectedSpatial) { |
|
|
|
// scale based on the original mouse position and original model-to-screen position
|
|
|
|
// 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
|
|
|
|
// and compare that to the distance from the new mouse position and the original distance
|
|
|
|
if (startMouseCoord == null) |
|
|
|
if (startMouseCoord == null) { |
|
|
|
startMouseCoord = screenCoord.clone(); |
|
|
|
startMouseCoord = screenCoord.clone(); |
|
|
|
|
|
|
|
} |
|
|
|
if (startSelectedCoord == null) { |
|
|
|
if (startSelectedCoord == null) { |
|
|
|
Vector3f screen = getCamera().getScreenCoordinates(selected.getWorldTranslation()); |
|
|
|
Vector3f screen = getCamera().getScreenCoordinates(selected.getWorldTranslation()); |
|
|
|
startSelectedCoord = new Vector2f(screen.x, screen.y); |
|
|
|
startSelectedCoord = new Vector2f(screen.x, screen.y); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (scaling == null) |
|
|
|
if (scaling == null) { |
|
|
|
scaling = new ScaleUndo(selected, selected.getLocalScale().clone(), null); |
|
|
|
scaling = new ScaleUndo(selected, selected.getLocalScale().clone(), null); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
float origDist = startMouseCoord.distanceSquared(startSelectedCoord); |
|
|
|
float origDist = startMouseCoord.distanceSquared(startSelectedCoord); |
|
|
|
float newDist = screenCoord.distanceSquared(startSelectedCoord); |
|
|
|
float newDist = screenCoord.distanceSquared(startSelectedCoord); |
|
|
|
if (origDist == 0) |
|
|
|
if (origDist == 0) { |
|
|
|
origDist = 1; |
|
|
|
origDist = 1; |
|
|
|
|
|
|
|
} |
|
|
|
float ratio = newDist / origDist; |
|
|
|
float ratio = newDist / origDist; |
|
|
|
Vector3f prev = selected.getLocalScale(); |
|
|
|
Vector3f prev = selected.getLocalScale(); |
|
|
|
if (axis == Vector3f.UNIT_X) |
|
|
|
if (axis == Vector3f.UNIT_X) { |
|
|
|
selected.setLocalScale(ratio, prev.y, prev.z); |
|
|
|
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); |
|
|
|
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); |
|
|
|
selected.setLocalScale(prev.x, prev.y, ratio); |
|
|
|
else |
|
|
|
} else { |
|
|
|
selected.setLocalScale(ratio, ratio, ratio); |
|
|
|
selected.setLocalScale(ratio, ratio, ratio); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private void doMouseRotate(Vector3f axis, Vector2f screenCoord, JmeNode rootNode, JmeSpatial selectedSpatial) { |
|
|
|
private void doMouseRotate(Vector3f axis, Vector2f screenCoord, JmeNode rootNode, JmeSpatial selectedSpatial) { |
|
|
|
if (startMouseCoord == null) |
|
|
|
if (startMouseCoord == null) { |
|
|
|
startMouseCoord = screenCoord.clone(); |
|
|
|
startMouseCoord = screenCoord.clone(); |
|
|
|
|
|
|
|
} |
|
|
|
if (startSelectedCoord == null) { |
|
|
|
if (startSelectedCoord == null) { |
|
|
|
Vector3f screen = getCamera().getScreenCoordinates(selected.getWorldTranslation()); |
|
|
|
Vector3f screen = getCamera().getScreenCoordinates(selected.getWorldTranslation()); |
|
|
|
startSelectedCoord = new Vector2f(screen.x, screen.y); |
|
|
|
startSelectedCoord = new Vector2f(screen.x, screen.y); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (rotating == null) |
|
|
|
if (rotating == null) { |
|
|
|
rotating = new RotateUndo(selected, selected.getLocalRotation().clone(), null); |
|
|
|
rotating = new RotateUndo(selected, selected.getLocalRotation().clone(), null); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
Vector2f origRot = startMouseCoord.subtract(startSelectedCoord); |
|
|
|
Vector2f origRot = startMouseCoord.subtract(startSelectedCoord); |
|
|
|
Vector2f newRot = screenCoord.subtract(startSelectedCoord); |
|
|
|
Vector2f newRot = screenCoord.subtract(startSelectedCoord); |
|
|
|
float newRotAngle = origRot.angleBetween(newRot); |
|
|
|
float newRotAngle = origRot.angleBetween(newRot); |
|
|
|
float temp = newRotAngle; |
|
|
|
float temp = newRotAngle; |
|
|
|
|
|
|
|
|
|
|
|
if (lastRotAngle != 0) |
|
|
|
if (lastRotAngle != 0) { |
|
|
|
newRotAngle -= lastRotAngle; |
|
|
|
newRotAngle -= lastRotAngle; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
lastRotAngle = temp; |
|
|
|
lastRotAngle = temp; |
|
|
|
|
|
|
|
|
|
|
@ -616,8 +630,9 @@ public class SelectTool extends SceneEditTool { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private void duplicateSelected() { |
|
|
|
private void duplicateSelected() { |
|
|
|
if (selected == null) |
|
|
|
if (selected == null) { |
|
|
|
return; |
|
|
|
return; |
|
|
|
|
|
|
|
} |
|
|
|
Spatial clone = selected.clone(); |
|
|
|
Spatial clone = selected.clone(); |
|
|
|
clone.move(1, 0, 1); |
|
|
|
clone.move(1, 0, 1); |
|
|
|
|
|
|
|
|
|
|
@ -629,6 +644,7 @@ public class SelectTool extends SceneEditTool { |
|
|
|
refreshSelected(rootNode, selected.getParent()); |
|
|
|
refreshSelected(rootNode, selected.getParent()); |
|
|
|
|
|
|
|
|
|
|
|
java.awt.EventQueue.invokeLater(new Runnable() { |
|
|
|
java.awt.EventQueue.invokeLater(new Runnable() { |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public void run() { |
|
|
|
public void run() { |
|
|
|
if (cloned != null) { |
|
|
|
if (cloned != null) { |
|
|
@ -648,8 +664,9 @@ public class SelectTool extends SceneEditTool { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private void deleteSelected() { |
|
|
|
private void deleteSelected() { |
|
|
|
if (selected == null) |
|
|
|
if (selected == null) { |
|
|
|
return; |
|
|
|
return; |
|
|
|
|
|
|
|
} |
|
|
|
Node parent = selected.getParent(); |
|
|
|
Node parent = selected.getParent(); |
|
|
|
selected.removeFromParent(); |
|
|
|
selected.removeFromParent(); |
|
|
|
actionPerformed(new DeleteUndo(selected, parent)); |
|
|
|
actionPerformed(new DeleteUndo(selected, parent)); |
|
|
@ -663,6 +680,7 @@ public class SelectTool extends SceneEditTool { |
|
|
|
|
|
|
|
|
|
|
|
private void refreshSelected(final JmeNode jmeRootNode, final Node parent) { |
|
|
|
private void refreshSelected(final JmeNode jmeRootNode, final Node parent) { |
|
|
|
java.awt.EventQueue.invokeLater(new Runnable() { |
|
|
|
java.awt.EventQueue.invokeLater(new Runnable() { |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public void run() { |
|
|
|
public void run() { |
|
|
|
jmeRootNode.getChild(parent).refresh(false); |
|
|
|
jmeRootNode.getChild(parent).refresh(false); |
|
|
@ -763,15 +781,16 @@ public class SelectTool extends SceneEditTool { |
|
|
|
* Recursive call. |
|
|
|
* Recursive call. |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
protected boolean isTerrain(Spatial s) { |
|
|
|
protected boolean isTerrain(Spatial s) { |
|
|
|
if (s == null) |
|
|
|
if (s == null) { |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
if (s instanceof Terrain) |
|
|
|
} |
|
|
|
|
|
|
|
if (s instanceof Terrain) { |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (s.getParent() != null) { |
|
|
|
if (s.getParent() != null) { |
|
|
|
return isTerrain(s.getParent()); |
|
|
|
return isTerrain(s.getParent()); |
|
|
|
} |
|
|
|
} |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|