Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -285,7 +285,7 @@ private static boolean isExcluded(Spatial s, Spatial exclude) {
* what part of the axis was selected.
* For example if (1,0,0) is returned, then the X-axis pole was selected.
* If (0,1,1) is returned, then the Y-Z plane was selected.
*
*
* @return null if it did not intersect the marker
*/
protected Vector3f pickAxisMarker(Camera cam, Vector2f mouseLoc, AxisMarkerPickType pickType) {
Expand Down Expand Up @@ -336,7 +336,7 @@ private static CollisionResult pick(Camera cam, Vector2f mouseLoc, Node node) {
CollisionResults results = new CollisionResults();
Ray ray = new Ray();
Vector3f pos = cam.getWorldCoordinates(mouseLoc, 0).clone();
Vector3f dir = cam.getWorldCoordinates(mouseLoc, 0.1f).clone();
Vector3f dir = cam.getWorldCoordinates(mouseLoc, 0.125f).clone();
dir.subtractLocal(pos).normalizeLocal();
ray.setOrigin(pos);
ray.setDirection(dir);
Expand All @@ -347,20 +347,20 @@ private static CollisionResult pick(Camera cam, Vector2f mouseLoc, Node node) {

/**
* Show what axis or plane the mouse is currently over and will affect.
* @param axisMarkerPickType
* @param axisMarkerPickType
*/
protected void highlightAxisMarker(Camera camera, Vector2f screenCoord, AxisMarkerPickType axisMarkerPickType) {
highlightAxisMarker(camera, screenCoord, axisMarkerPickType, false);
}

/**
* Show what axis or plane the mouse is currently over and will affect.
* @param axisMarkerPickType
* @param axisMarkerPickType
* @param colorAll highlight all parts of the marker when only one is selected
*/
protected void highlightAxisMarker(Camera camera, Vector2f screenCoord, AxisMarkerPickType axisMarkerPickType, boolean colorAll) {
setDefaultAxisMarkerColors();
Vector3f picked = pickAxisMarker(camera, screenCoord, axisPickType);
Vector3f picked = pickAxisMarker(camera, screenCoord, axisMarkerPickType);
if (picked == null) {
return;
}
Expand Down Expand Up @@ -453,6 +453,7 @@ protected Node createAxisMarker() {
// axis.attachChild(quadYZ);

axis.setModelBound(new BoundingBox());
axis.updateModelBound();
return axis;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@
*/
public class MoveTool extends SceneEditTool {

private Vector3f pickedPlane;
private Vector3f pickedMarker;
private Vector3f constraintAxis; //used for one axis move
private boolean wasDragging = false;
private MoveManager moveManager;

Expand All @@ -48,11 +49,12 @@ public void activate(AssetManager manager, Node toolNode, Node onTopToolNode, Sp
public void actionPrimary(Vector2f screenCoord, boolean pressed, JmeNode rootNode, DataObject dataObject) {
if (!pressed) {
setDefaultAxisMarkerColors();
pickedPlane = null; // mouse released, reset selection
pickedMarker = null; // mouse released, reset selection
constraintAxis = Vector3f.UNIT_XYZ; // no constraint
if (wasDragging) {
actionPerformed(moveManager.makeUndo());
wasDragging = false;
}
}
moveManager.reset();
}
}
Expand All @@ -63,20 +65,21 @@ public void actionSecondary(Vector2f screenCoord, boolean pressed, JmeNode rootN

@Override
public void mouseMoved(Vector2f screenCoord, JmeNode rootNode, DataObject currentDataObject, JmeSpatial selectedSpatial) {
if (pickedPlane == null) {

if (pickedMarker == null) {
highlightAxisMarker(camera, screenCoord, axisPickType);
} else {
pickedPlane = null;
pickedMarker = null;
moveManager.reset();
}
}

@Override
public void draggedPrimary(Vector2f screenCoord, boolean pressed, JmeNode rootNode, DataObject currentDataObject) {
if (!pressed) {
if (!pressed) {
setDefaultAxisMarkerColors();
pickedPlane = null; // mouse released, reset selection
pickedMarker = null; // mouse released, reset selection
constraintAxis = Vector3f.UNIT_XYZ; // no constraint
if (wasDragging) {
actionPerformed(moveManager.makeUndo());
wasDragging = false;
Expand All @@ -89,21 +92,30 @@ public void draggedPrimary(Vector2f screenCoord, boolean pressed, JmeNode rootNo
return;
}

if (pickedPlane == null) {
pickedPlane = pickAxisMarker(camera, screenCoord, axisPickType);
if (pickedPlane == null) {
if (pickedMarker == null) {
pickedMarker = pickAxisMarker(camera, screenCoord, axisPickType);
if (pickedMarker == null) {
return;
}

if (pickedPlane.equals(new Vector3f(1, 1, 0))) {
if (pickedMarker.equals(QUAD_XY)) {
moveManager.initiateMove(toolController.getSelectedSpatial(), MoveManager.XY, true);
} else if (pickedPlane.equals(new Vector3f(1, 0, 1))) {
} else if (pickedMarker.equals(QUAD_XZ)) {
moveManager.initiateMove(toolController.getSelectedSpatial(), MoveManager.XZ, true);
} else if (pickedPlane.equals(new Vector3f(0, 1, 1))) {
} else if (pickedMarker.equals(QUAD_YZ)) {
moveManager.initiateMove(toolController.getSelectedSpatial(), MoveManager.YZ, true);
} else if (pickedMarker.equals(ARROW_X)) {
moveManager.initiateMove(toolController.getSelectedSpatial(), MoveManager.XY, true);
constraintAxis = Vector3f.UNIT_X; // move only X
} else if (pickedMarker.equals(ARROW_Y)) {
moveManager.initiateMove(toolController.getSelectedSpatial(), MoveManager.YZ, true);
constraintAxis = Vector3f.UNIT_Y; // move only Y
} else if (pickedMarker.equals(ARROW_Z)) {
moveManager.initiateMove(toolController.getSelectedSpatial(), MoveManager.XZ, true);
constraintAxis = Vector3f.UNIT_Z; // move only Z
}
}
if (!moveManager.move(camera, screenCoord)) {
if (!moveManager.move(camera, screenCoord, constraintAxis, false)) {
return;
}
updateToolsTransformation();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,107 +21,118 @@
* @author sploreg
*/
public class ScaleTool extends SceneEditTool {

private Vector3f pickedPlane;

private Vector3f pickedMarker;
private Vector3f constraintAxis; //used for one axis scale
private Vector2f lastScreenCoord;
private Vector3f startScale;
private Vector3f lastScale;
private boolean wasDragging = false;

public ScaleTool() {
axisPickType = AxisMarkerPickType.axisAndPlane;
setOverrideCameraControl(true);
}

@Override
public void activate(AssetManager manager, Node toolNode, Node onTopToolNode, Spatial selectedSpatial, SceneComposerToolController toolController) {
super.activate(manager, toolNode, onTopToolNode, selectedSpatial, toolController);
displayPlanes();
}

@Override
public void actionPrimary(Vector2f screenCoord, boolean pressed, JmeNode rootNode, DataObject dataObject) {
if (!pressed) {
setDefaultAxisMarkerColors();
pickedPlane = null; // mouse released, reset selection
pickedMarker = null; // mouse released, reset selection
lastScreenCoord = null;
constraintAxis = Vector3f.UNIT_XYZ; // no axis constraint
if (wasDragging) {
actionPerformed(new ScaleUndo(toolController.getSelectedSpatial(), startScale, lastScale));
wasDragging = false;
}
}
}

@Override
public void actionSecondary(Vector2f screenCoord, boolean pressed, JmeNode rootNode, DataObject dataObject) {

}

@Override
public void mouseMoved(Vector2f screenCoord, JmeNode rootNode, DataObject currentDataObject, JmeSpatial selectedSpatial) {
if (pickedPlane == null) {
if (pickedMarker == null) {
highlightAxisMarker(camera, screenCoord, axisPickType, true);
}
/*else {
pickedPlane = null;
lastScreenCoord = null;
}*/
pickedPlane = null;
lastScreenCoord = null;
}*/
}

@Override
public void draggedPrimary(Vector2f screenCoord, boolean pressed, JmeNode rootNode, DataObject currentDataObject) {
if (!pressed) {
setDefaultAxisMarkerColors();
pickedPlane = null; // mouse released, reset selection
pickedMarker = null; // mouse released, reset selection
lastScreenCoord = null;

constraintAxis = Vector3f.UNIT_XYZ; // no axis constraint
if (wasDragging) {
actionPerformed(new ScaleUndo(toolController.getSelectedSpatial(), startScale, lastScale));
wasDragging = false;
}
return;
}
if (toolController.getSelectedSpatial() == null)

if (toolController.getSelectedSpatial() == null) {
return;
if (pickedPlane == null) {
pickedPlane = pickAxisMarker(camera, screenCoord, axisPickType);
if (pickedPlane == null)
}
if (pickedMarker == null) {
pickedMarker = pickAxisMarker(camera, screenCoord, axisPickType);
if (pickedMarker == null) {
return;
}
if (pickedMarker.equals(ARROW_X)) {
constraintAxis = Vector3f.UNIT_X; // scale only X
} else if (pickedMarker.equals(ARROW_Y)) {
constraintAxis = Vector3f.UNIT_Y; // scale only Y
} else if (pickedMarker.equals(ARROW_Z)) {
constraintAxis = Vector3f.UNIT_Z; // scale only Z
}
startScale = toolController.getSelectedSpatial().getLocalScale().clone();
}

if (lastScreenCoord == null) {
lastScreenCoord = screenCoord;
} else {
float diff = screenCoord.y-lastScreenCoord.y;
float diff = screenCoord.y - lastScreenCoord.y;
diff *= 0.1f;
lastScreenCoord = screenCoord;
Vector3f scale = toolController.getSelectedSpatial().getLocalScale().add(diff, diff, diff);
Vector3f scale = toolController.getSelectedSpatial().getLocalScale().add(new Vector3f(diff, diff, diff).multLocal(constraintAxis));
lastScale = scale;
toolController.getSelectedSpatial().setLocalScale(scale);
updateToolsTransformation();
}

wasDragging = true;
}

@Override
public void draggedSecondary(Vector2f screenCoord, boolean pressed, JmeNode rootNode, DataObject currentDataObject) {

}

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);
Expand All @@ -133,6 +144,6 @@ public void sceneRedo() {
spatial.setLocalScale(after);
toolController.selectedSpatialTransformed();
}

}
}