159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta/* 259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Copyright (c) 2009-2010 jMonkeyEngine 359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * All rights reserved. 459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Redistribution and use in source and binary forms, with or without 659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * modification, are permitted provided that the following conditions are 759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * met: 859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * * Redistributions of source code must retain the above copyright 1059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * notice, this list of conditions and the following disclaimer. 1159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 1259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * * Redistributions in binary form must reproduce the above copyright 1359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * notice, this list of conditions and the following disclaimer in the 1459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * documentation and/or other materials provided with the distribution. 1559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 1659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * * Neither the name of 'jMonkeyEngine' nor the names of its contributors 1759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * may be used to endorse or promote products derived from this software 1859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * without specific prior written permission. 1959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 2059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 2259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 2359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 2459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 2559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 2659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 2759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 2859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 2959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 3059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 3259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 3359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapackage com.jme3.scene.plugins.ogre; 3459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 3559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta//import static com.jmex.model.XMLUtil.getAttribute; 3659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta//import static com.jmex.model.XMLUtil.getIntAttribute; 3759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// 3859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta//import java.util.ArrayList; 3959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta//import java.util.List; 4059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta//import java.util.Map; 4159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// 4259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta//import org.w3c.dom.Node; 4359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// 4459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta//import com.jme.math.Vector3f; 4559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta//import com.jmex.model.XMLUtil; 4659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta//import com.jmex.model.ogrexml.anim.PoseTrack.PoseFrame; 4759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 4859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta/** 4959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Utility class used by OgreLoader to load poses and mesh animations. 5059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 5159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapublic class MeshAnimationLoader { 5259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 5359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// public static void loadMeshAnimations(Node animationsNode, List<Pose> poseList, OgreMesh sharedgeom, List<OgreMesh> submeshes, Map<String, Animation> animations){ 5459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// Node animationNode = animationsNode.getFirstChild(); 5559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// while (animationNode != null){ 5659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// if (animationNode.getNodeName().equals("animation")){ 5759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// MeshAnimation mAnim = 5859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// loadMeshAnimation(animationNode, poseList, sharedgeom, submeshes); 5959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// 6059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// Animation anim = animations.get(mAnim.getName()); 6159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// if (anim != null){ 6259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// anim.setMeshAnimation(mAnim); 6359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// }else{ 6459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// anim = new Animation(null, mAnim); 6559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// animations.put(anim.getName(), anim); 6659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// } 6759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// } 6859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// animationNode = animationNode.getNextSibling(); 6959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// } 7059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// 7159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta//// Map<TriMesh, List<Pose>> trimeshPoses = new HashMap<TriMesh, List<Pose>>(); 7259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta//// 7359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta//// // find the poses for each mesh 7459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta//// for (Pose p : poses){ 7559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta//// List<Pose> poseList = trimeshPoses.get(p.getTarget()); 7659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta//// if (poseList == null){ 7759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta//// poseList = new ArrayList<Pose>(); 7859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta//// trimeshPoses.put(p.getTarget(), poseList); 7959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta//// } 8059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta//// 8159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta//// poseList.add(p); 8259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta//// } 8359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta//// 8459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta//// for (Map.Entry<TriMesh, List<Pose>> poseEntry: trimeshPoses){ 8559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta//// PoseController 8659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta//// } 8759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// } 8859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// 8959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// public static MeshAnimation loadMeshAnimation(Node animationNode, List<Pose> poseList, OgreMesh sharedgeom, List<OgreMesh> submeshes){ 9059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// String name = XMLUtil.getAttribute(animationNode, "name"); 9159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// float length = XMLUtil.getFloatAttribute(animationNode, "length"); 9259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// 9359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// MeshAnimation anim = new MeshAnimation(name, length); 9459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// List<Track> tracks = new ArrayList<Track>(); 9559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// 9659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// Node tracksNode = XMLUtil.getChildNode(animationNode, "tracks"); 9759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// if (tracksNode != null){ 9859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// Node trackNode = tracksNode.getFirstChild(); 9959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// while (trackNode != null){ 10059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// if (trackNode.getNodeName().equals("track")){ 10159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// int targetMeshIndex; 10259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// if (XMLUtil.getAttribute(trackNode, "target").equals("mesh")){ 10359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// targetMeshIndex = -1; 10459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// }else{ 10559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// if (XMLUtil.getAttribute(trackNode, "index") == null) 10659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// targetMeshIndex = 0; 10759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// else 10859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// targetMeshIndex = getIntAttribute(trackNode, "index"); 10959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// } 11059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// 11159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// if (XMLUtil.getAttribute(trackNode, "type").equals("pose")){ 11259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// PoseTrack pt = loadPoseTrack(trackNode, targetMeshIndex, poseList); 11359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// tracks.add(pt); 11459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// }else{ 11559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// throw new UnsupportedOperationException("Morph animations not supported!"); 11659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// } 11759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// } 11859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// 11959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// trackNode = trackNode.getNextSibling(); 12059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// } 12159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// } 12259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// 12359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// anim.setTracks(tracks.toArray(new Track[0])); 12459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// 12559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// return anim; 12659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// } 12759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// 12859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// public static List<Pose> loadPoses(Node posesNode, OgreMesh sharedgeom, List<OgreMesh> submeshes){ 12959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// List<Pose> poses = new ArrayList<Pose>(); 13059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// Node poseNode = posesNode.getFirstChild(); 13159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// while (poseNode != null){ 13259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// if (poseNode.getNodeName().equals("pose")){ 13359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// int targetMeshIndex = 0; 13459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// if (getAttribute(poseNode, "target").equals("mesh")){ 13559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// targetMeshIndex = -1; 13659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// }else{ 13759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// if (getAttribute(poseNode, "index") == null) 13859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// targetMeshIndex = 0; 13959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// else 14059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// targetMeshIndex = getIntAttribute(poseNode, "index"); 14159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// } 14259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// 14359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// Pose p = MeshAnimationLoader.loadPose(poseNode, targetMeshIndex); 14459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// poses.add(p); 14559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// } 14659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// 14759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// poseNode = poseNode.getNextSibling(); 14859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// } 14959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// 15059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// return poses; 15159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// } 15259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// 15359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// public static Pose loadPose(Node poseNode, int targetMeshIndex){ 15459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// String name = XMLUtil.getAttribute(poseNode, "name"); 15559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// 15659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// List<Vector3f> offsets = new ArrayList<Vector3f>(); 15759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// List<Integer> indices = new ArrayList<Integer>(); 15859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// 15959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// Node poseoffsetNode = poseNode.getFirstChild(); 16059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// while (poseoffsetNode != null){ 16159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// if (poseoffsetNode.getNodeName().equals("poseoffset")){ 16259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// int vertIndex = XMLUtil.getIntAttribute(poseoffsetNode, "index"); 16359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// Vector3f offset = new Vector3f(); 16459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// offset.x = XMLUtil.getFloatAttribute(poseoffsetNode, "x"); 16559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// offset.y = XMLUtil.getFloatAttribute(poseoffsetNode, "y"); 16659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// offset.z = XMLUtil.getFloatAttribute(poseoffsetNode, "z"); 16759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// 16859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// offsets.add(offset); 16959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// indices.add(vertIndex); 17059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// } 17159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// 17259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// poseoffsetNode = poseoffsetNode.getNextSibling(); 17359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// } 17459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// 17559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// int[] indicesArray = new int[indices.size()]; 17659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// for (int i = 0; i < indicesArray.length; i++){ 17759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// indicesArray[i] = indices.get(i); 17859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// } 17959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// 18059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// Pose pose = new Pose(name, 18159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// targetMeshIndex, 18259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// offsets.toArray(new Vector3f[0]), 18359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// indicesArray); 18459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// 18559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// return pose; 18659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// } 18759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// 18859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// public static PoseTrack loadPoseTrack(Node trackNode, int targetMeshIndex, List<Pose> posesList){ 18959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// List<Float> times = new ArrayList<Float>(); 19059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// List<PoseFrame> frames = new ArrayList<PoseFrame>(); 19159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// 19259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// Node keyframesNode = XMLUtil.getChildNode(trackNode, "keyframes"); 19359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// Node keyframeNode = keyframesNode.getFirstChild(); 19459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// while (keyframeNode != null){ 19559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// if (keyframeNode.getNodeName().equals("keyframe")){ 19659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// float time = XMLUtil.getFloatAttribute(keyframeNode, "time"); 19759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// List<Pose> poses = new ArrayList<Pose>(); 19859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// List<Float> weights = new ArrayList<Float>(); 19959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// 20059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// Node poserefNode = keyframeNode.getFirstChild(); 20159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// while (poserefNode != null){ 20259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// if (poserefNode.getNodeName().equals("poseref")){ 20359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// int poseindex = XMLUtil.getIntAttribute(poserefNode, "poseindex"); 20459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// poses.add(posesList.get(poseindex)); 20559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// float weight = XMLUtil.getFloatAttribute(poserefNode, "influence"); 20659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// weights.add(weight); 20759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// } 20859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// 20959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// poserefNode = poserefNode.getNextSibling(); 21059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// } 21159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// 21259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// // convert poses and weights to arrays and create a PoseFrame 21359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// float[] weightsArray = new float[weights.size()]; 21459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// for (int i = 0; i < weightsArray.length; i++){ 21559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// weightsArray[i] = weights.get(i); 21659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// } 21759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// PoseFrame frame = new PoseFrame(poses.toArray(new Pose[0]), weightsArray); 21859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// 21959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// times.add(time); 22059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// frames.add(frame); 22159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// } 22259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// 22359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// keyframeNode = keyframeNode.getNextSibling(); 22459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// } 22559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// 22659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// // convert times and frames to arrays and write to the track 22759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// float[] timesArray = new float[times.size()]; 22859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// for (int i = 0; i < timesArray.length; i++){ 22959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// timesArray[i] = times.get(i); 23059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// } 23159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// 23259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// PoseTrack track = new PoseTrack(targetMeshIndex, 23359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// timesArray, 23459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// frames.toArray(new PoseFrame[0])); 23559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// 23659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// return track; 23759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// } 23859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 23959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta} 240