blob: 0fb505a2fcc6dae4be0b6dbaaaa4825cd9012a0f [file] [log] [blame]
/*
* Copyright (c) 2009-2011 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
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package com.jme3.animation;
import com.jme3.export.*;
import com.jme3.util.TempVars;
import java.io.IOException;
/**
* The animation class updates the animation target with the tracks of a given type.
*
* @author Kirill Vainer, Marcin Roguski (Kaelthas)
*/
public class Animation implements Savable, Cloneable {
/**
* The name of the animation.
*/
private String name;
/**
* The length of the animation.
*/
private float length;
/**
* The tracks of the animation.
*/
private Track[] tracks;
/**
* Serialization-only. Do not use.
*/
public Animation() {}
/**
* Creates a new <code>Animation</code> with the given name and length.
*
* @param name The name of the animation.
* @param length Length in seconds of the animation.
*/
public Animation(String name, float length) {
this.name = name;
this.length = length;
}
/**
* The name of the bone animation
* @return name of the bone animation
*/
public String getName() {
return name;
}
/**
* Returns the length in seconds of this animation
*
* @return the length in seconds of this animation
*/
public float getLength() {
return length;
}
/**
* This method sets the current time of the animation.
* This method behaves differently for every known track type.
* Override this method if you have your own type of track.
*
* @param time the time of the animation
* @param blendAmount the blend amount factor
* @param control the animation control
* @param channel the animation channel
*/
void setTime(float time, float blendAmount, AnimControl control, AnimChannel channel, TempVars vars) {
if (tracks == null)
return;
for (int i = 0; i < tracks.length; i++){
tracks[i].setTime(time, blendAmount, control, channel, vars);
}
/*
if (tracks != null && tracks.length > 0) {
Track<?> trackInstance = tracks[0];
if (trackInstance instanceof SpatialTrack) {
Spatial spatial = control.getSpatial();
if (spatial != null) {
((SpatialTrack) tracks[0]).setTime(time, spatial, blendAmount);
}
} else if (trackInstance instanceof BoneTrack) {
BitSet affectedBones = channel.getAffectedBones();
Skeleton skeleton = control.getSkeleton();
for (int i = 0; i < tracks.length; ++i) {
if (affectedBones == null || affectedBones.get(((BoneTrack) tracks[i]).getTargetIndex())) {
((BoneTrack) tracks[i]).setTime(time, skeleton, blendAmount);
}
}
} else if (trackInstance instanceof PoseTrack) {
Spatial spatial = control.getSpatial();
List<Mesh> meshes = new ArrayList<Mesh>();
this.getMeshes(spatial, meshes);
if (meshes.size() > 0) {
Mesh[] targets = meshes.toArray(new Mesh[meshes.size()]);
for (int i = 0; i < tracks.length; ++i) {
((PoseTrack) tracks[i]).setTime(time, targets, blendAmount);
}
}
}
}
*/
}
/**
* Set the {@link Track}s to be used by this animation.
* <p>
* The array should be organized so that the appropriate Track can
* be retrieved based on a bone index.
*
* @param tracks The tracks to set.
*/
public void setTracks(Track[] tracks){
this.tracks = tracks;
}
/**
* Returns the tracks set in {@link #setTracks(com.jme3.animation.Track[]) }.
*
* @return the tracks set previously
*/
public Track[] getTracks() {
return tracks;
}
/**
* This method creates a clone of the current object.
* @return a clone of the current object
*/
@Override
public Animation clone() {
try {
Animation result = (Animation) super.clone();
result.tracks = tracks.clone();
for (int i = 0; i < tracks.length; ++i) {
result.tracks[i] = this.tracks[i].clone();
}
return result;
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
@Override
public String toString() {
return getClass().getSimpleName() + "[name=" + name + ", length=" + length + ']';
}
@Override
public void write(JmeExporter ex) throws IOException {
OutputCapsule out = ex.getCapsule(this);
out.write(name, "name", null);
out.write(length, "length", 0f);
out.write(tracks, "tracks", null);
}
@Override
public void read(JmeImporter im) throws IOException {
InputCapsule in = im.getCapsule(this);
name = in.readString("name", null);
length = in.readFloat("length", 0f);
Savable[] arr = in.readSavableArray("tracks", null);
tracks = new Track[arr.length];
System.arraycopy(arr, 0, tracks, 0, arr.length);
}
}