diff --git a/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/BlenderContext.java b/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/BlenderContext.java index 17b312a37..d435df8f8 100644 --- a/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/BlenderContext.java +++ b/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/BlenderContext.java @@ -420,7 +420,7 @@ public class BlenderContext { animList = new ArrayList(); animations.put(ownerOMA, animList); } - animations.put(ownerOMA, animList); + animList.add(animation); } /** diff --git a/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/animations/AnimationHelper.java b/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/animations/AnimationHelper.java index bb73db037..2cee9f7e2 100644 --- a/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/animations/AnimationHelper.java +++ b/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/animations/AnimationHelper.java @@ -10,7 +10,6 @@ import java.util.logging.Logger; import com.jme3.animation.AnimControl; import com.jme3.animation.Animation; -import com.jme3.animation.Bone; import com.jme3.animation.BoneTrack; import com.jme3.animation.Skeleton; import com.jme3.animation.SkeletonControl; @@ -121,11 +120,8 @@ public class AnimationHelper extends AbstractBlenderHelper { Animation boneAnimation = new Animation(animationName, action.getAnimationTime()); boneAnimation.setTracks(tracks); animations.add(boneAnimation); - for (BoneTrack track : tracks) { - Bone bone = skeleton.getBone(track.getTargetBoneIndex()); - BoneContext boneContext = blenderContext.getBoneContext(bone); - blenderContext.addAnimation(boneContext.getBoneOma(), boneAnimation); - } + Long animatedNodeOMA = ((Number)blenderContext.getMarkerValue(ObjectHelper.OMA_MARKER, node)).longValue(); + blenderContext.addAnimation(animatedNodeOMA, boneAnimation); } } else { LOGGER.log(Level.WARNING, "Cannot find animation named: {0}.", animationName); diff --git a/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/animations/BoneContext.java b/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/animations/BoneContext.java index 6fd91f143..48caa5f40 100644 --- a/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/animations/BoneContext.java +++ b/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/animations/BoneContext.java @@ -140,7 +140,9 @@ public class BoneContext { ObjectHelper objectHelper = blenderContext.getHelper(ObjectHelper.class); Structure skeletonOwnerObjectStructure = (Structure) blenderContext.getLoadedFeature(skeletonOwnerOma, LoadedFeatureDataType.LOADED_STRUCTURE); - Matrix4f invertedObjectOwnerGlobalMatrix = objectHelper.getMatrix(skeletonOwnerObjectStructure, "imat", blenderContext.getBlenderKey().isFixUpAxis()); + // I could load 'imat' here, but apparently in some older blenders there were bugs or unfinished functionalities that stored ZERO matrix in imat field + // loading 'obmat' and inverting it makes us avoid errors in such cases + Matrix4f invertedObjectOwnerGlobalMatrix = objectHelper.getMatrix(skeletonOwnerObjectStructure, "obmat", blenderContext.getBlenderKey().isFixUpAxis()).invertLocal(); if (objectHelper.isParent(skeletonOwnerOma, armatureObjectOMA)) { boneMatrixInModelSpace = globalBoneMatrix.mult(invertedObjectOwnerGlobalMatrix); } else { diff --git a/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/constraints/SimulationNode.java b/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/constraints/SimulationNode.java index 088e9c889..cc1eb430f 100644 --- a/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/constraints/SimulationNode.java +++ b/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/constraints/SimulationNode.java @@ -131,11 +131,9 @@ public class SimulationNode { constraints.addAll(boneConstraints); } } - - // each bone of the skeleton has the same anim data applied - BoneContext boneContext = blenderContext.getBoneContext(skeleton.getBone(1)); - Long boneOma = boneContext.getBoneOma(); - animations = blenderContext.getAnimations(boneOma); + Node node = blenderContext.getControlledNode(skeleton); + Long animatedNodeOMA = ((Number)blenderContext.getMarkerValue(ObjectHelper.OMA_MARKER, node)).longValue(); + animations = blenderContext.getAnimations(animatedNodeOMA); } else { animations = blenderContext.getAnimations(featureOMA); for (Spatial child : spatial.getChildren()) { diff --git a/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/objects/ObjectHelper.java b/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/objects/ObjectHelper.java index 4bc111d8e..5130e7148 100644 --- a/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/objects/ObjectHelper.java +++ b/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/objects/ObjectHelper.java @@ -208,8 +208,13 @@ public class ObjectHelper extends AbstractBlenderHelper { } if (result != null) { + LOGGER.fine("Storing loaded feature in blender context and applying markers (those will be removed before the final result is released)."); blenderContext.addLoadedFeatures(objectStructure.getOldMemoryAddress(), name, objectStructure, result); - + blenderContext.addMarker(OMA_MARKER, result, objectStructure.getOldMemoryAddress()); + if (objectType == ObjectType.ARMATURE) { + blenderContext.addMarker(ARMATURE_NODE_MARKER, result, Boolean.TRUE); + } + result.setLocalTransform(t); result.setCullHint(visible ? CullHint.Always : CullHint.Inherit); if (parent instanceof Node) { @@ -234,12 +239,6 @@ public class ObjectHelper extends AbstractBlenderHelper { // I prefer do compute bounding box here than read it from the file result.updateModelBound(); - LOGGER.fine("Applying markers (those will be removed before the final result is released)."); - blenderContext.addMarker(OMA_MARKER, result, objectStructure.getOldMemoryAddress()); - if (objectType == ObjectType.ARMATURE) { - blenderContext.addMarker(ARMATURE_NODE_MARKER, result, Boolean.TRUE); - } - LOGGER.fine("Applying animations to the object if such are defined."); AnimationHelper animationHelper = blenderContext.getHelper(AnimationHelper.class); animationHelper.applyAnimations(result, blenderContext.getBlenderKey().getNodeAnimationNames(name));