public void ParseFile(string assetpath, ParseClassCallbackType cb)
    {
        FileStream fs = new FileStream(assetpath, FileMode.Open, FileAccess.Read, System.IO.FileShare.Read);

        BinaryReader br = new BinaryReader(fs);

        bool processing = true;

        while (processing)
        {
            string classname = MegaParse.ReadString(br);

            if (classname == "Done")
            {
                break;
            }

            int  chunkoff = br.ReadInt32();
            long fpos     = fs.Position;

            cb(classname, br);

            fs.Position = fpos + chunkoff;
        }

        br.Close();
    }
    public bool ParseTarget(BinaryReader br, string id)
    {
        switch (id)
        {
        case "Name":    currentTarget.name = MegaParse.ReadString(br); break;

        case "Percent": currentTarget.percent = br.ReadSingle(); break;

        case "MoPoints":
            int count = br.ReadInt32();

            if (count > 0)
            {
                currentTarget.loadpoints = new MOPoint[count];

                for (int i = 0; i < count; i++)
                {
                    MOPoint p = new MOPoint();
                    p.id = br.ReadInt32();                              // we need to find the ids for this point (could be more than one)
                    p.p  = ConvertPoint(MegaParse.ReadP3(br));

                    p.w = br.ReadSingle();
                    currentTarget.loadpoints[i] = p;
                }
            }
            break;
        }

        return(true);
    }
    public bool ParseChan(BinaryReader br, string id)
    {
        //Debug.Log("ParseChan " + id);

        switch (id)
        {
        case "Target":          currentChan.mTargetCache.Add(LoadTarget(br)); break;

        case "Name":            currentChan.mName = MegaParse.ReadString(br); break;

        case "Percent":         currentChan.Percent = br.ReadSingle(); break;

        case "SpinMax":         currentChan.mSpinmax = br.ReadSingle(); break;

        case "SpinMin":         currentChan.mSpinmin = br.ReadSingle(); break;

        case "UseLim":          currentChan.mUseLimit = (br.ReadInt32() == 1); break;

        case "Override":        currentChan.mActiveOverride = (br.ReadInt32() == 1); break;

        case "Curve":           currentChan.mCurvature = br.ReadSingle(); break;
            //case "Anim":		currentChan.control = LoadAnim(br);	break;
        }

        return(true);
    }
    //public delegate bool ParseBinCallbackType(BinaryReader br, string id);
    //public delegate void ParseClassCallbackType(string classname, BinaryReader br);

    static public void Parse(BinaryReader br, ParseBinCallbackType cb)
    {
        bool readchunk = true;

        while (readchunk)
        {
            string id = MegaParse.ReadString(br);

            if (id == "eoc")
            {
                break;
            }

            int skip = br.ReadInt32();

            long fpos = br.BaseStream.Position;

            if (!cb(br, id))
            {
                Debug.Log("Error Loading chunk id " + id);
                readchunk = false;                      // done
                break;
            }

            br.BaseStream.Position = fpos + skip;
        }
    }
    public bool ParseTarget(BinaryReader br, string id)
    {
        //Debug.Log("ParseTarget " + id);
        switch (id)
        {
        case "Name":    currentTarget.name = MegaParse.ReadString(br);  break;

        case "Percent": currentTarget.percent = br.ReadSingle(); break;

        case "TPoints": currentTarget.points = MegaParse.ReadP3v(br); ConvertPoints(currentTarget.points); break;

        case "MoPoints":
            Debug.Log("Got morpho points");
            break;
        }

        return(true);
    }