blob: 75ff865794efee6ed1ab04d5558298d5a2ab78a5 [file] [log] [blame]
/*
* Copyright (c) 2009-2010 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.scene.plugins.ogre;
//import static com.jmex.model.XMLUtil.getAttribute;
//import static com.jmex.model.XMLUtil.getIntAttribute;
//
//import java.util.ArrayList;
//import java.util.List;
//import java.util.Map;
//
//import org.w3c.dom.Node;
//
//import com.jme.math.Vector3f;
//import com.jmex.model.XMLUtil;
//import com.jmex.model.ogrexml.anim.PoseTrack.PoseFrame;
/**
* Utility class used by OgreLoader to load poses and mesh animations.
*/
public class MeshAnimationLoader {
// public static void loadMeshAnimations(Node animationsNode, List<Pose> poseList, OgreMesh sharedgeom, List<OgreMesh> submeshes, Map<String, Animation> animations){
// Node animationNode = animationsNode.getFirstChild();
// while (animationNode != null){
// if (animationNode.getNodeName().equals("animation")){
// MeshAnimation mAnim =
// loadMeshAnimation(animationNode, poseList, sharedgeom, submeshes);
//
// Animation anim = animations.get(mAnim.getName());
// if (anim != null){
// anim.setMeshAnimation(mAnim);
// }else{
// anim = new Animation(null, mAnim);
// animations.put(anim.getName(), anim);
// }
// }
// animationNode = animationNode.getNextSibling();
// }
//
//// Map<TriMesh, List<Pose>> trimeshPoses = new HashMap<TriMesh, List<Pose>>();
////
//// // find the poses for each mesh
//// for (Pose p : poses){
//// List<Pose> poseList = trimeshPoses.get(p.getTarget());
//// if (poseList == null){
//// poseList = new ArrayList<Pose>();
//// trimeshPoses.put(p.getTarget(), poseList);
//// }
////
//// poseList.add(p);
//// }
////
//// for (Map.Entry<TriMesh, List<Pose>> poseEntry: trimeshPoses){
//// PoseController
//// }
// }
//
// public static MeshAnimation loadMeshAnimation(Node animationNode, List<Pose> poseList, OgreMesh sharedgeom, List<OgreMesh> submeshes){
// String name = XMLUtil.getAttribute(animationNode, "name");
// float length = XMLUtil.getFloatAttribute(animationNode, "length");
//
// MeshAnimation anim = new MeshAnimation(name, length);
// List<Track> tracks = new ArrayList<Track>();
//
// Node tracksNode = XMLUtil.getChildNode(animationNode, "tracks");
// if (tracksNode != null){
// Node trackNode = tracksNode.getFirstChild();
// while (trackNode != null){
// if (trackNode.getNodeName().equals("track")){
// int targetMeshIndex;
// if (XMLUtil.getAttribute(trackNode, "target").equals("mesh")){
// targetMeshIndex = -1;
// }else{
// if (XMLUtil.getAttribute(trackNode, "index") == null)
// targetMeshIndex = 0;
// else
// targetMeshIndex = getIntAttribute(trackNode, "index");
// }
//
// if (XMLUtil.getAttribute(trackNode, "type").equals("pose")){
// PoseTrack pt = loadPoseTrack(trackNode, targetMeshIndex, poseList);
// tracks.add(pt);
// }else{
// throw new UnsupportedOperationException("Morph animations not supported!");
// }
// }
//
// trackNode = trackNode.getNextSibling();
// }
// }
//
// anim.setTracks(tracks.toArray(new Track[0]));
//
// return anim;
// }
//
// public static List<Pose> loadPoses(Node posesNode, OgreMesh sharedgeom, List<OgreMesh> submeshes){
// List<Pose> poses = new ArrayList<Pose>();
// Node poseNode = posesNode.getFirstChild();
// while (poseNode != null){
// if (poseNode.getNodeName().equals("pose")){
// int targetMeshIndex = 0;
// if (getAttribute(poseNode, "target").equals("mesh")){
// targetMeshIndex = -1;
// }else{
// if (getAttribute(poseNode, "index") == null)
// targetMeshIndex = 0;
// else
// targetMeshIndex = getIntAttribute(poseNode, "index");
// }
//
// Pose p = MeshAnimationLoader.loadPose(poseNode, targetMeshIndex);
// poses.add(p);
// }
//
// poseNode = poseNode.getNextSibling();
// }
//
// return poses;
// }
//
// public static Pose loadPose(Node poseNode, int targetMeshIndex){
// String name = XMLUtil.getAttribute(poseNode, "name");
//
// List<Vector3f> offsets = new ArrayList<Vector3f>();
// List<Integer> indices = new ArrayList<Integer>();
//
// Node poseoffsetNode = poseNode.getFirstChild();
// while (poseoffsetNode != null){
// if (poseoffsetNode.getNodeName().equals("poseoffset")){
// int vertIndex = XMLUtil.getIntAttribute(poseoffsetNode, "index");
// Vector3f offset = new Vector3f();
// offset.x = XMLUtil.getFloatAttribute(poseoffsetNode, "x");
// offset.y = XMLUtil.getFloatAttribute(poseoffsetNode, "y");
// offset.z = XMLUtil.getFloatAttribute(poseoffsetNode, "z");
//
// offsets.add(offset);
// indices.add(vertIndex);
// }
//
// poseoffsetNode = poseoffsetNode.getNextSibling();
// }
//
// int[] indicesArray = new int[indices.size()];
// for (int i = 0; i < indicesArray.length; i++){
// indicesArray[i] = indices.get(i);
// }
//
// Pose pose = new Pose(name,
// targetMeshIndex,
// offsets.toArray(new Vector3f[0]),
// indicesArray);
//
// return pose;
// }
//
// public static PoseTrack loadPoseTrack(Node trackNode, int targetMeshIndex, List<Pose> posesList){
// List<Float> times = new ArrayList<Float>();
// List<PoseFrame> frames = new ArrayList<PoseFrame>();
//
// Node keyframesNode = XMLUtil.getChildNode(trackNode, "keyframes");
// Node keyframeNode = keyframesNode.getFirstChild();
// while (keyframeNode != null){
// if (keyframeNode.getNodeName().equals("keyframe")){
// float time = XMLUtil.getFloatAttribute(keyframeNode, "time");
// List<Pose> poses = new ArrayList<Pose>();
// List<Float> weights = new ArrayList<Float>();
//
// Node poserefNode = keyframeNode.getFirstChild();
// while (poserefNode != null){
// if (poserefNode.getNodeName().equals("poseref")){
// int poseindex = XMLUtil.getIntAttribute(poserefNode, "poseindex");
// poses.add(posesList.get(poseindex));
// float weight = XMLUtil.getFloatAttribute(poserefNode, "influence");
// weights.add(weight);
// }
//
// poserefNode = poserefNode.getNextSibling();
// }
//
// // convert poses and weights to arrays and create a PoseFrame
// float[] weightsArray = new float[weights.size()];
// for (int i = 0; i < weightsArray.length; i++){
// weightsArray[i] = weights.get(i);
// }
// PoseFrame frame = new PoseFrame(poses.toArray(new Pose[0]), weightsArray);
//
// times.add(time);
// frames.add(frame);
// }
//
// keyframeNode = keyframeNode.getNextSibling();
// }
//
// // convert times and frames to arrays and write to the track
// float[] timesArray = new float[times.size()];
// for (int i = 0; i < timesArray.length; i++){
// timesArray[i] = times.get(i);
// }
//
// PoseTrack track = new PoseTrack(targetMeshIndex,
// timesArray,
// frames.toArray(new PoseFrame[0]));
//
// return track;
// }
}