void MakeKeyFramesAndJointData() { var keyBlobs = animation.keyFrames; keyframes = new List <List <KeyFrame> >(10); for (int i = 0; i < 10; i++) { keyframes.Add(new List <KeyFrame>()); } jointData = new JointData[numJoints]; List <QJoint> indexedJoints = new List <QJoint>(numJoints); for (int i = 0; i < numJoints; i++) { indexedJoints.Add(null); } foreach (KeyValuePair <string, KeyBlob> kv in keyBlobs) { QJoint curJoint = FindJointByName(kv.Key); int curIdx = curJoint.index; indexedJoints[curIdx] = curJoint; } for (int i = 0; i < numJoints; i++) { QJoint joint = indexedJoints[i]; KeyBlob blob = keyBlobs[joint.name]; int[] jointDataArgs = new int[20]; for (int j = 0; j < 10; j++) { string attribName = "m_LocalPosition.x"; switch (j) { case (1): attribName = "m_LocalPosition.y"; break; case (2): attribName = "m_LocalPosition.z"; break; case (3): attribName = "m_LocalRotation.x"; break; case (4): attribName = "m_LocalRotation.y"; break; case (5): attribName = "m_LocalRotation.z"; break; case (6): attribName = "m_LocalRotation.w"; break; case (7): attribName = "m_LocalScale.x"; break; case (8): attribName = "m_LocalScale.y"; break; case (9): attribName = "m_LocalScale.z"; break; } SortedList <float, ScalarFrame> frames = blob.keyedAttributes[attribName].values; jointDataArgs[j * 2] = keyframes[j].Count; jointDataArgs[j * 2 + 1] = frames.Count; for (int k = 0; k < frames.Count; k++) { float time = frames.Keys[k]; ScalarFrame frame = frames.Values[k]; KeyFrame newFrame = new KeyFrame(time, frame.value, frame.inTangent, frame.outTangent); keyframes[j].Add(newFrame); } } int numChildren = NumChildren(i); Matrix4x4 bindPose = bindTransforms[i];//.inverse; jointData[i] = new JointData(jointDataArgs, numChildren, bindPose); } }
public AnimationData MakeKeyFramesAndJointData(Mesh model) { int numJoints = animation.jointNames.Count; var keyBlobs = animation.keyFrames; AnimationData result = new AnimationData(); result.jointData = new JointData[numJoints]; result.keyframes = new List <KeyFrame> [10]; for (int i = 0; i < 10; i++) { result.keyframes[i] = new List <KeyFrame>(); } List <QJoint> indexedJoints = new List <QJoint>(numJoints); for (int i = 0; i < numJoints; i++) { indexedJoints.Add(null); } foreach (KeyValuePair <string, KeyBlob> kv in keyBlobs) { QJoint curJoint = FindJointByName(kv.Key); int curidx = curJoint.index; indexedJoints[curidx] = curJoint; } for (int i = 0; i < numJoints; i++) { QJoint joint = indexedJoints[i]; KeyBlob blob = keyBlobs[joint.name]; int[] jointDataArgs = new int[20]; for (int j = 0; j < 10; j++) { string attribName = "m_LocalPosition.x"; switch (j) { case (1): attribName = "m_LocalPosition.y"; break; case (2): attribName = "m_LocalPosition.z"; break; case (3): attribName = "m_LocalRotation.x"; break; case (4): attribName = "m_LocalRotation.y"; break; case (5): attribName = "m_LocalRotation.z"; break; case (6): attribName = "m_LocalRotation.w"; break; case (7): attribName = "m_LocalScale.x"; break; case (8): attribName = "m_LocalScale.y"; break; case (9): attribName = "m_LocalScale.z"; break; } SortedList <float, ScalarFrame> frames = blob.keyedAttributes[attribName].values; jointDataArgs[j * 2] = result.keyframes[j].Count; jointDataArgs[j * 2 + 1] = frames.Count; for (int k = 0; k < frames.Count; k++) { float time = frames.Keys[k]; ScalarFrame frame = frames.Values[k]; KeyFrame newFrame = new KeyFrame(time, frame.value); result.keyframes[j].Add(newFrame); } } int numChildren = NumChildren(i); Matrix4x4 bindPose = model.bindposes[i]; result.jointData[i] = new JointData(jointDataArgs, numChildren, bindPose); } return(result); }