Browse Source

Merge pull request #260 from Dokthar/scenecomposer/master

SDK / scenecomposer : axis pick for move and scale tool
normen 10 years ago
parent
commit
7e65651f11

+ 6 - 5
jme3-scenecomposer/src/com/jme3/gde/scenecomposer/SceneEditTool.java

@@ -285,7 +285,7 @@ public abstract class SceneEditTool {
      * 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) {
@@ -336,7 +336,7 @@ public abstract class SceneEditTool {
         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);
@@ -347,7 +347,7 @@ public abstract class SceneEditTool {
 
     /**
      * 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);
@@ -355,12 +355,12 @@ public abstract class SceneEditTool {
 
     /**
      * 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;
         }
@@ -453,6 +453,7 @@ public abstract class SceneEditTool {
 //        axis.attachChild(quadYZ);
 
         axis.setModelBound(new BoundingBox());
+        axis.updateModelBound();
         return axis;
     }
 

+ 27 - 15
jme3-scenecomposer/src/com/jme3/gde/scenecomposer/tools/MoveTool.java

@@ -27,7 +27,8 @@ import org.openide.util.Lookup;
  */
 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;
 
@@ -48,11 +49,12 @@ public class MoveTool extends SceneEditTool {
     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();
         }
     }
@@ -63,20 +65,21 @@ public class MoveTool extends SceneEditTool {
 
     @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;
@@ -89,21 +92,30 @@ public class MoveTool extends SceneEditTool {
             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();

+ 39 - 28
jme3-scenecomposer/src/com/jme3/gde/scenecomposer/tools/ScaleTool.java

@@ -21,107 +21,118 @@ import org.openide.loaders.DataObject;
  * @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);
@@ -133,6 +144,6 @@ public class ScaleTool extends SceneEditTool {
             spatial.setLocalScale(after);
             toolController.selectedSpatialTransformed();
         }
-        
+
     }
 }