void ReadTexture(int size, SectionType type)
        {
            int position = (int)fin.BaseStream.Position;

            fin.BaseStream.Seek(8, SeekOrigin.Current);

            byte[] diffuseTextureName = new byte[32];
            byte[] alphaTextureName   = new byte[32];
            fin.Read(diffuseTextureName, 0, diffuseTextureName.Length);
            fin.Read(alphaTextureName, 0, alphaTextureName.Length);

            var texture = new GTATextureLoader(fin).Load();

            Func <byte[], string> ToFullName = delegate(byte[] name)
            {
                int nilIdx  = Array.IndexOf(name, (byte)0);
                int nameLen = nilIdx == -1 ? name.Length : nilIdx;
                return((txdName + "/" + Encoding.ASCII.GetString(name, 0, nameLen) + ".gtatexture").ToLower());
            };

            files[ToFullName(diffuseTextureName)] = texture;

            if (alphaTextureName[0] != 0)
            {
                files[ToFullName(alphaTextureName)] = texture;
            }

            ++processedTextures;
        }
        /// <summary>
        /// Распаковывает все текстуры (*.gtatexture) в directoryPath (и подкаталогах).
        /// Распакованные изображения сохраняются рядом в файл с таким же именем и одним из графических расширений.
        /// </summary>
        public static void UnpackAllTextures(string directoryPath)
        {
            int success = 0, fail = 0;
             using (Log.Instance.EnterStage("Unpacking all textures in directory " + directoryPath))
             {
            foreach (var file in Directory.GetFiles(directoryPath, "*.gtatexture", SearchOption.AllDirectories))
            {
               try
               {
                  using (Log.Instance.EnterStage("Unpacking texture: " + file.Substring(directoryPath.Length)))
                  {
                     GTATextureLoader textureLoader = new GTATextureLoader(new BinaryReader(new FileStream(file, FileMode.Open)));
                     Texture2D texture = textureLoader.Load();
                     texture.Save(file.Substring(0, file.LastIndexOf('.')) + ".png", ImageFileFormat.Png);

                     ++success;
                     Log.Instance.Print("success!");
                  }
               }
               catch (Exception er)
               {
                  Log.Instance.Print("Failed to load texture. Exception: " + er.Message, MessageType.Error);
                  ++fail;
               }
            }
             }
             Log.Instance.Print(String.Format("Finished textures processing. Successes: {0}, failes: {1}", success, fail));
        }
        /// <summary>
        /// Распаковывает все текстуры (*.gtatexture) в directoryPath (и подкаталогах).
        /// Распакованные изображения сохраняются рядом в файл с таким же именем и одним из графических расширений.
        /// </summary>
        public static void UnpackAllTextures(string directoryPath)
        {
            int success = 0, fail = 0;

            using (Log.Instance.EnterStage("Unpacking all textures in directory " + directoryPath))
            {
                foreach (var file in Directory.GetFiles(directoryPath, "*.gtatexture", SearchOption.AllDirectories))
                {
                    try
                    {
                        using (Log.Instance.EnterStage("Unpacking texture: " + file.Substring(directoryPath.Length)))
                        {
                            GTATextureLoader textureLoader = new GTATextureLoader(new BinaryReader(new FileStream(file, FileMode.Open)));
                            Texture2D        texture       = textureLoader.Load();
                            texture.Save(file.Substring(0, file.LastIndexOf('.')) + ".png", ImageFileFormat.Png);

                            ++success;
                            Log.Instance.Print("success!");
                        }
                    }
                    catch (Exception er)
                    {
                        Log.Instance.Print("Failed to load texture. Exception: " + er.Message, MessageType.Error);
                        ++fail;
                    }
                }
            }
            Log.Instance.Print(String.Format("Finished textures processing. Successes: {0}, failes: {1}", success, fail));
        }
        void ReadTexture(int size, SectionType type)
        {
            int position = (int)fin.BaseStream.Position;
             fin.BaseStream.Seek(8, SeekOrigin.Current);

             byte[] diffuseTextureName = new byte[32];
             byte[] alphaTextureName = new byte[32];
             fin.Read(diffuseTextureName, 0, diffuseTextureName.Length);
             fin.Read(alphaTextureName, 0, alphaTextureName.Length);

             var texture = new GTATextureLoader(fin).Load();

             Func<byte[], string> ToFullName = delegate(byte[] name)
             {
            int nilIdx = Array.IndexOf(name, (byte)0);
            int nameLen = nilIdx == -1 ? name.Length : nilIdx;
            return (txdName + "/" + Encoding.ASCII.GetString(name, 0, nameLen) + ".gtatexture").ToLower();
             };

             files[ToFullName(diffuseTextureName)] = texture;

             if (alphaTextureName[0] != 0)
            files[ToFullName(alphaTextureName)] = texture;

             ++processedTextures;
        }