Browse Source

grid and scene snapping

rickard 3 years ago
parent
commit
ba647bb142

+ 25 - 0
jme3-scenecomposer/src/com/jme3/gde/scenecomposer/tools/MoveTool.java

@@ -18,6 +18,10 @@ import com.jme3.scene.Node;
 import com.jme3.scene.Spatial;
 import org.openide.loaders.DataObject;
 import org.openide.util.Lookup;
+import com.jme3.math.Ray;
+import com.jme3.math.FastMath;
+import com.jme3.collision.CollisionResults;
+import com.jme3.collision.CollisionResult;
 
 /**
  * Move an object. When created, it generates a quad that will lie along a plane
@@ -141,6 +145,13 @@ public class MoveTool extends SceneEditTool {
             } else {
                 position = startPosition.add(diff);
             }
+
+            if(toolController.isSnapToScene()){
+                snapToScene(position);
+            }
+            if(toolController.isSnapToGrid()){
+                position = new Vector3f(FastMath.floor(position.x), FastMath.floor(position.y), FastMath.floor(position.z));
+            }
             lastPosition = position;
             toolController.getSelectedSpatial().setLocalTranslation(position);
             updateToolsTransformation();
@@ -165,6 +176,19 @@ public class MoveTool extends SceneEditTool {
         }
     }
 
+    private void snapToScene(Vector3f position){
+        Ray ray = new Ray(position, Vector3f.UNIT_Y.negate());
+        CollisionResults collisionResults = new CollisionResults();
+        Node root = toolController.getRootNode().getLookup().lookup(Node.class);
+        root.collideWith(ray, collisionResults);
+        for(CollisionResult r : collisionResults){
+            if(r.getGeometry() != toolController.getSelectedSpatial()){
+                position.y = r.getContactPoint().y;
+                break;
+            }
+        }
+    }
+
     protected class MoveUndo extends AbstractUndoableSceneEdit {
 
         private Spatial spatial;
@@ -210,4 +234,5 @@ public class MoveTool extends SceneEditTool {
             this.after.set(after);
         }
     }
+
 }