Bladeren bron

Merge branch 'master' into 278-raceway

rickard 3 jaren geleden
bovenliggende
commit
cbb76e1696
23 gewijzigde bestanden met toevoegingen van 349 en 358 verwijderingen
  1. 2 8
      .github/workflows/gradle.yml
  2. 0 0
      BasicGameTemplate/assets/Filters/.keep
  3. 26 84
      build.gradle
  4. 0 35
      build_engine.sh
  5. 0 21
      fix_engine.sh
  6. 1 1
      jme3-blender/src/com/jme3/gde/blender/GLTFDataObject.java
  7. BIN
      jme3-blender/src/com/jme3/gde/blender/glTF.png
  8. BIN
      jme3-blender/src/com/jme3/gde/blender/glTF24.png
  9. BIN
      jme3-blender/src/com/jme3/gde/blender/glTF48.png
  10. 1 1
      jme3-codepalette/src/com/jme3/gde/codepalette/layer.xml
  11. 2 0
      jme3-core/src/com/jme3/gde/core/assets/ExternalChangeScanner.java
  12. 30 0
      jme3-core/src/com/jme3/gde/core/util/SpatialUtil.java
  13. 19 16
      jme3-core/src/com/jme3/gde/core/util/notify/NotifyUtil.java
  14. 98 0
      jme3-scenecomposer/src/com/jme3/gde/scenecomposer/SceneComposerToolController.java
  15. 1 1
      jme3-scenecomposer/src/com/jme3/gde/scenecomposer/gizmo/light/DirectionalLightGizmo.java
  16. 2 2
      jme3-scenecomposer/src/com/jme3/gde/scenecomposer/tools/MoveTool.java
  17. 162 163
      jme3-scenecomposer/src/com/jme3/gde/scenecomposer/tools/RotateTool.java
  18. 2 3
      jme3-scenecomposer/src/com/jme3/gde/scenecomposer/tools/ScaleTool.java
  19. 1 2
      jme3-scenecomposer/src/com/jme3/gde/scenecomposer/tools/shortcuts/MoveShortcut.java
  20. 1 2
      jme3-scenecomposer/src/com/jme3/gde/scenecomposer/tools/shortcuts/RotateShortcut.java
  21. 1 2
      jme3-scenecomposer/src/com/jme3/gde/scenecomposer/tools/shortcuts/ScaleShortcut.java
  22. 0 16
      patches/jbullet_dependencies_version_missing.diff
  23. 0 1
      settings.gradle

+ 2 - 8
.github/workflows/gradle.yml

@@ -17,14 +17,8 @@ jobs:
       with:
         java-version: 11
 
-    - name: Grant execute permission for the scripts
-      run: chmod +x gradlew *.sh
-      
-    - name: Download and build the Engine
-      run: ./build_engine.sh
-      
-    - name: Fix the Engine
-      run: ./fix_engine.sh
+    - name: Grant execute permission for gradle
+      run: chmod +x gradlew
       
     - name: Build the SDK
       run: ./gradlew buildSdk

+ 0 - 0
BasicGameTemplate/assets/Filters/.keep


+ 26 - 84
build.gradle

@@ -14,63 +14,17 @@ if (!hasProperty('mainClass')) {
 }
 
 repositories {
-    mavenLocal()
-    jcenter {
-        url "https://jcenter.bintray.com/"
-    }
-    mavenCentral()
-    maven {
-        url "http://updates.jmonkeyengine.org/maven/"
-    }
     maven {
         url "http://nifty-gui.sourceforge.net/nifty-maven-repo/"
     }
     maven { url "https://jitpack.io" }
-
-    // See Engine Commit caf91c47df2e5687b3e9ecf2009ee22014bf4ac1
-    flatDir {
-        dirs rootProject.file('lib')
+    maven {
+        url "https://maven.google.com/"
     }
+    mavenCentral()
+    jcenter() // because of 'com.simsilica:sim-math:1.4.1'
 }
 
-/*if (System.getenv('TRAVIS') != null) {
-    if (System.env.TRAVIS_TAG != null && System.env.TRAVIS_TAG != "") { // Strangely it has to be both, because it's sometimes set as TRAVIS_TAG="" when we're in travis but no tag is set
-        // v3.3.0-stable-sdk1 becomes 3.3.0-stable
-        // Intentionally not using lastIndexOf here, we want the second "-".
-        ext.jmeEngineVersion = System.env.TRAVIS_TAG.substring(1, System.env.TRAVIS_TAG.indexOf("-", System.env.TRAVIS_TAG.indexOf("-") + 1));
-    } else {
-        if (System.env.TRAVIS_PULL_REQUEST == null || System.env.TRAVIS_PULL_REQUEST == "" || System.env.TRAVIS_PULL_REQUEST == "false") {
-			if (System.env.TRAVIS_BRANCH == "master") {
-				ext.jmeEngineVersion = "3.3.0-SNAPSHOT" // Manually update
-			} else {
-				ext.jmeEngineVersion = "3.3.0-" + System.env.TRAVIS_BRANCH + "-SNAPSHOT" // Manually update
-			}
-        } else {
-            ext.jmeEngineVersion = "3.3.0-" + System.env.TRAVIS_PULL_REQUEST_BRANCH + "-pr-" + System.env.TRAVIS_PULL_REQUEST + "-SNAPSHOT"
-        }
-    }
-} else {
-	new ByteArrayOutputStream().withStream { os ->
-		def result = exec {
-			executable = 'git'
-			args = ['rev-parse', '--abbrev-ref', 'HEAD'];
-			standardOutput = os
-		}
-		ext.branch = os.toString().trim()
-	}
-	
-	// If the Branch isn't master, specify the branch name.
-	// @TODO: One could use the same technique like the engine (grgit?)
-	if (ext.branch == "master") {
-		ext.branchSpec = ""
-	} else {
-		ext.branchSpec = "-" + ext.branch;
-	}
-	
-	// This is the engine version that will be used per default on every regular commit
-	ext.jmeEngineVersion = "3.3.0" + ext.branchSpec + "-SNAPSHOT"
-}*/
-
 configurations {
     corelibs
     optlibs
@@ -84,50 +38,38 @@ dependencies {
     corelibs dep("com.badlogicgames.gdx:gdx-ai:1.8.1", true, true)
     corelibs dep("javax.help:javahelp:2.0.05", false, false)
 
-    corelibs dep("org.jmonkeyengine:jme3-core", false, false)
-    corelibs dep("org.jmonkeyengine:jme3-desktop", false, false)
-    corelibs dep("org.jmonkeyengine:jme3-lwjgl", false, false)
-    corelibs dep("org.jmonkeyengine:jme3-effects", false, false)
-    corelibs dep("org.jmonkeyengine:jme3-blender", false, false)
-
-    corelibs dep("org.jmonkeyengine:jme3-bullet", false, false)
-    corelibs dep("org.jmonkeyengine:jme3-bullet-native", false, false)
+    corelibs dep("org.jmonkeyengine:jme3-core:3.4.0-stable", false, false)
+    corelibs dep("org.jmonkeyengine:jme3-desktop:3.4.0-stable", false, false)
+    corelibs dep("org.jmonkeyengine:jme3-lwjgl:3.4.0-stable", false, false)
+    corelibs dep("org.jmonkeyengine:jme3-effects:3.4.0-stable", false, false)
+    corelibs dep("org.jmonkeyengine:jme3-blender:3.3.2-stable", false, false) // Pin Pointed until jme3-blender has a dedicated release or support is phased out.
+    optlibs dep("com.github.stephengold:Minie:4.6.0", false, false) // replacement for bullet-native
     corelibs dep(fileTree("lib"), false, false)
-    corelibs dep("org.jmonkeyengine:jme3-jogg", false, false)
-
-    corelibs dep("org.jmonkeyengine:jme3-networking", false, false)
-    corelibs dep("org.jmonkeyengine:jme3-niftygui", false, false)
-    corelibs dep("org.jmonkeyengine:jme3-plugins", false, false)
-    corelibs dep("org.jmonkeyengine:jme3-terrain", false, false)
-
-    optlibs dep("org.jmonkeyengine:jme3-jbullet", false, false)
-    optlibs dep("org.jmonkeyengine:jme3-android", false, false)
-    optlibs dep("org.jmonkeyengine:jme3-ios", false, false)
-    optlibs dep("org.jmonkeyengine:jme3-android-native", false, false)
-    optlibs dep("org.jmonkeyengine:jme3-lwjgl3", false, false)
-    optlibs dep("com.github.stephengold:Heart:6.0.0", false, false)
-    optlibs dep("com.github.stephengold:Minie:3.0.0", false, false)
-    optlibs dep("com.github.stephengold:Wes:0.6.0", false, false)
-    testdatalibs dep("org.jmonkeyengine:jme3-testdata", false, false)
-
-    examplelibs dep("org.jmonkeyengine:jme3-examples", false, false)
-
+    corelibs dep("org.jmonkeyengine:jme3-jogg:3.4.0-stable", true, true)
+
+    corelibs dep("org.jmonkeyengine:jme3-networking:3.4.0-stable", false, false)
+    corelibs dep("org.jmonkeyengine:jme3-niftygui:3.4.0-stable", false, false)
+    corelibs dep("org.jmonkeyengine:jme3-plugins:3.4.0-stable", false, false)
+    corelibs dep("org.jmonkeyengine:jme3-terrain:3.4.0-stable", false, false)
+
+    optlibs dep("org.jmonkeyengine:jme3-jbullet:3.4.0-stable", false, false)
+    optlibs dep("org.jmonkeyengine:jme3-android:3.4.0-stable", false, false)
+    optlibs dep("org.jmonkeyengine:jme3-ios:3.4.0-stable", false, false)
+    optlibs dep("org.jmonkeyengine:jme3-android-native:3.4.0-stable", false, false)
+    optlibs dep("org.jmonkeyengine:jme3-lwjgl3:3.4.0-stable", false, false)
+    optlibs dep("com.github.stephengold:Heart:7.1.0", false, false)
+    optlibs dep("com.github.stephengold:Wes:0.6.7", false, false)
+    testdatalibs dep("org.jmonkeyengine:jme3-testdata:3.4.0-stable", false, false)
+    examplelibs dep("org.jmonkeyengine:jme3-examples:3.4.0-stable", false, false)
 }
 
 def dep(coords, javadoc = false, sources = false) {
-
     def result = [dependencies.create(coords)]
-
     if (javadoc) result << dependencies.create("$coords:javadoc")
-
     if (sources) result << dependencies.create("$coords:sources")
-
     result
-
 }
 
-
-
 artifacts {
     //    jar null
 }

+ 0 - 35
build_engine.sh

@@ -1,35 +0,0 @@
-#!/bin/sh
-# This Shell Script will build and use the latest jMonkeyEngine git version, so there might be some undiscovered engine bugs, watch out!
-# Also if you want to revert to releases and bintray builds, you need to uninstall them from your local maven repo...
-
-if [ ! -d "engine" ]; then
-    echo "Downloading the Engine, this may take some time"
-    if [ "x$TRAVIS" != "x" ] && [ "x$TRAVIS_TAG" != "x" ]; then
-        # Extract the engine version from the sdk branch tag.
-        git clone -b $(echo "$TRAVIS_TAG" | sed -n 's/\(v.\+\)-sdk.\+/\1/p') --single-branch --depth 10 https://github.com/jMonkeyEngine/jMonkeyEngine/ engine # single-branch requires git > 1.7.10, if you see an error, just leave it out.
-    else
-        git clone -b master --single-branch --depth 10 https://github.com/jMonkeyEngine/jMonkeyEngine/ engine # single-branch requires git > 1.7.10, if you see an error, just leave it out.
-    fi
-    cd engine
-else
-    echo "Engine already cloned, pulling updates."
-    cd engine
-    git pull
-fi
-# git checkout tags/v3.1.0-beta2 # To use this, leave out depth and change -b to a branch.
-
-#echo "Patching the Engine...."
-#patch -s -N -p 1 < ../patches/FixHWSkinningSerialization.diff
-
-# Remark: We don't build the engine from here anymore but instead use https://docs.gradle.org/current/userguide/composite_builds.html,
-# that way we don't have to care about versioning and don't spam the user's mavenLocal Repo. Also you only need this script really to
-# download the engine. Nothing a windows user couldn't do by hand.
-
-# Until https://github.com/jMonkeyEngine/jmonkeyengine/issues/1260 is solved, prebuild the engine manually
-echo "Prebuilding the engine to ensure native libraries are unzipped"
-./gradlew -PbuildJavaDoc=true build assemble
-
-#echo "Building the Engine and installing them to your local maven repo...."
-# ./gradlew -PbuildJavaDoc=true install # Depends on jarJavadoc, jarSourcecode, assemble, dist etc.
-
-cd ../

+ 0 - 21
fix_engine.sh

@@ -1,21 +0,0 @@
-#!/bin/bash
-sdk=`pwd`
-
-#echo "Patching the jme3-jbullet POM file"
-#pushd ~/.m2/repository/org/jmonkeyengine/jme3-jbullet/ > /dev/null
-#for d in *; do
-#  if [ -d "$d" ]; then
-#    pushd $d > /dev/null
-#    mv jme3-jbullet-$d.pom jbullet.pom
-#    patch < "$sdk/patches/jbullet_dependencies_version_missing.diff"
-#    mv jbullet.pom jme3-jbullet-$d.pom
-#    popd > /dev/null
-#  fi
-#done
-#popd > /dev/null
-
-echo "Installing our local jbullet.jar and stack-alloc.jar into the maven local repository"
-pushd lib > /dev/null
-mvn install:install-file -Dfile=jbullet.jar -DgroupId=jbullet -DartifactId=jbullet -Dversion=0.0.1 -Dpackaging=jar
-mvn install:install-file -Dfile=stack-alloc.jar -DgroupId=stack-alloc -DartifactId=stack-alloc -Dversion=0.0.1 -Dpackaging=jar
-popd > /dev/null

+ 1 - 1
jme3-blender/src/com/jme3/gde/blender/GLTFDataObject.java

@@ -58,7 +58,7 @@ import org.openide.util.NbBundle.Messages;
 )
 @DataObject.Registration(
     mimeType = "model/gltf+json", 
-    iconBase = "com/jme3/gde/blender/blender.png",
+    iconBase = "com/jme3/gde/blender/glTF.png",
     //iconBase = "com/jme3/gde/blender/glTF_100px_June16.png",
     displayName="#LBL_GLTF_LOADER",
     position=300

BIN
jme3-blender/src/com/jme3/gde/blender/glTF.png


BIN
jme3-blender/src/com/jme3/gde/blender/glTF24.png


BIN
jme3-blender/src/com/jme3/gde/blender/glTF48.png


+ 1 - 1
jme3-codepalette/src/com/jme3/gde/codepalette/layer.xml

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.1//EN" "http://www.netbeans.org/dtds/filesystem-1_1.dtd">
+<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.2//EN" "http://www.netbeans.org/dtds/filesystem-1_2.dtd">
 <filesystem>
     <folder name="JavaPalette">
         <folder name="JME Material">

+ 2 - 0
jme3-core/src/com/jme3/gde/core/assets/ExternalChangeScanner.java

@@ -128,7 +128,9 @@ public class ExternalChangeScanner implements AssetDataPropertyChangeListener, F
         try {
             Spatial original = loadOriginalSpatial();
             Spatial spat = (Spatial) assetDataObject.loadAsset();
+
             SpatialUtil.updateMeshDataFromOriginal(spat, original);
+            SpatialUtil.updateMaterialDataFromOriginal(spat, original);
             if (SpatialUtil.hasAnimations(original)) {
                 NotifyDescriptor.Confirmation mesg = new NotifyDescriptor.Confirmation("Model appears to have animations, try to import as well?\nCurrently this will unlink attachment Nodes and clear\nadded effects tracks.",
                         "Animations Available",

+ 30 - 0
jme3-core/src/com/jme3/gde/core/util/SpatialUtil.java

@@ -220,6 +220,32 @@ public class SpatialUtil {
         });
     }
 
+    /**
+     * Updates material of existing objects from an original file.
+     *
+     * @param root
+     * @param original
+     */
+    public static void updateMaterialDataFromOriginal(final Spatial root,
+                                                      final Spatial original) {
+        //loop through original to also find new geometry
+        original.depthFirstTraversal(new SceneGraphVisitorAdapter() {
+            @Override
+            public void visit(Geometry geom) {
+                //will always return same class type as 2nd param, so casting is safe
+                Geometry spat = (Geometry) findTaggedSpatial(root, geom);
+                if (spat != null && spat.getMaterial() != null
+                        && geom.getMaterial() != null
+                        && !spat.getMaterial().equals(geom.getMaterial())) {
+                    spat.setMaterial(geom.getMaterial().clone());
+                    logger.log(LogLevel.USERINFO,
+                            "Updated material for Geometry {0}", geom.getName()
+                    );
+                }
+            }
+        });
+    }
+
     /**
      * Adds a leaf to a spatial, including all nonexisting parents.
      *
@@ -241,6 +267,10 @@ public class SpatialUtil {
                 logger.log(Level.INFO, "Attaching {0} to {1} in root {2} to add leaf {3}", new Object[]{s, other, root, leaf});
                 //set original path data to leaf and new parents
                 for (Spatial spt = leaf; spt != parent; spt = spt.getParent()) {
+                    if (spt == null) {
+                        // this is to avoid a crash when changing mesh names
+                        return;
+                    }
                     spt.setUserData(ORIGINAL_NAME, spt.getName());
                     spt.setUserData(ORIGINAL_PATH, getSpatialPath(spt));
                     spt = spt.getParent();

+ 19 - 16
jme3-core/src/com/jme3/gde/core/util/notify/NotifyUtil.java

@@ -1,22 +1,22 @@
 /*
  * Copyright (c) 2003-2012 jMonkeyEngine
  * All rights reserved.
- * 
+ *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
  * met:
- * 
+ *
  * * Redistributions of source code must retain the above copyright
  *   notice, this list of conditions and the following disclaimer.
- * 
+ *
  * * Redistributions in binary form must reproduce the above copyright
  *   notice, this list of conditions and the following disclaimer in the
  *   documentation and/or other materials provided with the distribution.
- * 
+ *
  * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
  *   may be used to endorse or promote products derived from this software
  *   without specific prior written permission.
- * 
+ *
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
@@ -35,17 +35,24 @@ import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.io.PrintWriter;
 import java.io.StringWriter;
-import javax.swing.Timer;
 import org.openide.DialogDisplayer;
 import org.openide.NotifyDescriptor;
 import org.openide.awt.Notification;
 import org.openide.awt.NotificationDisplayer;
+import org.openide.util.RequestProcessor;
 
 /**
  *
  * @author qbeukes.blogspot.com, used by metalklesk
  */
 public class NotifyUtil {
+    
+    /**
+     * Own request processor (thread pool) for NotifyUtil handling
+     * background tasks
+     */
+    private static final RequestProcessor REQUEST_PROCESSOR =
+            new RequestProcessor("Notification processor", 1);
 
     private NotifyUtil() {
     }
@@ -60,19 +67,15 @@ public class NotifyUtil {
         if (title == null) {
             title = "null";
         }
-        final Notification n = (Notification) NotificationDisplayer.getDefault().notify(title, type.getIcon(), message, actionListener);
+        final Notification n = NotificationDisplayer.getDefault().
+                notify(title, type.getIcon(), message, actionListener);
         if (timeout > 0) {
-            java.awt.EventQueue.invokeLater(new Runnable() {
+            REQUEST_PROCESSOR.post(new Runnable() {
+                @Override
                 public void run() {
-                    Timer timer = new Timer(timeout, new ActionListener() {
-                        public void actionPerformed(ActionEvent e) {
-                            n.clear();
-                        }
-                    });
-                    timer.setRepeats(false);
-                    timer.start();
+                    n.clear();
                 }
-            });
+            }, timeout);
         }
         return n;
     }

+ 98 - 0
jme3-scenecomposer/src/com/jme3/gde/scenecomposer/SceneComposerToolController.java

@@ -5,6 +5,8 @@
 package com.jme3.gde.scenecomposer;
 
 import com.jme3.asset.AssetManager;
+import com.jme3.collision.CollisionResult;
+import com.jme3.collision.CollisionResults;
 import com.jme3.gde.core.scene.SceneApplication;
 import com.jme3.gde.core.scene.controller.SceneToolController;
 import com.jme3.gde.core.sceneexplorer.nodes.AbstractSceneExplorerNode;
@@ -12,7 +14,11 @@ import com.jme3.gde.core.sceneexplorer.nodes.JmeNode;
 import com.jme3.gde.scenecomposer.gizmo.GizmoFactory;
 import com.jme3.gde.scenecomposer.tools.shortcuts.ShortcutManager;
 import com.jme3.input.event.KeyInputEvent;
+import com.jme3.math.FastMath;
+import com.jme3.math.Quaternion;
+import com.jme3.math.Ray;
 import com.jme3.math.Vector2f;
+import com.jme3.math.Vector3f;
 import com.jme3.renderer.Camera;
 import com.jme3.renderer.RenderManager;
 import com.jme3.renderer.ViewPort;
@@ -44,6 +50,8 @@ public class SceneComposerToolController extends SceneToolController {
     private boolean selectTerrain = false;
     private boolean selectGeometries = false;
     private TransformationType transformationType = TransformationType.local;
+    
+    private final float fifteenDegs = FastMath.HALF_PI / 6f;
 
     public enum TransformationType {
         local, global, camera
@@ -384,5 +392,95 @@ public class SceneComposerToolController extends SceneToolController {
     public JmeNode getRootNode() {
         return rootNode;
     }
+    
+    /**
+     * Update the selected spatial with translation from user input
+     * 
+     * @param translation absolute translation
+     * @param constraints axes affected
+     */
+    public void updateSelectedTranslation(final Vector3f translation, 
+            final Vector3f constraints) {
+        if (isSnapToScene()) {
+            translation.set(snapToScene(translation));
+        }
+        if (isSnapToGrid()) {
+            if (constraints.x != 0f) {
+                translation.setX((int) translation.x);
+            }
+            if (constraints.y != 0f) {
+                translation.setY((int) translation.y);
+            }
+            if (constraints.z != 0f) {
+                translation.setZ((int) translation.z);
+            }
+        }
+        selected.setLocalTranslation(translation);
+    }
+    
+    /**
+     * Update the selected spatial with rotation from user input
+     * 
+     * @param rotation absolute rotation
+     * @param constraints axes affected
+     */
+    public void updateSelectedRotation(final Quaternion rotation, 
+            final Vector3f constraints) {
+        if (isSnapToGrid()) {
+            final float[] angles = new float[3];
+            rotation.toAngles(angles);
+            
+            if (constraints.y != 0f) {
+                angles[1] = Math.round(angles[1] / FastMath.HALF_PI) 
+                        * fifteenDegs;
+            }
+            if (constraints.x != 0f) {
+                angles[0] = Math.round(angles[0] / FastMath.HALF_PI) 
+                        * fifteenDegs;
+            }
+            if (constraints.z != 0f) {
+                angles[2] = Math.round(angles[2] / FastMath.HALF_PI) 
+                        * fifteenDegs;
+            }
+            rotation.fromAngles(angles);
+        }
+        selected.setLocalRotation(rotation);
+    }
+    
+    /**
+     * Update the selected spatial with scale from user input
+     * 
+     * @param scale absolute scale
+     * @param constraints axes affected 
+     */
+    public void updateSelectedScale(final Vector3f scale, 
+            final Vector3f constraints) {
+        if (isSnapToGrid()) {
+            if (constraints.x != 0f) {
+                scale.setX((int) Math.max(scale.x, 1));
+            }
+            if (constraints.y != 0f) {
+                scale.setY((int) Math.max(scale.y, 1));
+            }
+            if (constraints.z != 0f) {
+                scale.setZ((int) Math.max(scale.z, 1));
+            }
+        }
+        selected.setLocalScale(scale);
+    }
+
+    private Vector3f snapToScene(final Vector3f position) {
+        final Ray ray = new Ray(position, Vector3f.UNIT_Y.negate());
+        final CollisionResults collisionResults = new CollisionResults();
+        final Node root = getRootNode().getLookup().lookup(Node.class);
+        root.collideWith(ray, collisionResults);
+        for (CollisionResult r : collisionResults) {
+            if (r.getGeometry() != selected) {
+                position.y = r.getContactPoint().y;
+                break;
+            }
+        }
+        return position;
+    }
 
 }

+ 1 - 1
jme3-scenecomposer/src/com/jme3/gde/scenecomposer/gizmo/light/DirectionalLightGizmo.java

@@ -76,7 +76,7 @@ public class DirectionalLightGizmo extends NodeCallback implements DirectionalLi
 
     @Override
     public void onRotation(Quaternion oldRotation, Quaternion newRotation) {
-        light.setDirection(newRotation.mult(initialDirection));
+        light.setDirection(newRotation.mult(Vector3f.UNIT_Y, initialDirection));
         jmeLight.setValue("direction", light.getDirection());
     }
     

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

@@ -8,7 +8,6 @@ import com.jme3.asset.AssetManager;
 import com.jme3.bullet.control.CharacterControl;
 import com.jme3.bullet.control.RigidBodyControl;
 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.SceneEditTool;
@@ -142,7 +141,7 @@ public class MoveTool extends SceneEditTool {
                 position = startPosition.add(diff);
             }
             lastPosition = position;
-            toolController.getSelectedSpatial().setLocalTranslation(position);
+            toolController.updateSelectedTranslation(position, pickedMarker);
             updateToolsTransformation();
         }
     }
@@ -210,4 +209,5 @@ public class MoveTool extends SceneEditTool {
             this.after.set(after);
         }
     }
+
 }

+ 162 - 163
jme3-scenecomposer/src/com/jme3/gde/scenecomposer/tools/RotateTool.java

@@ -1,163 +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.sceneexplorer.nodes.JmeSpatial;
-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;
-import org.openide.util.Lookup;
-
-/**
- *
- * @author kbender
- */
-public class RotateTool extends SceneEditTool {
-
-    private Vector3f pickedMarker;
-    private Quaternion startRotate;
-    private Quaternion startWorldRotate;
-    private Quaternion lastRotate;
-    private boolean wasDragging = false;
-    private PickManager pickManager;
-
-    public RotateTool() {
-        axisPickType = SceneEditTool.AxisMarkerPickType.planeOnly;
-        setOverrideCameraControl(true);
-    }
-
-    @Override
-    public void activate(AssetManager manager, Node toolNode, Node onTopToolNode, Spatial selectedSpatial, SceneComposerToolController toolController) {
-        super.activate(manager, toolNode, onTopToolNode, selectedSpatial, toolController);
-        pickManager = Lookup.getDefault().lookup(PickManager.class);
-        displayCircles();
-    }
-
-    @Override
-    public void actionPrimary(Vector2f screenCoord, boolean pressed, JmeNode rootNode, DataObject dataObject) {
-        if (!pressed) {
-            setDefaultAxisMarkerColors();
-            pickedMarker = null; // mouse released, reset selection
-            if (wasDragging) {
-                actionPerformed(new RotateUndo(toolController.getSelectedSpatial(), startRotate, lastRotate));
-                wasDragging = false;
-            }
-            pickManager.reset();
-        } else {
-            if (toolController.getSelectedSpatial() == null) {
-                return;
-            }
-
-            if (pickedMarker == null) {
-                pickedMarker = pickAxisMarker(camera, screenCoord, axisPickType);
-                if (pickedMarker == null) {
-                    return;
-                }
-
-                if (pickedMarker.equals(QUAD_XY)) {
-                    pickManager.initiatePick(toolController.getSelectedSpatial(), PickManager.PLANE_XY, getTransformType(), camera, screenCoord);
-                } else if (pickedMarker.equals(QUAD_XZ)) {
-                    pickManager.initiatePick(toolController.getSelectedSpatial(), PickManager.PLANE_XZ, getTransformType(), camera, screenCoord);
-                } else if (pickedMarker.equals(QUAD_YZ)) {
-                    pickManager.initiatePick(toolController.getSelectedSpatial(), PickManager.PLANE_YZ, getTransformType(), camera, screenCoord);
-                }
-                startRotate = toolController.getSelectedSpatial().getLocalRotation().clone();
-                startWorldRotate = toolController.getSelectedSpatial().getWorldRotation().clone();
-                wasDragging = true;
-            }
-        }
-    }
-
-    @Override
-    public void actionSecondary(Vector2f screenCoord, boolean pressed, JmeNode rootNode, DataObject dataObject) {
-        if (pressed) {
-            cancel();
-        }
-    }
-
-    @Override
-    public void mouseMoved(Vector2f screenCoord, JmeNode rootNode, DataObject currentDataObject) {
-        if (pickedMarker == null) {
-            highlightAxisMarker(camera, screenCoord, axisPickType);
-        } else {
-            pickedMarker = null;
-            pickManager.reset();
-        }
-    }
-
-    @Override
-    public void draggedPrimary(Vector2f screenCoord, boolean pressed, JmeNode rootNode, DataObject currentDataObject) {
-        if (!pressed) {
-            setDefaultAxisMarkerColors();
-            pickedMarker = null; // mouse released, reset selection
-
-            if (wasDragging) {
-                actionPerformed(new RotateUndo(toolController.getSelectedSpatial(), startRotate, lastRotate));
-                wasDragging = false;
-            }
-            pickManager.reset();
-        } else if (wasDragging) {
-            if (!pickManager.updatePick(camera, screenCoord)) {
-                return;
-            }
-
-            if (pickedMarker.equals(QUAD_XY) || pickedMarker.equals(QUAD_XZ) || pickedMarker.equals(QUAD_YZ)) {
-                Quaternion rotation = startRotate.mult(pickManager.getRotation(startWorldRotate.inverse()));
-                toolController.getSelectedSpatial().setLocalRotation(rotation);
-                lastRotate = rotation;
-            }
-            updateToolsTransformation();
-        }
-    }
-
-    @Override
-    public void draggedSecondary(Vector2f screenCoord, boolean pressed, JmeNode rootNode, DataObject currentDataObject) {
-        if (pressed) {
-            cancel();
-        }
-    }
-
-    private void cancel() {
-        if (wasDragging) {
-            wasDragging = false;
-            toolController.getSelectedSpatial().setLocalRotation(startRotate);
-            setDefaultAxisMarkerColors();
-            pickedMarker = null; // mouse released, reset selection
-            pickManager.reset();
-        }
-    }
-
-    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();
-        }
-    }
-}
+/*
+ * 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;
+import org.openide.util.Lookup;
+
+/**
+ *
+ * @author kbender
+ */
+public class RotateTool extends SceneEditTool {
+
+    private Vector3f pickedMarker;
+    private Quaternion startRotate;
+    private Quaternion startWorldRotate;
+    private Quaternion lastRotate;
+    private boolean wasDragging = false;
+    private PickManager pickManager;
+
+    public RotateTool() {
+        axisPickType = SceneEditTool.AxisMarkerPickType.planeOnly;
+        setOverrideCameraControl(true);
+    }
+
+    @Override
+    public void activate(AssetManager manager, Node toolNode, Node onTopToolNode, Spatial selectedSpatial, SceneComposerToolController toolController) {
+        super.activate(manager, toolNode, onTopToolNode, selectedSpatial, toolController);
+        pickManager = Lookup.getDefault().lookup(PickManager.class);
+        displayCircles();
+    }
+
+    @Override
+    public void actionPrimary(Vector2f screenCoord, boolean pressed, JmeNode rootNode, DataObject dataObject) {
+        if (!pressed) {
+            setDefaultAxisMarkerColors();
+            pickedMarker = null; // mouse released, reset selection
+            if (wasDragging) {
+                actionPerformed(new RotateUndo(toolController.getSelectedSpatial(), startRotate, lastRotate));
+                wasDragging = false;
+            }
+            pickManager.reset();
+        } else {
+            if (toolController.getSelectedSpatial() == null) {
+                return;
+            }
+
+            if (pickedMarker == null) {
+                pickedMarker = pickAxisMarker(camera, screenCoord, axisPickType);
+                if (pickedMarker == null) {
+                    return;
+                }
+
+                if (pickedMarker.equals(QUAD_XY)) {
+                    pickManager.initiatePick(toolController.getSelectedSpatial(), PickManager.PLANE_XY, getTransformType(), camera, screenCoord);
+                } else if (pickedMarker.equals(QUAD_XZ)) {
+                    pickManager.initiatePick(toolController.getSelectedSpatial(), PickManager.PLANE_XZ, getTransformType(), camera, screenCoord);
+                } else if (pickedMarker.equals(QUAD_YZ)) {
+                    pickManager.initiatePick(toolController.getSelectedSpatial(), PickManager.PLANE_YZ, getTransformType(), camera, screenCoord);
+                }
+                startRotate = toolController.getSelectedSpatial().getLocalRotation().clone();
+                startWorldRotate = toolController.getSelectedSpatial().getWorldRotation().clone();
+                wasDragging = true;
+            }
+        }
+    }
+
+    @Override
+    public void actionSecondary(Vector2f screenCoord, boolean pressed, JmeNode rootNode, DataObject dataObject) {
+        if (pressed) {
+            cancel();
+        }
+    }
+
+    @Override
+    public void mouseMoved(Vector2f screenCoord, JmeNode rootNode, DataObject currentDataObject) {
+        if (pickedMarker == null) {
+            highlightAxisMarker(camera, screenCoord, axisPickType);
+        } else {
+            pickedMarker = null;
+            pickManager.reset();
+        }
+    }
+
+    @Override
+    public void draggedPrimary(Vector2f screenCoord, boolean pressed, JmeNode rootNode, DataObject currentDataObject) {
+        if (!pressed) {
+            setDefaultAxisMarkerColors();
+            pickedMarker = null; // mouse released, reset selection
+
+            if (wasDragging) {
+                actionPerformed(new RotateUndo(toolController.getSelectedSpatial(), startRotate, lastRotate));
+                wasDragging = false;
+            }
+            pickManager.reset();
+        } else if (wasDragging) {
+            if (!pickManager.updatePick(camera, screenCoord)) {
+                return;
+            }
+
+            if (pickedMarker.equals(QUAD_XY) || pickedMarker.equals(QUAD_XZ) || pickedMarker.equals(QUAD_YZ)) {
+                Quaternion rotation = startRotate.mult(pickManager.getRotation(startWorldRotate.inverse()));
+                toolController.updateSelectedRotation(rotation, pickedMarker);
+                lastRotate = rotation;
+            }
+            updateToolsTransformation();
+        }
+    }
+
+    @Override
+    public void draggedSecondary(Vector2f screenCoord, boolean pressed, JmeNode rootNode, DataObject currentDataObject) {
+        if (pressed) {
+            cancel();
+        }
+    }
+
+    private void cancel() {
+        if (wasDragging) {
+            wasDragging = false;
+            toolController.getSelectedSpatial().setLocalRotation(startRotate);
+            setDefaultAxisMarkerColors();
+            pickedMarker = null; // mouse released, reset selection
+            pickManager.reset();
+        }
+    }
+
+    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();
+        }
+    }
+}

+ 2 - 3
jme3-scenecomposer/src/com/jme3/gde/scenecomposer/tools/ScaleTool.java

@@ -6,7 +6,6 @@ package com.jme3.gde.scenecomposer.tools;
 
 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.SceneEditTool;
@@ -122,15 +121,15 @@ public class ScaleTool extends SceneEditTool {
                 diff += 1f;
                 Vector3f scale = startScale.mult(diff);
                 lastScale = scale;
-                toolController.getSelectedSpatial().setLocalScale(scale);
+                toolController.updateSelectedScale(scale, pickedMarker);
             } else if (pickedMarker.equals(ARROW_X) || pickedMarker.equals(ARROW_Y) || pickedMarker.equals(ARROW_Z)) {
                 // Get the translation in the spatial Space
                 Quaternion worldToSpatial = toolController.getSelectedSpatial().getWorldRotation().inverse();
                 Vector3f diff = worldToSpatial.mult(pickManager.getTranslation(constraintAxis));
                 diff.multLocal(0.5f);
                 Vector3f scale = startScale.add(diff);
+                toolController.updateSelectedScale(scale, pickedMarker);
                 lastScale = scale;
-                toolController.getSelectedSpatial().setLocalScale(scale);
             }
             updateToolsTransformation();
         }

+ 1 - 2
jme3-scenecomposer/src/com/jme3/gde/scenecomposer/tools/shortcuts/MoveShortcut.java

@@ -9,7 +9,6 @@ import com.jme3.asset.AssetManager;
 import com.jme3.bullet.control.CharacterControl;
 import com.jme3.bullet.control.RigidBodyControl;
 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;
@@ -167,7 +166,7 @@ public class MoveShortcut extends ShortcutTool {
                 position = startPosition.add(diff);
             }
             finalPosition = position;
-            toolController.getSelectedSpatial().setLocalTranslation(position);
+            toolController.updateSelectedTranslation(position, Vector3f.UNIT_XYZ);
             updateToolsTransformation();
         }
     }

+ 1 - 2
jme3-scenecomposer/src/com/jme3/gde/scenecomposer/tools/shortcuts/RotateShortcut.java

@@ -7,7 +7,6 @@ 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;
@@ -147,7 +146,7 @@ public class RotateShortcut extends ShortcutTool {
         if (pickManager.updatePick(camera, screenCoord)) {
 
             Quaternion rotation = startRotation.mult(pickManager.getRotation(startWorldRotate.inverse()));
-            toolController.getSelectedSpatial().setLocalRotation(rotation);
+            toolController.updateSelectedRotation(rotation, Vector3f.UNIT_XYZ);
             finalRotation = rotation;
             updateToolsTransformation();
         }

+ 1 - 2
jme3-scenecomposer/src/com/jme3/gde/scenecomposer/tools/shortcuts/ScaleShortcut.java

@@ -7,7 +7,6 @@ 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;
@@ -157,7 +156,7 @@ public class ScaleShortcut extends ShortcutTool {
                 scale = startScale.add(diff);
             }
             finalScale = scale;
-            toolController.getSelectedSpatial().setLocalScale(scale);
+            toolController.updateSelectedScale(scale, Vector3f.UNIT_XYZ);
             updateToolsTransformation();
         }
     }

+ 0 - 16
patches/jbullet_dependencies_version_missing.diff

@@ -1,16 +0,0 @@
---- jbullet.pom.old 2017-12-25 11:09:55.814731762 +0000
-+++ jbullet.pom     2017-12-25 11:09:27.535527327 +0000
-@@ -37,11 +37,13 @@
-     <dependency>
-       <groupId>jbullet</groupId>
-       <artifactId>jbullet</artifactId>
-+      <version>0.0.1</version>
-       <scope>compile</scope>
-     </dependency>
-     <dependency>
-       <groupId>stack-alloc</groupId>
-       <artifactId>stack-alloc</artifactId>
-+      <version>0.0.1</version>
-       <scope>compile</scope>
-     </dependency>
-     <dependency> 

+ 0 - 1
settings.gradle

@@ -1,2 +1 @@
 rootProject.name = 'sdk'
-includeBuild './engine'