public static TextureMapChange read(BinaryReader binaryReader)
        {
            TextureMapChange newObj = new TextureMapChange();

            newObj.part_index = binaryReader.ReadByte();
            newObj.old_tex_id = Util.readDataIDOfKnownType(0x5000000, binaryReader);
            newObj.new_tex_id = Util.readDataIDOfKnownType(0x5000000, binaryReader);
            return(newObj);
        }
        public static ObjDesc read(BinaryReader binaryReader)
        {
            ObjDesc newObj = new ObjDesc();

            binaryReader.ReadByte(); // Unk, should always be == 17

            byte numPalettes = binaryReader.ReadByte();
            byte numTMCs     = binaryReader.ReadByte();
            byte numAPCs     = binaryReader.ReadByte();

            if (numPalettes > 0)
            {
                newObj.paletteID = Util.readDataIDOfKnownType(0x4000000, binaryReader);
                for (int i = 0; i < numPalettes; ++i)
                {
                    newObj.subpalettes.Add(Subpalette.read(binaryReader));
                }
            }

            if (numTMCs > 0)
            {
                for (int i = 0; i < numTMCs; ++i)
                {
                    newObj.tmChanges.Add(TextureMapChange.read(binaryReader));
                }
            }

            if (numAPCs > 0)
            {
                for (int i = 0; i < numAPCs; ++i)
                {
                    newObj.apChanges.Add(AnimPartChange.read(binaryReader));
                }
            }

            Util.readToAlign(binaryReader);

            return(newObj);
        }