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);
        }
    }
Пример #2
0
        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);
        }