aboutsummaryrefslogtreecommitdiff
path: root/engine/src/blender/com/jme3/scene/plugins/blender/modifiers/ObjectAnimationModifier.java
diff options
context:
space:
mode:
Diffstat (limited to 'engine/src/blender/com/jme3/scene/plugins/blender/modifiers/ObjectAnimationModifier.java')
-rw-r--r--engine/src/blender/com/jme3/scene/plugins/blender/modifiers/ObjectAnimationModifier.java91
1 files changed, 91 insertions, 0 deletions
diff --git a/engine/src/blender/com/jme3/scene/plugins/blender/modifiers/ObjectAnimationModifier.java b/engine/src/blender/com/jme3/scene/plugins/blender/modifiers/ObjectAnimationModifier.java
new file mode 100644
index 0000000..a41395c
--- /dev/null
+++ b/engine/src/blender/com/jme3/scene/plugins/blender/modifiers/ObjectAnimationModifier.java
@@ -0,0 +1,91 @@
+package com.jme3.scene.plugins.blender.modifiers;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import com.jme3.animation.AnimControl;
+import com.jme3.animation.Animation;
+import com.jme3.animation.SpatialTrack;
+import com.jme3.scene.Node;
+import com.jme3.scene.plugins.blender.BlenderContext;
+import com.jme3.scene.plugins.blender.animations.Ipo;
+import com.jme3.scene.plugins.blender.exceptions.BlenderFileException;
+import com.jme3.scene.plugins.ogre.AnimData;
+
+/**
+ * This modifier allows to add animation to the object.
+ *
+ * @author Marcin Roguski (Kaelthas)
+ */
+/* package */class ObjectAnimationModifier extends Modifier {
+ private static final Logger LOGGER = Logger.getLogger(ObjectAnimationModifier.class.getName());
+
+ /** Loaded animation data. */
+ private AnimData animData;
+
+ /**
+ * This constructor reads animation of the object itself (without bones) and
+ * stores it as an ArmatureModifierData modifier. The animation is returned
+ * as a modifier. It should be later applied regardless other modifiers. The
+ * reason for this is that object may not have modifiers added but it's
+ * animation should be working. The stored modifier is an anim data and
+ * additional data is given object's OMA.
+ *
+ * @param ipo
+ * the object's interpolation curves
+ * @param objectAnimationName
+ * the name of object's animation
+ * @param objectOMA
+ * the OMA of the object
+ * @param blenderContext
+ * the blender context
+ * @throws BlenderFileException
+ * this exception is thrown when the blender file is somehow
+ * corrupted
+ */
+ public ObjectAnimationModifier(Ipo ipo, String objectAnimationName, Long objectOMA, BlenderContext blenderContext) throws BlenderFileException {
+ int fps = blenderContext.getBlenderKey().getFps();
+
+ // calculating track
+ SpatialTrack track = (SpatialTrack) ipo.calculateTrack(-1, 0, ipo.getLastFrame(), fps, true);
+
+ Animation animation = new Animation(objectAnimationName, ipo.getLastFrame() / fps);
+ animation.setTracks(new SpatialTrack[] { track });
+ ArrayList<Animation> animations = new ArrayList<Animation>(1);
+ animations.add(animation);
+
+ animData = new AnimData(null, animations);
+ blenderContext.setAnimData(objectOMA, animData);
+ }
+
+ @Override
+ public Node apply(Node node, BlenderContext blenderContext) {
+ if (invalid) {
+ LOGGER.log(Level.WARNING, "Armature modifier is invalid! Cannot be applied to: {0}", node.getName());
+ }// if invalid, animData will be null
+ if (animData != null) {
+ // INFO: constraints for this modifier are applied in the
+ // ObjectHelper when the whole object is loaded
+ ArrayList<Animation> animList = animData.anims;
+ if (animList != null && animList.size() > 0) {
+ HashMap<String, Animation> anims = new HashMap<String, Animation>();
+ for (int i = 0; i < animList.size(); ++i) {
+ Animation animation = animList.get(i);
+ anims.put(animation.getName(), animation);
+ }
+
+ AnimControl control = new AnimControl(null);
+ control.setAnimations(anims);
+ node.addControl(control);
+ }
+ }
+ return node;
+ }
+
+ @Override
+ public String getType() {
+ return Modifier.OBJECT_ANIMATION_MODIFIER_DATA;
+ }
+}