added rotate tool to SDK, thanks @kbender
git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@9373 75d07b2b-3a1a-0410-a2c5-0572b91ccdca3.0
parent
79ab8cd945
commit
fba447dc60
@ -0,0 +1,162 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.scenecomposer.tools; |
||||
|
||||
import com.jme3.asset.AssetManager; |
||||
import com.jme3.gde.core.sceneexplorer.nodes.JmeNode; |
||||
import com.jme3.gde.core.undoredo.AbstractUndoableSceneEdit; |
||||
import com.jme3.gde.scenecomposer.SceneComposerToolController; |
||||
import com.jme3.gde.scenecomposer.SceneEditTool; |
||||
import com.jme3.math.Quaternion; |
||||
import com.jme3.math.Vector2f; |
||||
import com.jme3.math.Vector3f; |
||||
import com.jme3.scene.Node; |
||||
import com.jme3.scene.Spatial; |
||||
import org.openide.loaders.DataObject; |
||||
|
||||
/** |
||||
* |
||||
* @author kbender |
||||
*/ |
||||
public class RotateTool extends SceneEditTool { |
||||
|
||||
private Vector3f pickedPlane; |
||||
private Vector2f lastScreenCoord; |
||||
private Quaternion startRotate; |
||||
private Quaternion lastRotate; |
||||
private boolean wasDragging = false; |
||||
|
||||
public RotateTool() { |
||||
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
|
||||
lastScreenCoord = null; |
||||
if (wasDragging) { |
||||
actionPerformed(new ScaleUndo(toolController.getSelectedSpatial(), startRotate, lastRotate)); |
||||
wasDragging = false; |
||||
} |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void actionSecondary(Vector2f screenCoord, boolean pressed, JmeNode rootNode, DataObject dataObject) { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void mouseMoved(Vector2f screenCoord) { |
||||
if (pickedPlane == null) { |
||||
highlightAxisMarker(camera, screenCoord, axisPickType); |
||||
} |
||||
else { |
||||
pickedPlane = null; |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void draggedPrimary(Vector2f screenCoord, boolean pressed, JmeNode rootNode, DataObject currentDataObject) { |
||||
|
||||
if (!pressed) { |
||||
setDefaultAxisMarkerColors(); |
||||
pickedPlane = null; // mouse released, reset selection
|
||||
lastScreenCoord = null; |
||||
|
||||
if (wasDragging) { |
||||
actionPerformed(new ScaleUndo(toolController.getSelectedSpatial(), startRotate, lastRotate)); |
||||
wasDragging = false; |
||||
} |
||||
return; |
||||
} |
||||
|
||||
if (toolController.getSelectedSpatial() == null) |
||||
{ |
||||
return; |
||||
} |
||||
|
||||
if (pickedPlane == null) |
||||
{ |
||||
pickedPlane = pickAxisMarker(camera, screenCoord, axisPickType); |
||||
if (pickedPlane == null) |
||||
{ |
||||
return; |
||||
} |
||||
startRotate = toolController.getSelectedSpatial().getLocalRotation().clone(); |
||||
} |
||||
|
||||
if (lastScreenCoord == null) { |
||||
lastScreenCoord = screenCoord; |
||||
} else { |
||||
Quaternion rotate = new Quaternion(); |
||||
float diff; |
||||
if(pickedPlane.equals(QUAD_XY)) |
||||
{ |
||||
diff = -(screenCoord.x-lastScreenCoord.x); |
||||
diff *= 0.03f; |
||||
rotate = rotate.fromAngleAxis(diff, Vector3f.UNIT_Z); |
||||
} |
||||
else if(pickedPlane.equals(QUAD_YZ)) |
||||
{ |
||||
diff = -(screenCoord.y-lastScreenCoord.y); |
||||
diff *= 0.03f; |
||||
rotate = rotate.fromAngleAxis(diff, Vector3f.UNIT_X); |
||||
} |
||||
else if(pickedPlane.equals(QUAD_XZ)) |
||||
{ |
||||
diff = screenCoord.x-lastScreenCoord.x; |
||||
diff *= 0.03f; |
||||
rotate = rotate.fromAngleAxis(diff, Vector3f.UNIT_Y); |
||||
} |
||||
|
||||
lastScreenCoord = screenCoord; |
||||
Quaternion rotation = toolController.getSelectedSpatial().getLocalRotation().mult(rotate); |
||||
lastRotate = rotation; |
||||
toolController.getSelectedSpatial().setLocalRotation(rotation); |
||||
updateToolsTransformation(); |
||||
} |
||||
|
||||
wasDragging = true; |
||||
} |
||||
|
||||
@Override |
||||
public void draggedSecondary(Vector2f screenCoord, boolean pressed, JmeNode rootNode, DataObject currentDataObject) { |
||||
|
||||
} |
||||
|
||||
private class ScaleUndo extends AbstractUndoableSceneEdit { |
||||
|
||||
private Spatial spatial; |
||||
private Quaternion before,after; |
||||
|
||||
ScaleUndo(Spatial spatial, Quaternion before, Quaternion after) { |
||||
this.spatial = spatial; |
||||
this.before = before; |
||||
this.after = after; |
||||
} |
||||
|
||||
@Override |
||||
public void sceneUndo() { |
||||
spatial.setLocalRotation(before); |
||||
toolController.selectedSpatialTransformed(); |
||||
} |
||||
|
||||
@Override |
||||
public void sceneRedo() { |
||||
spatial.setLocalRotation(after); |
||||
toolController.selectedSpatialTransformed(); |
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue