public static void SaveMatrixAnimationData(ColladaAnimationData data, string SourceFilePath, string DestFilePath)
        {
            int totalFrameCount = data.frameTimelapse.Count;

            XmlDocument colladaDocument = new XmlDocument();

            colladaDocument.Load(SourceFilePath);

            if (colladaDocument.DocumentElement == null)
            {
                // TODO: Return if document not found, gracefully.
                return;
            }

            XmlNode root = colladaDocument.DocumentElement;
            XmlNode library_animation = colladaDocument.CreateElement("library_animations");

            root.AppendChild(library_animation);

            for (int i = 0; i < data.joints.Count; i++)
            {
                XmlNode animationParent = colladaDocument.CreateElement("animation");
                library_animation.AppendChild(animationParent);

                XmlAttribute animationParentIdAttribute = colladaDocument.CreateAttribute("id");
                animationParentIdAttribute.Value = string.Format("{0}-anim", data.joints[i]);
                animationParent.Attributes.Append(animationParentIdAttribute);
                XmlAttribute animationParentNameAttribute = colladaDocument.CreateAttribute("name");
                animationParentNameAttribute.Value = data.joints[i];
                animationParent.Attributes.Append(animationParentNameAttribute);

                XmlNode animationChild = colladaDocument.CreateElement("animation");
                animationParent.AppendChild(animationChild);

                // Add input source node
                XmlNode sourceInput = createInputSourceElement(colladaDocument, data.joints[i], totalFrameCount, data.frameTimelapse);
                animationChild.AppendChild(sourceInput);

                // Add output source node
                XmlNode sourceOutput = createOutputSourceElement(colladaDocument, data.joints[i], totalFrameCount, data.jointValues[data.joints[i]]);
                animationChild.AppendChild(sourceOutput);

                // Add interp source node
                XmlNode sourceInterp = createInterpolationsSourceElement(colladaDocument, data.joints[i], totalFrameCount, "LINEAR");
                animationChild.AppendChild(sourceInterp);

                // Add sampler node
                XmlNode sampler = createSamplerElement(colladaDocument, data.joints[i]);
                animationChild.AppendChild(sampler);

                // Add channel node
                XmlNode channel = createChannelElement(colladaDocument, data.joints[i]);
                animationChild.AppendChild(channel);
            }

            colladaDocument.Save(DestFilePath);
        }
 /// <summary>
 /// Save the animation Data
 /// </summary>
 public static void SaveAnimationData(ColladaAnimationData data, string SourceFilePath, string DestFilePath, bool isMatrix)
 {
     if (isMatrix)
     {
         SaveMatrixAnimationData(data, SourceFilePath, DestFilePath);
     }
     else
     {
         SaveComponentAnimationData(data, SourceFilePath, DestFilePath);
     }
 }
        public static void SaveComponentAnimationData(ColladaAnimationData data, string SourceFilePath, string DestFilePath)
        {
            int         totalFrameCount = data.frameTimelapse.Count;
            XmlDocument colladaDocument = new XmlDocument();

            colladaDocument.Load(SourceFilePath);

            if (colladaDocument.DocumentElement == null)
            {
                // TODO: Return if document not found, gracefully.
                return;
            }

            XmlNode root = colladaDocument.DocumentElement;
            XmlNode library_animation = colladaDocument.CreateElement("library_animations");

            root.AppendChild(library_animation);

            foreach (string jointId in data.joints)
            {
                for (int j = 0; j < 6; j++)
                {
                    string values = data.jointTranslateX[jointId];
                    string prefix = "translate.X";
                    if (j == 1)
                    {
                        prefix = "translate.Y";
                        values = data.jointTranslateY[jointId];
                    }
                    else if (j == 2)
                    {
                        prefix = "translate.Z";
                        values = data.jointTranslateZ[jointId];
                    }
                    else if (j == 3)
                    {
                        prefix = "rotateX.ANGLE";
                        values = data.jointRotateX[jointId];
                    }
                    else if (j == 4)
                    {
                        prefix = "rotateY.ANGLE";
                        values = data.jointRotateY[jointId];
                    }
                    else if (j == 5)
                    {
                        prefix = "rotateZ.ANGLE";
                        values = data.jointRotateZ[jointId];
                    }
                    XmlNode animationChild = colladaDocument.CreateElement("animation");
                    library_animation.AppendChild(animationChild);

                    // Add input source node
                    XmlNode sourceInput = createComponentInputSourceElement(colladaDocument, jointId, totalFrameCount, data.frameTimelapse, prefix);
                    animationChild.AppendChild(sourceInput);

                    // Add output source node
                    XmlNode sourceOutput = createComponentOutputSourceElement(colladaDocument, jointId, totalFrameCount, values, prefix);
                    animationChild.AppendChild(sourceOutput);

                    // Add interp source node
                    XmlNode sourceInterp = createComponentInterpolationsSourceElement(colladaDocument, jointId, totalFrameCount, "LINEAR", prefix);
                    animationChild.AppendChild(sourceInterp);

                    // Add intan node?
                    // Add out-tan node?

                    // Add sampler node
                    XmlNode sampler = createComponentSamplerElement(colladaDocument, jointId, prefix);
                    animationChild.AppendChild(sampler);

                    // Add channel node
                    XmlNode channel = createComponentChannelElement(colladaDocument, jointId, prefix);
                    animationChild.AppendChild(channel);
                }
            }

            colladaDocument.Save(DestFilePath);
        }