experimental
parent
6ef33e4c10
commit
1f4ee34de8
@ -0,0 +1,189 @@ |
|||||||
|
/* |
||||||
|
* To change this license header, choose License Headers in Project Properties. |
||||||
|
* To change this template file, choose Tools | Templates |
||||||
|
* and open the template in the editor. |
||||||
|
*/ |
||||||
|
package com.jme3.gde.scenecomposer.tools.shortcuts; |
||||||
|
|
||||||
|
import com.jme3.asset.AssetManager; |
||||||
|
import com.jme3.gde.core.sceneexplorer.nodes.JmeNode; |
||||||
|
import com.jme3.gde.core.sceneexplorer.nodes.JmeSpatial; |
||||||
|
import com.jme3.gde.core.undoredo.AbstractUndoableSceneEdit; |
||||||
|
import com.jme3.gde.scenecomposer.SceneComposerToolController; |
||||||
|
import com.jme3.gde.scenecomposer.tools.PickManager; |
||||||
|
import com.jme3.input.KeyInput; |
||||||
|
import com.jme3.input.event.KeyInputEvent; |
||||||
|
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; |
||||||
|
import org.openide.util.Lookup; |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @author dokthar |
||||||
|
*/ |
||||||
|
public class RotateShortcut extends ShortcutTool { |
||||||
|
|
||||||
|
private Vector3f currentAxis; |
||||||
|
private StringBuilder numberBuilder; |
||||||
|
private Spatial spatial; |
||||||
|
private PickManager pickManager; |
||||||
|
private boolean pickEnabled; |
||||||
|
private Quaternion startRotation; |
||||||
|
private Quaternion finalRotation; |
||||||
|
|
||||||
|
@Override |
||||||
|
|
||||||
|
public boolean isActivableBy(KeyInputEvent kie) { |
||||||
|
return kie.getKeyCode() == KeyInput.KEY_R; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void cancel() { |
||||||
|
spatial.setLocalRotation(startRotation); |
||||||
|
terminate(); |
||||||
|
} |
||||||
|
|
||||||
|
private void apply() { |
||||||
|
actionPerformed(new RotateUndo(toolController.getSelectedSpatial(), startRotation, finalRotation)); |
||||||
|
terminate(); |
||||||
|
} |
||||||
|
|
||||||
|
private void init(Spatial selectedSpatial) { |
||||||
|
spatial = selectedSpatial; |
||||||
|
startRotation = spatial.getLocalRotation().clone(); |
||||||
|
currentAxis = Vector3f.UNIT_XYZ; |
||||||
|
pickManager = Lookup.getDefault().lookup(PickManager.class); |
||||||
|
pickEnabled = false; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void activate(AssetManager manager, Node toolNode, Node onTopToolNode, Spatial selectedSpatial, SceneComposerToolController toolController) { |
||||||
|
super.activate(manager, toolNode, onTopToolNode, selectedSpatial, toolController); //To change body of generated methods, choose Tools | Templates.
|
||||||
|
hideMarker(); |
||||||
|
numberBuilder = new StringBuilder(); |
||||||
|
if (selectedSpatial == null) { |
||||||
|
terminate(); |
||||||
|
} else { |
||||||
|
init(selectedSpatial); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void keyPressed(KeyInputEvent kie) { |
||||||
|
if (kie.isPressed()) { |
||||||
|
Lookup.getDefault().lookup(ShortcutManager.class).activateShortcut(kie); |
||||||
|
|
||||||
|
Vector3f axis = new Vector3f(); |
||||||
|
boolean axisChanged = ShortcutManager.checkAxisKey(kie, axis); |
||||||
|
if (axisChanged) { |
||||||
|
currentAxis = axis; |
||||||
|
} |
||||||
|
boolean numberChanged = ShortcutManager.checkNumberKey(kie, numberBuilder); |
||||||
|
boolean enterHit = ShortcutManager.checkEnterHit(kie); |
||||||
|
boolean escHit = ShortcutManager.checkEscHit(kie); |
||||||
|
|
||||||
|
if (escHit) { |
||||||
|
cancel(); |
||||||
|
} else if (enterHit) { |
||||||
|
apply(); |
||||||
|
} else if (axisChanged && pickEnabled) { |
||||||
|
pickEnabled = false; |
||||||
|
spatial.setLocalRotation(startRotation.clone()); |
||||||
|
} else if (axisChanged || numberChanged) { |
||||||
|
//update transformation
|
||||||
|
/* float number = ShortcutManager.getNumberkey(numberBuilder); |
||||||
|
Vector3f translation = currentAxis.mult(number); |
||||||
|
finalPosition = startPosition.add(translation); |
||||||
|
spatial.setLocalTranslation(finalPosition); |
||||||
|
*/ |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void actionPrimary(Vector2f screenCoord, boolean pressed, JmeNode rootNode, DataObject dataObject) { |
||||||
|
if (pressed) { |
||||||
|
apply(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void actionSecondary(Vector2f screenCoord, boolean pressed, JmeNode rootNode, DataObject dataObject) { |
||||||
|
if (pressed) { |
||||||
|
cancel(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void mouseMoved(Vector2f screenCoord, JmeNode rootNode, DataObject dataObject, JmeSpatial selectedSpatial) { |
||||||
|
|
||||||
|
if (!pickEnabled) { |
||||||
|
if (currentAxis.equals(Vector3f.UNIT_XYZ)) { |
||||||
|
pickManager.initiatePick(toolController.getSelectedSpatial(), camera.getRotation(), SceneComposerToolController.TransformationType.camera, camera, screenCoord); |
||||||
|
pickEnabled = true; |
||||||
|
} else if (currentAxis.equals(Vector3f.UNIT_X)) { |
||||||
|
pickManager.initiatePick(toolController.getSelectedSpatial(), PickManager.PLANE_YZ, getTransformType(), camera, screenCoord); |
||||||
|
pickEnabled = true; |
||||||
|
} else if (currentAxis.equals(Vector3f.UNIT_Y)) { |
||||||
|
pickManager.initiatePick(toolController.getSelectedSpatial(), PickManager.PLANE_XZ, getTransformType(), camera, screenCoord); |
||||||
|
pickEnabled = true; |
||||||
|
} else if (currentAxis.equals(Vector3f.UNIT_Z)) { |
||||||
|
pickManager.initiatePick(toolController.getSelectedSpatial(), PickManager.PLANE_XY, getTransformType(), camera, screenCoord); |
||||||
|
pickEnabled = true; |
||||||
|
} else { |
||||||
|
return; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (pickManager.updatePick(camera, screenCoord)) { |
||||||
|
|
||||||
|
Quaternion rotation = startRotation.mult(pickManager.getRotation(startRotation.inverse())); |
||||||
|
toolController.getSelectedSpatial().setLocalRotation(rotation); |
||||||
|
finalRotation = rotation; |
||||||
|
updateToolsTransformation(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void draggedPrimary(Vector2f screenCoord, boolean pressed, JmeNode rootNode, DataObject currentDataObject) { |
||||||
|
if (pressed) { |
||||||
|
apply(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void draggedSecondary(Vector2f screenCoord, boolean pressed, JmeNode rootNode, DataObject currentDataObject) { |
||||||
|
if (pressed) { |
||||||
|
cancel(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private class RotateUndo extends AbstractUndoableSceneEdit { |
||||||
|
|
||||||
|
private Spatial spatial; |
||||||
|
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); |
||||||
|
toolController.selectedSpatialTransformed(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void sceneRedo() { |
||||||
|
spatial.setLocalRotation(after); |
||||||
|
toolController.selectedSpatialTransformed(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,199 @@ |
|||||||
|
/* |
||||||
|
* To change this license header, choose License Headers in Project Properties. |
||||||
|
* To change this template file, choose Tools | Templates |
||||||
|
* and open the template in the editor. |
||||||
|
*/ |
||||||
|
package com.jme3.gde.scenecomposer.tools.shortcuts; |
||||||
|
|
||||||
|
import com.jme3.asset.AssetManager; |
||||||
|
import com.jme3.gde.core.sceneexplorer.nodes.JmeNode; |
||||||
|
import com.jme3.gde.core.sceneexplorer.nodes.JmeSpatial; |
||||||
|
import com.jme3.gde.core.undoredo.AbstractUndoableSceneEdit; |
||||||
|
import com.jme3.gde.scenecomposer.SceneComposerToolController; |
||||||
|
import com.jme3.gde.scenecomposer.tools.PickManager; |
||||||
|
import com.jme3.input.KeyInput; |
||||||
|
import com.jme3.input.event.KeyInputEvent; |
||||||
|
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; |
||||||
|
import org.openide.util.Lookup; |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @author dokthar |
||||||
|
*/ |
||||||
|
public class ScaleShortcut extends ShortcutTool { |
||||||
|
|
||||||
|
private Vector3f currentAxis; |
||||||
|
private StringBuilder numberBuilder; |
||||||
|
private Spatial spatial; |
||||||
|
private PickManager pickManager; |
||||||
|
private boolean pickEnabled; |
||||||
|
private Vector3f startScale; |
||||||
|
private Vector3f finalScale; |
||||||
|
|
||||||
|
@Override |
||||||
|
|
||||||
|
public boolean isActivableBy(KeyInputEvent kie) { |
||||||
|
return kie.getKeyCode() == KeyInput.KEY_S; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void cancel() { |
||||||
|
spatial.setLocalScale(startScale); |
||||||
|
terminate(); |
||||||
|
} |
||||||
|
|
||||||
|
private void apply() { |
||||||
|
actionPerformed(new ScaleUndo(toolController.getSelectedSpatial(), startScale, finalScale)); |
||||||
|
terminate(); |
||||||
|
} |
||||||
|
|
||||||
|
private void init(Spatial selectedSpatial) { |
||||||
|
spatial = selectedSpatial; |
||||||
|
startScale = spatial.getLocalScale().clone(); |
||||||
|
currentAxis = Vector3f.UNIT_XYZ; |
||||||
|
pickManager = Lookup.getDefault().lookup(PickManager.class); |
||||||
|
pickEnabled = false; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void activate(AssetManager manager, Node toolNode, Node onTopToolNode, Spatial selectedSpatial, SceneComposerToolController toolController) { |
||||||
|
super.activate(manager, toolNode, onTopToolNode, selectedSpatial, toolController); //To change body of generated methods, choose Tools | Templates.
|
||||||
|
hideMarker(); |
||||||
|
numberBuilder = new StringBuilder(); |
||||||
|
if (selectedSpatial == null) { |
||||||
|
terminate(); |
||||||
|
} else { |
||||||
|
init(selectedSpatial); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void keyPressed(KeyInputEvent kie) { |
||||||
|
if (kie.isPressed()) { |
||||||
|
Lookup.getDefault().lookup(ShortcutManager.class).activateShortcut(kie); |
||||||
|
|
||||||
|
Vector3f axis = new Vector3f(); |
||||||
|
boolean axisChanged = ShortcutManager.checkAxisKey(kie, axis); |
||||||
|
if (axisChanged) { |
||||||
|
currentAxis = axis; |
||||||
|
} |
||||||
|
boolean numberChanged = ShortcutManager.checkNumberKey(kie, numberBuilder); |
||||||
|
boolean enterHit = ShortcutManager.checkEnterHit(kie); |
||||||
|
boolean escHit = ShortcutManager.checkEscHit(kie); |
||||||
|
|
||||||
|
if (escHit) { |
||||||
|
cancel(); |
||||||
|
} else if (enterHit) { |
||||||
|
apply(); |
||||||
|
} else if (axisChanged && pickEnabled) { |
||||||
|
pickEnabled = false; |
||||||
|
} else if (axisChanged || numberChanged) { |
||||||
|
//update transformation
|
||||||
|
/* float number = ShortcutManager.getNumberkey(numberBuilder); |
||||||
|
Vector3f translation = currentAxis.mult(number); |
||||||
|
finalPosition = startPosition.add(translation); |
||||||
|
spatial.setLocalTranslation(finalPosition); |
||||||
|
*/ |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void actionPrimary(Vector2f screenCoord, boolean pressed, JmeNode rootNode, DataObject dataObject) { |
||||||
|
if (pressed) { |
||||||
|
apply(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void actionSecondary(Vector2f screenCoord, boolean pressed, JmeNode rootNode, DataObject dataObject) { |
||||||
|
if (pressed) { |
||||||
|
cancel(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void mouseMoved(Vector2f screenCoord, JmeNode rootNode, DataObject dataObject, JmeSpatial selectedSpatial) { |
||||||
|
|
||||||
|
if (!pickEnabled) { |
||||||
|
if (currentAxis.equals(Vector3f.UNIT_XYZ)) { |
||||||
|
pickManager.initiatePick(toolController.getSelectedSpatial(), camera.getRotation(), SceneComposerToolController.TransformationType.camera, camera, screenCoord); |
||||||
|
pickEnabled = true; |
||||||
|
} else if (currentAxis.equals(Vector3f.UNIT_X)) { |
||||||
|
pickManager.initiatePick(toolController.getSelectedSpatial(), PickManager.PLANE_XY, getTransformType(), camera, screenCoord); |
||||||
|
pickEnabled = true; |
||||||
|
} else if (currentAxis.equals(Vector3f.UNIT_Y)) { |
||||||
|
pickManager.initiatePick(toolController.getSelectedSpatial(), PickManager.PLANE_YZ, getTransformType(), camera, screenCoord); |
||||||
|
pickEnabled = true; |
||||||
|
} else if (currentAxis.equals(Vector3f.UNIT_Z)) { |
||||||
|
pickManager.initiatePick(toolController.getSelectedSpatial(), PickManager.PLANE_XZ, getTransformType(), camera, screenCoord); |
||||||
|
pickEnabled = true; |
||||||
|
} else { |
||||||
|
return; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (pickManager.updatePick(camera, screenCoord)) { |
||||||
|
Vector3f scale = startScale; |
||||||
|
if (currentAxis.equals(Vector3f.UNIT_XYZ)) { |
||||||
|
Vector3f constraintAxis = pickManager.getStartOffset().normalize(); |
||||||
|
float diff = pickManager.getTranslation(constraintAxis).dot(constraintAxis); |
||||||
|
diff *= 0.5f; |
||||||
|
scale = startScale.add(new Vector3f(diff, diff, diff)); |
||||||
|
} else { |
||||||
|
// Get the translation in the spatial Space
|
||||||
|
Quaternion worldToSpatial = toolController.getSelectedSpatial().getWorldRotation().inverse(); |
||||||
|
Vector3f diff = pickManager.getTranslation(worldToSpatial.mult(currentAxis)); |
||||||
|
diff.multLocal(0.5f); |
||||||
|
scale = startScale.add(diff); |
||||||
|
} |
||||||
|
finalScale = scale; |
||||||
|
toolController.getSelectedSpatial().setLocalScale(scale); |
||||||
|
updateToolsTransformation(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void draggedPrimary(Vector2f screenCoord, boolean pressed, JmeNode rootNode, DataObject currentDataObject) { |
||||||
|
if (pressed) { |
||||||
|
apply(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void draggedSecondary(Vector2f screenCoord, boolean pressed, JmeNode rootNode, DataObject currentDataObject) { |
||||||
|
if (pressed) { |
||||||
|
cancel(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private class ScaleUndo extends AbstractUndoableSceneEdit { |
||||||
|
|
||||||
|
private Spatial spatial; |
||||||
|
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); |
||||||
|
toolController.selectedSpatialTransformed(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void sceneRedo() { |
||||||
|
spatial.setLocalScale(after); |
||||||
|
toolController.selectedSpatialTransformed(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue