public void Decode(string tg, CfgData data)
        {
            switch (tg)
            {
            case "pn": data.DecodeInto(out perNodeConfigs); break;

            case "pnc": perNodeConfigConditional.Decode(data); break;
            }
        }
        public override void Decode(string key, CfgData data)
        {
            switch (key)
            {
            case "vrt": data.ToList(out meshPoints); break;

            case "tri": data.ToList(out triangles); break;

            case "n": meshName = data.ToString(); break;

            case "grM": data.ToInt(ref maxGroupIndex); break;

            case "sub": data.ToInt(ref subMeshCount); break;

            case "wei": gotBoneWeights = data.ToBool(); break;

            case "gcls": data.DecodeInto(out groupColors); break;

            case "bv": data.ToList(out baseVertex); break;

            case "biP": data.Decode_Array(out bindPoses); break;

            case "UV2dR": data.ToInt(ref uv2DistributeRow); break;

            case "UV2cur": data.ToInt(ref uv2DistributeCurrent); break;

            case "sctdUV":
                selectedUv = meshPoints[data.ToInt(0)].vertices[0]; break;

            case "sctdTris":
                selectedTriangle = triangles[data.ToInt(0)]; break;

            default:
                if (MeshToolBase.AllTools.IsNullOrEmpty())
                {
                    break;
                }

                foreach (var t in MeshToolBase.allToolsWithPerMeshData)
                {
                    var mt = t as MeshToolBase;
                    if (mt == null || !mt.StdTag.Equals(key))
                    {
                        continue;
                    }
                    mt.DecodeFull(data);
                    break;
                }
                break;
            }
        }