diff --git a/README.md b/README.md index 69d2207bd..b3f993569 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ jMonkeyEngine ============= -jMonkeyEngine is a 3D game engine for adventurous Java developers. It’s open source, cross platform and cutting edge. And it is all beautifully documented. The 3.0 branch is the latest stable version of the jMonkeyEngine 3 SDK, a complete game development suite. We'll be frequently submitting stable 3.0.x updates until the major 3.1 version arrives in Q4 2014. +jMonkeyEngine is a 3D game engine for adventurous Java developers. It’s open source, cross platform and cutting edge. And it is all beautifully documented. The 3.0 branch is the latest stable version of the jMonkeyEngine 3 SDK, a complete game development suite. We'll be frequently submitting stable 3.0.x updates until the major 3.1 version arrives. The engine is used by several commercial game studios and computer-science courses. Here's a taste: diff --git a/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/constraints/definitions/ConstraintDefinitionIK.java b/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/constraints/definitions/ConstraintDefinitionIK.java index 1d6139e04..35a4e5618 100644 --- a/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/constraints/definitions/ConstraintDefinitionIK.java +++ b/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/constraints/definitions/ConstraintDefinitionIK.java @@ -88,14 +88,17 @@ public class ConstraintDefinitionIK extends ConstraintDefinition { if (angle != 0) { Vector3d cross = currentDir.crossLocal(target).normalizeLocal(); q.fromAngleAxis(angle, cross); - if (boneContext.isLockX()) { - q.set(0, q.getY(), q.getZ(), q.getW()); - } - if (boneContext.isLockY()) { - q.set(q.getX(), 0, q.getZ(), q.getW()); - } - if (boneContext.isLockZ()) { - q.set(q.getX(), q.getY(), 0, q.getW()); + + if(bone.equals(this.getOwner())) { + if (boneContext.isLockX()) { + q.set(0, q.getY(), q.getZ(), q.getW()); + } + if (boneContext.isLockY()) { + q.set(q.getX(), 0, q.getZ(), q.getW()); + } + if (boneContext.isLockZ()) { + q.set(q.getX(), q.getY(), 0, q.getW()); + } } boneTransform.getRotation().set(q.multLocal(boneTransform.getRotation())); @@ -107,6 +110,8 @@ public class ConstraintDefinitionIK extends ConstraintDefinition { } } + List bestSolution = new ArrayList(bones.size()); + double bestSolutionDistance = Double.MAX_VALUE; BoneContext topBone = bones.get(0); for (int i = 0; i < iterations && distanceFromTarget > MIN_DISTANCE; ++i) { for (BoneContext boneContext : bones) { @@ -124,14 +129,16 @@ public class ConstraintDefinitionIK extends ConstraintDefinition { Vector3d cross = currentDir.crossLocal(target).normalizeLocal(); q.fromAngleAxis(angle, cross); - if (boneContext.isLockX()) { - q.set(0, q.getY(), q.getZ(), q.getW()); - } - if (boneContext.isLockY()) { - q.set(q.getX(), 0, q.getZ(), q.getW()); - } - if (boneContext.isLockZ()) { - q.set(q.getX(), q.getY(), 0, q.getW()); + if(bone.equals(this.getOwner())) { + if (boneContext.isLockX()) { + q.set(0, q.getY(), q.getZ(), q.getW()); + } + if (boneContext.isLockY()) { + q.set(q.getX(), 0, q.getZ(), q.getW()); + } + if (boneContext.isLockZ()) { + q.set(q.getX(), q.getY(), 0, q.getW()); + } } boneWorldTransform.getRotation().set(q.multLocal(boneWorldTransform.getRotation())); @@ -145,6 +152,20 @@ public class ConstraintDefinitionIK extends ConstraintDefinition { DTransform topBoneTransform = new DTransform(constraintHelper.getTransform(topBone.getArmatureObjectOMA(), topBone.getBone().getName(), Space.CONSTRAINT_SPACE_WORLD)); Vector3d e = topBoneTransform.getTranslation().addLocal(topBoneTransform.getRotation().mult(Vector3d.UNIT_Y).multLocal(topBone.getLength()));// effector distanceFromTarget = e.distance(t); + + if(distanceFromTarget < bestSolutionDistance) { + bestSolutionDistance = distanceFromTarget; + bestSolution.clear(); + for(BoneContext boneContext : bones) { + bestSolution.add(constraintHelper.getTransform(boneContext.getArmatureObjectOMA(), boneContext.getBone().getName(), Space.CONSTRAINT_SPACE_WORLD)); + } + } + } + + // applying best solution + for(int i=0;i level){ - color = color2; - } - - gl_FragColor = vec4(color,1.0); + gl_FragColor = vec4(mix(color, color2, step(level, position.y)), 1.0); } \ No newline at end of file diff --git a/jme3-effects/src/main/resources/Common/MatDefs/Water/Water.j3md b/jme3-effects/src/main/resources/Common/MatDefs/Water/Water.j3md index 2f4b2b39c..2f188934b 100644 --- a/jme3-effects/src/main/resources/Common/MatDefs/Water/Water.j3md +++ b/jme3-effects/src/main/resources/Common/MatDefs/Water/Water.j3md @@ -77,6 +77,7 @@ MaterialDef Advanced Water { FragmentShader GLSL120 : Common/MatDefs/Water/Water.frag WorldParameters { + ViewProjectionMatrixInverse } Defines { ENABLE_RIPPLES : UseRipples diff --git a/sdk/jme3-scenecomposer/src/com/jme3/gde/scenecomposer/ComposerCameraController.java b/sdk/jme3-scenecomposer/src/com/jme3/gde/scenecomposer/ComposerCameraController.java index c16933f80..c1689b833 100644 --- a/sdk/jme3-scenecomposer/src/com/jme3/gde/scenecomposer/ComposerCameraController.java +++ b/sdk/jme3-scenecomposer/src/com/jme3/gde/scenecomposer/ComposerCameraController.java @@ -79,26 +79,24 @@ public class ComposerCameraController extends AbstractCameraController { @Override public void checkClick(int button, boolean pressed) { - if (button == 0) { - if (isEditButtonEnabled() && !forceCameraControls) { + if (!forceCameraControls || !pressed) { // dont call toolController while forceCam but on button release (for UndoRedo) + if (button == 0) { toolController.doEditToolActivatedPrimary(new Vector2f(mouseX, mouseY), pressed, cam); } - } - if (button == 1) { - if (isEditButtonEnabled() && !forceCameraControls) { + if (button == 1) { toolController.doEditToolActivatedSecondary(new Vector2f(mouseX, mouseY), pressed, cam); } } - - } @Override protected void checkDragged(int button, boolean pressed) { - if (button == 0) { - toolController.doEditToolDraggedPrimary(new Vector2f(mouseX, mouseY), pressed, cam); - } else if (button == 1) { - toolController.doEditToolDraggedSecondary(new Vector2f(mouseX, mouseY), pressed, cam); + if (!forceCameraControls || !pressed) { + if (button == 0) { + toolController.doEditToolDraggedPrimary(new Vector2f(mouseX, mouseY), pressed, cam); + } else if (button == 1) { + toolController.doEditToolDraggedSecondary(new Vector2f(mouseX, mouseY), pressed, cam); + } } }