Explorar o código

SDK :
- Blender style rotation now rotates objects in world space and parent rotation are correctly taken into account.

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@9606 75d07b2b-3a1a-0410-a2c5-0572b91ccdca

rem..om %!s(int64=13) %!d(string=hai) anos
pai
achega
0aac9c4753

+ 17 - 26
jme3-scenecomposer/src/com/jme3/gde/scenecomposer/tools/SelectTool.java

@@ -166,6 +166,7 @@ public class SelectTool extends SceneEditTool {
         startScale = null;
         startMouseCoord = null;
         startSelectedCoord = null;
+        lastRotAngle = 0;
     }
 
     private void recordInitialState(Spatial selected) {
@@ -229,6 +230,7 @@ public class SelectTool extends SceneEditTool {
             actionPerformed(undo);
             toolController.updateSelection(null);// force a re-draw of the bbox shape
             toolController.updateSelection(selected);
+
         }
         clearState(false);
     }
@@ -286,42 +288,32 @@ public class SelectTool extends SceneEditTool {
     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) < rot.dot(MoveManager.XZ)) {
-                planRot = MoveManager.XY;
-            } else {
-                planRot = MoveManager.XZ;
-            }
-            moveManager.updatePlaneRotation(planRot);
+            checkMovePlane(MoveManager.XY, MoveManager.XZ);
             return true;
         } else if (kie.getKeyCode() == KeyInput.KEY_Y) {
             currentAxis = Vector3f.UNIT_Y;
-            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) < rot.dot(MoveManager.YZ)) {
-                planRot = MoveManager.XY;
-            } else {
-                planRot = MoveManager.YZ;
-            }
-            moveManager.updatePlaneRotation(planRot);
+            checkMovePlane(MoveManager.XY, MoveManager.YZ);
             return true;
         } else if (kie.getKeyCode() == KeyInput.KEY_Z) {
             currentAxis = Vector3f.UNIT_Z;
+            checkMovePlane(MoveManager.XZ, MoveManager.YZ);
+            return true;
+        }
+        return false;
+    }
+
+    private void checkMovePlane(Quaternion rot1, Quaternion rot2) {
+        if (currentState == State.translate) {
             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.XZ) < rot.dot(MoveManager.YZ)) {
-                planRot = MoveManager.XZ;
+            if (rot.dot(rot1) < rot.dot(rot2)) {
+                planRot = rot1;
             } else {
-                planRot = MoveManager.YZ;
+                planRot = rot2;
             }
             moveManager.updatePlaneRotation(planRot);
-            return true;
         }
-        return false;
     }
 
     private boolean checkNumberKey(KeyInputEvent kie) {
@@ -619,10 +611,9 @@ public class SelectTool extends SceneEditTool {
 
         Quaternion rotate = new Quaternion();
         if (axis != Vector3f.UNIT_XYZ) {
-            rotate = rotate.fromAngleAxis(newRotAngle, axis);
+            rotate = rotate.fromAngleAxis(newRotAngle, selected.getWorldRotation().inverse().mult(axis));
         } else {
-            //Vector3f screen = getCamera().getLocation().subtract(selected.getWorldTranslation()).normalize();
-            rotate = rotate.fromAngleAxis(newRotAngle, getCamera().getDirection());
+            rotate = rotate.fromAngleAxis(newRotAngle, selected.getWorldRotation().inverse().mult(getCamera().getDirection().mult(-1).normalizeLocal()));
         }
         selected.setLocalRotation(selected.getLocalRotation().mult(rotate));