public static bool OverwriteTextureData(int index, GHGParameters ghg, string ghgPath, byte[] data)
 {
     using (FileStream fw = File.OpenWrite(ghgPath)) {
         try {
             fw.Seek(ghg.texOffsets[index] + 24, SeekOrigin.Begin);
             fw.Write(data, 0, data.Length);
             Console.WriteLine("Successfully overwrote image.");
             return(true);
         } catch (Exception e) {
             Console.WriteLine("Failed to write to GHG file.");
             throw e;
         }
     }
 }
 public static bool OverwriteTexture(int index, GHGParameters ghg, string ghgPath, string ddsPath)
 {
     using (FileStream fr = File.OpenRead(ddsPath)) {
         using (FileStream fw = File.OpenWrite(ghgPath)) {
             byte[] array = new byte[ghg.texSizes[index]];
             try {
                 fr.Read(array, 0, array.Length);
                 try {
                     fw.Seek(ghg.texOffsets[index] + 24, SeekOrigin.Begin);
                     fw.Write(array, 0, array.Length);
                     Console.WriteLine("Successfully overwrote image.");
                     return(true);
                 } catch (Exception e) {
                     Console.WriteLine("Failed to write to GHG file.");
                     throw e;
                 }
             } catch (Exception e) {
                 Console.WriteLine("Failed to read DDS file.");
                 throw e;
             }
         }
     }
 }
        public static void LoadModel(string path, out GHGParameters ghg)
        {
            using (FileStream fs = File.OpenRead(path)) {
                ghg = new GHGParameters();
                Stack <long> stack = new Stack <long>();
                int          NU20  = fs.ReadInt32();
                if (NU20 == 0x3032554e)
                {
                }
                else
                {
                    fs.Seek(NU20 + 0x4, SeekOrigin.Begin);
                    fs.Seek(0x4, SeekOrigin.Current);
                }

                fs.Seek(0x18, SeekOrigin.Current);
                int  offsetGSNH    = fs.ReadInt32();
                long absOffsetGSNH = fs.Position + offsetGSNH;

                int numberImages = 0;
                fs.Seek(absOffsetGSNH, SeekOrigin.Begin);
                numberImages = fs.ReadInt32();
                long absOffsetImagesMeta = fs.Position + fs.ReadInt32();

                fs.Seek(absOffsetImagesMeta, SeekOrigin.Begin);
                if (NU20 == 0x3032554e)
                {
                }
                else
                {
                    int numberRealImages = 0;
                    for (int i = 0; i < numberImages; i++)
                    {
                        int tmp = fs.ReadInt32();
                        stack.Push(fs.Position);
                        fs.Seek(tmp - 4, SeekOrigin.Current);
                        int width  = fs.ReadInt32();
                        int height = fs.ReadInt32();
                        if (width != 0 && height != 0)
                        {
                            numberRealImages++;
                        }
                        fs.Seek(stack.Pop(), SeekOrigin.Begin);
                    }
                    fs.Seek(6, SeekOrigin.Begin);
                    ghg.texCount   = numberRealImages;
                    ghg.texOffsets = new long[numberRealImages];
                    ghg.texSizes   = new int[numberRealImages];
                    ghg.texData    = new byte[numberRealImages][];
                    ghg.texWidths  = new int[numberRealImages];
                    ghg.texHeights = new int[numberRealImages];
                    for (int i = 0; i < numberRealImages; i++)
                    {
                        long pos    = fs.Position;
                        int  width  = fs.ReadInt32();
                        int  height = fs.ReadInt32();
                        fs.ReadInt32();
                        fs.ReadInt32();
                        fs.ReadInt32();
                        int size = fs.ReadInt32();
                        ghg.texOffsets[i] = pos;
                        ghg.texSizes[i]   = size;
                        ghg.texWidths[i]  = width;
                        ghg.texHeights[i] = height;
                        Console.WriteLine("Image " + i + " found at " + pos.ToString("X8") + ": width = " + width + ", height = " + height);
                        ghg.texData[i] = new byte[size];
                        fs.Read(ghg.texData[i], 0, size);
                    }
                }
            }
        }