public bool LoadAllGestureConfig()
        {
            if (!Directory.Exists(GESTURE_DATABASE_DIR))
            {
                return(false);
            }

            GESTURE_LIST.Clear();
            GESTURE_CONFIG.Clear();

            // look for config xml file under database root directory: XXX.xml
            IEnumerable <string> gesture_config_files = Directory.EnumerateFiles(GESTURE_DATABASE_DIR, "*.xml");
            int gid = 0;

            foreach (string g_cfile in gesture_config_files)
            {
                // get gesture name
                int    slash_id     = g_cfile.LastIndexOf('\\');
                string gesture_name = g_cfile.Substring(slash_id + 1, g_cfile.Length - slash_id - 5);

                // add to list
                GESTURE_LIST.Add(gid, gesture_name);

                // read configuration file
                GestureTemplateBase cur_basis = LoadGestureConfig(g_cfile, gid);

                GESTURE_CONFIG.Add(gid, cur_basis);

                gid++;
            }

            return(true);
        }
        public GestureTemplateBase LoadGestureConfig(string filename, int gid)
        {
            if (!File.Exists(filename))
            {
                return(null);
            }

            GestureTemplateBase basis = new GestureTemplateBase();

            XmlDocument doc = new XmlDocument();

            doc.Load(filename);

            XmlElement root = doc.DocumentElement;

            basis.name = root.Attributes["name"].Value;
            basis.id   = gid;
            for (int i = 0; i < root.ChildNodes.Count; i++)
            {
                XmlElement joint_elem = root.ChildNodes[i] as XmlElement;
                int        jtype      = int.Parse(joint_elem.Attributes["typeid"].Value);
                JointType  type       = (JointType)jtype;
                float      weight     = float.Parse(joint_elem.Attributes["weight"].Value);
                basis.jointWeights[type] = weight;
            }

            return(basis);
        }
        public bool SaveGestureConfig(GestureTemplateBase config)
        {
            // write config file for each gesture model
            // format: <Gesture name = "">
            //              <Joint type="" weight=""></Joint>
            //         </Gesture>
            string filename = GESTURE_DATABASE_DIR + config.name + ".xml";

            XmlDocument    xmldoc = new XmlDocument();
            XmlDeclaration declar = xmldoc.CreateXmlDeclaration("1.0", null, null);

            xmldoc.AppendChild(declar);
            // create root element
            XmlElement root = xmldoc.CreateElement("Gesture");

            root.SetAttribute("name", config.name);
            xmldoc.AppendChild(root);

            #region output_joint_weights

            // add joints
            foreach (JointType joint_type in config.jointWeights.Keys)
            {
                XmlElement joint_elem = xmldoc.CreateElement("Joint");
                root.AppendChild(joint_elem);

                joint_elem.SetAttribute("type", joint_type.ToString());
                int jtype = (int)joint_type;
                joint_elem.SetAttribute("typeid", jtype.ToString());
                joint_elem.SetAttribute("weight", config.jointWeights[joint_type].ToString());
            }

            #endregion

            // save to disk
            xmldoc.Save(filename);

            return(true);
        }
        /// <summary>
        /// gesture config management
        /// </summary>
        public bool AddGestureConfig(GestureTemplateBase gbase)
        {
            string gdir = GESTURE_DATABASE_DIR + gbase.name;

            // save config file
            string gfilename = GESTURE_DATABASE_DIR + gbase.name + ".xml";

            SaveGestureConfig(gbase);

            // create new directory
            if (!Directory.Exists(gdir))
            {
                Directory.CreateDirectory(gdir);
            }

            int max_id = (GESTURE_LIST.Keys.Count > 0 ? GESTURE_LIST.Keys.Max() : -1);

            gbase.id = max_id + 1;
            GESTURE_LIST.Add(max_id + 1, gbase.name);
            GESTURE_CONFIG.Add(max_id + 1, gbase);

            return(true);
        }
        public bool SaveGestureConfig(GestureTemplateBase config)
        {
            // write config file for each gesture model
            // format: <Gesture name = "">
            //              <Joint type="" weight=""></Joint>
            //         </Gesture>
            string filename = GESTURE_DATABASE_DIR + config.name + ".xml";

            XmlDocument xmldoc = new XmlDocument();
            XmlDeclaration declar = xmldoc.CreateXmlDeclaration("1.0", null, null);
            xmldoc.AppendChild(declar);
            // create root element
            XmlElement root = xmldoc.CreateElement("Gesture");
            root.SetAttribute("name", config.name);
            xmldoc.AppendChild(root);

            #region output_joint_weights

            // add joints
            foreach (JointType joint_type in config.jointWeights.Keys)
            {
                XmlElement joint_elem = xmldoc.CreateElement("Joint");
                root.AppendChild(joint_elem);

                joint_elem.SetAttribute("type", joint_type.ToString());
                int jtype = (int)joint_type;
                joint_elem.SetAttribute("typeid", jtype.ToString());
                joint_elem.SetAttribute("weight", config.jointWeights[joint_type].ToString());
            }

            #endregion

            // save to disk
            xmldoc.Save(filename);

            return true;
        }
        public GestureTemplateBase LoadGestureConfig(string filename, int gid)
        {
            if (!File.Exists(filename))
                return null;

            GestureTemplateBase basis = new GestureTemplateBase();

            XmlDocument doc = new XmlDocument();
            doc.Load(filename);

            XmlElement root = doc.DocumentElement;
            basis.name = root.Attributes["name"].Value;
            basis.id = gid;
            for (int i = 0; i < root.ChildNodes.Count; i++)
            {
                XmlElement joint_elem = root.ChildNodes[i] as XmlElement;
                int jtype = int.Parse(joint_elem.Attributes["typeid"].Value);
                JointType type = (JointType)jtype;
                float weight = float.Parse(joint_elem.Attributes["weight"].Value);
                basis.jointWeights[type] = weight;
            }

            return basis;
        }
        /// <summary>
        /// gesture config management
        /// </summary>
        public bool AddGestureConfig(GestureTemplateBase gbase)
        {
            string gdir = GESTURE_DATABASE_DIR + gbase.name;

            // save config file
            string gfilename = GESTURE_DATABASE_DIR + gbase.name + ".xml";
            SaveGestureConfig(gbase);

            // create new directory
            if (!Directory.Exists(gdir))
                Directory.CreateDirectory(gdir);

            int max_id = (GESTURE_LIST.Keys.Count > 0 ? GESTURE_LIST.Keys.Max() : -1);
            gbase.id = max_id + 1;
            GESTURE_LIST.Add(max_id+1, gbase.name);
            GESTURE_CONFIG.Add(max_id + 1, gbase);

            return true;
        }