package com.badlogic.gdx.graphics.g3d.loaders.collada; import java.util.HashMap; import java.util.Map; import com.badlogic.gdx.graphics.g3d.model.skeleton.SkeletonKeyframe; import com.badlogic.gdx.math.Matrix4; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.GdxRuntimeException; import com.badlogic.gdx.utils.ObjectMap; import com.badlogic.gdx.utils.XmlReader.Element; public class Animation { ObjectMap<String, float[]> inputMap = new ObjectMap<String, float[]>(); ObjectMap<String, float[]> outputMap = new ObjectMap<String, float[]>(); //TODO: replace this with the bone name/index read in skin data Array<String> channels = new Array<String>(); SkeletonKeyframe[][] keyFrames; public Animation(Element libAnimElement){ Array<Element> animElements = libAnimElement.getChildrenByName("animation"); for(int i=0;i<animElements.size;i++){ Element animElement = animElements.get(i); Array<Element> colladaSources = animElement.getChildrenByName("source"); Map<String, Source> sources = new HashMap<String, Source>(); for (int j = 0; j < colladaSources.size; j++) { Element colladaSource = colladaSources.get(j); //TODO: fix this so source can load more then just floats if(colladaSource.getChildrenByName("float_array").size != 0){ sources.put(colladaSource.getAttribute("id"), new Source(colladaSource)); } } ObjectMap<String , String> mapping = new ObjectMap<String, String>(); Element samplerElement = animElement.getChildByName("sampler"); if(samplerElement ==null) throw new GdxRuntimeException("no sampler in animation element in scene"); Array<Element> inputs = samplerElement.getChildrenByName("input"); for(int k = 0;k<inputs.size;k++){ mapping.put(inputs.get(k).getAttribute("semantic"),inputs.get(k).getAttribute("source").replaceFirst("#", "")); } Element channelElement = animElement.getChildByName("channel"); if(channelElement ==null) throw new GdxRuntimeException("no sampler in animation element in scene"); String channelName = channelElement.getAttribute("target"); channels.add(channelName); inputMap.put(channelName,sources.get(mapping.get("INPUT")).data); outputMap.put(channelName,sources.get(mapping.get("OUTPUT")).data); } keyFrames = new SkeletonKeyframe[channels.size][]; for(int i=0;i<channels.size;i++){ String channel = channels.get(i); float[] input = inputMap.get(channel); float[] output = outputMap.get(channel); keyFrames[i] = new SkeletonKeyframe[input.length]; for(int j=0;j<input.length;j++){ SkeletonKeyframe frame = new SkeletonKeyframe(); keyFrames[i][j] = frame; Matrix4 m = getMatrix(output, j*16); m.getTranslation(frame.position); m.getRotation(frame.rotation); //TODO: get Scale from matrix frame.timeStamp = input[j]; //TODO:set parent index joint data } } } private Matrix4 getMatrix(float[] val, int offset){ Matrix4 m = new Matrix4(); for(int i=0;i<16;i++){ m.val[i] = val[i+offset]; } m.tra(); return m; } }