Example #1
0
        private void ReadImageRaw(int off)
        {
            if (TextureTFCs == null || TextureTFCs.Count < 1)
            {
                return;
            }
            int        size = (int)TextureTFCs[TextureTFCs.Count - 1].size;
            TextureRef t    = TextureTFCs[TextureTFCs.Count - 1];

            t.offset  = (uint)off;
            t.InCache = false;
            TextureTFCs[TextureTFCs.Count - 1] = t;
            ImageRaw = new byte[size];
            if (off + size >= memory.Length)
            {
                return;
            }
            for (int i = 0; i < size; i++)
            {
                ImageRaw[i] = memory[off + i];
            }
            ImageF  = new ImageFile(ImageRaw, T2D.PixelFormat, T2D.SizeX, T2D.SizeY);
            currpos = off + size;
        }
Example #2
0
        public void ImportFromFile(int tfc)
        {
            OpenFileDialog Dialog = new OpenFileDialog();

            if (T2D.PixelFormat == "PF_DXT1\0" ||
                T2D.PixelFormat == "PF_DXT5\0")
            {
                Dialog.Filter = "DDS Files (*.dds)|*.dds";
            }
            if (T2D.PixelFormat == "PF_G8\0" ||
                T2D.PixelFormat == "PF_V8U8\0" ||
                T2D.PixelFormat == "PF_A8R8G8B8\0")
            {
                Dialog.Filter = "TGA Files (*.tga)|*.tga";
            }
            int format = -1;

            if (T2D.PixelFormat == "PF_DXT1\0")
            {
                format = 0;
            }
            if (T2D.PixelFormat == "PF_DXT5\0")
            {
                format = 1;
            }
            if (T2D.PixelFormat == "PF_V8U8\0")
            {
                format = 2;
            }
            if (T2D.PixelFormat == "PF_A8R8G8B8\0")
            {
                format = 3;
            }
            if (T2D.PixelFormat == "PF_G8\0")
            {
                format = 4;
            }
            if (!TextureTFCs[tfc].InCache)
            {
                if (Dialog.ShowDialog() == DialogResult.OK)
                {
                    if (format == 0 || format == 1)
                    {
                        ImageFile t = new ImageFile();
                        t.ImportFromFile(Dialog.FileName);
                        if (t.ImageSizeX == TextureTFCs[tfc].sizeX &&
                            t.ImageSizeY == TextureTFCs[tfc].sizeY &&
                            t.ImageFormat == format &&
                            t.memsize == TextureTFCs[tfc].size)
                        {
                            for (int i = 0; i < t.memsize; i++)
                            {
                                memory[TextureTFCs[tfc].offset + i] = t.memory[i];
                            }
                            MessageBox.Show("Done.");
                        }
                    }
                    if (format > 1 && format < 5)
                    {
                        ImageFile t = new ImageFile();
                        t.ImportFromFile(Dialog.FileName);
                        if (t.ImageSizeX == TextureTFCs[tfc].sizeX &&
                            t.ImageSizeY == TextureTFCs[tfc].sizeY)
                        {
                            if (t.ImageBits != 32)
                            {
                                MessageBox.Show("Please use 32 bit Targa image!");
                            }
                            else
                            {
                                switch (format)
                                {
                                case 2:
                                    for (int i = 0; i < t.memsize / 4; i++)
                                    {
                                        memory[TextureTFCs[tfc].offset + i * 2]     = t.memory[i * 4];
                                        memory[TextureTFCs[tfc].offset + i * 2 + 1] = t.memory[i * 4 + 2];
                                    }
                                    break;

                                case 3:
                                    for (int i = 0; i < t.memsize; i++)
                                    {
                                        memory[TextureTFCs[tfc].offset + i] = t.memory[i];
                                    }
                                    break;

                                case 4:
                                    for (int i = 0; i < t.memsize / 4; i++)
                                    {
                                        memory[TextureTFCs[tfc].offset + i] = t.memory[i * 4];
                                    }
                                    break;
                                }
                                MessageBox.Show("Done.");
                            }
                        }
                    }
                }
            }
            else
            if (Dialog.ShowDialog() == DialogResult.OK)
            {
                ImageFile t = new ImageFile();
                t.ImportFromFile(Dialog.FileName);
                if ((format == 0 || format == 1) && t.ImageFormat == format)
                {
                    if (t.ImageSizeX == TextureTFCs[tfc].sizeX &&
                        t.ImageSizeY == TextureTFCs[tfc].sizeY)
                    {
                        TFCFile TFCf = new TFCFile(T2D.Tsource);
                        byte[]  buff;
                        if (TFCf.isTFCCompressed())
                        {
                            buff = ZBlock.Compress(t.memory);
                        }
                        else
                        {
                            buff = t.memory;
                        }
                        byte[] buff2 = BitConverter.GetBytes(TFCf.getFileSize());
                        for (int i = 0; i < 4; i++)
                        {
                            memory[TextureTFCs[tfc].HeaderOffset + 20 + i] = buff2[i];
                        }
                        buff2 = BitConverter.GetBytes(buff.Length);
                        for (int i = 0; i < 4; i++)
                        {
                            memory[TextureTFCs[tfc].HeaderOffset + 16 + i] = buff2[i];
                        }
                        TFCf.AppendToTFC(buff);
                        int size = TFCf.getFileSize();
                        if (size != -1)
                        {
                            TOCeditor tc = new TOCeditor();
                            if (!tc.UpdateFile(T2D.Tsource + ".tfc", (uint)size))
                            {
                                MessageBox.Show("Didn't found Entry");
                            }
                            tc.Close();
                        }
                    }
                    else
                    {
                        System.Windows.Forms.DialogResult m = MessageBox.Show("The size doesn't match, import anyway?", "ME3 Explorer", MessageBoxButtons.YesNo);
                        if (m == DialogResult.Yes)
                        {
                            TFCFile TFCf = new TFCFile(T2D.Tsource);
                            byte[]  buff;
                            if (TFCf.isTFCCompressed())
                            {
                                buff = ZBlock.Compress(t.memory);
                            }
                            else
                            {
                                buff = t.memory;
                            }
                            byte[] buff2 = BitConverter.GetBytes(TFCf.getFileSize());
                            for (int i = 0; i < 4; i++)
                            {
                                memory[TextureTFCs[tfc].HeaderOffset + 20 + i] = buff2[i];
                            }
                            buff2 = BitConverter.GetBytes(buff.Length);
                            for (int i = 0; i < 4; i++)
                            {
                                memory[TextureTFCs[tfc].HeaderOffset + 16 + i] = buff2[i];
                            }
                            if (tfc == 0)
                            {
                                buff2 = BitConverter.GetBytes(t.ImageSizeX);
                                for (int i = 0; i < 4; i++)
                                {
                                    memory[T2D.offSizeX + i] = buff2[i];
                                }
                                buff2 = BitConverter.GetBytes(t.ImageSizeY);
                                for (int i = 0; i < 4; i++)
                                {
                                    memory[T2D.offSizeY + i] = buff2[i];
                                }
                            }
                            else
                            {
                                buff2 = BitConverter.GetBytes(t.ImageSizeX * 2);
                                for (int i = 0; i < 4; i++)
                                {
                                    memory[TextureTFCs[tfc].HeaderOffset + i] = buff2[i];
                                }
                                buff2 = BitConverter.GetBytes(t.ImageSizeY * 2);
                                for (int i = 0; i < 4; i++)
                                {
                                    memory[TextureTFCs[tfc].HeaderOffset + 4 + i] = buff2[i];
                                }
                                TFCf.AppendToTFC(buff);
                            }
                            TFCf.AppendToTFC(buff);
                            int size = TFCf.getFileSize();
                            if (size != -1)
                            {
                                TOCeditor tc = new TOCeditor();
                                if (!tc.UpdateFile(T2D.Tsource + ".tfc", (uint)size))
                                {
                                    MessageBox.Show("Didn't found Entry");
                                }
                                tc.Close();
                            }
                        }
                    }
                }
                if (format > 1 && format < 5)
                {
                    if (t.ImageSizeX == TextureTFCs[tfc].sizeX &&
                        t.ImageSizeY == TextureTFCs[tfc].sizeY)
                    {
                        if (t.ImageBits != 32)
                        {
                            MessageBox.Show("Please use 32 bit Targa image!");
                        }
                        else
                        {
                            byte[] buf = new byte[0];
                            switch (format)
                            {
                            case 2:
                                buf = new byte[t.memsize / 2];
                                for (int i = 0; i < t.memsize / 4; i++)
                                {
                                    buf[i * 2]     = t.memory[i * 4];
                                    buf[i * 2 + 1] = t.memory[i * 4 + 2];
                                }
                                break;

                            case 3:
                                buf = t.memory;
                                break;

                            case 4:
                                buf = new byte[t.memsize / 4];
                                for (int i = 0; i < t.memsize / 4; i++)
                                {
                                    buf[i] = t.memory[i * 4];
                                }
                                break;
                            }
                            TFCFile TFCf = new TFCFile(T2D.Tsource);
                            byte[]  buff;
                            if (TFCf.isTFCCompressed())
                            {
                                buff = ZBlock.Compress(t.memory);
                            }
                            else
                            {
                                buff = t.memory;
                            }
                            byte[] buff2 = BitConverter.GetBytes(TFCf.getFileSize());
                            for (int i = 0; i < 4; i++)
                            {
                                memory[TextureTFCs[tfc].HeaderOffset + 20 + i] = buff2[i];
                            }
                            buff2 = BitConverter.GetBytes(buff.Length);
                            for (int i = 0; i < 4; i++)
                            {
                                memory[TextureTFCs[tfc].HeaderOffset + 12 + i] = buff2[i];
                            }
                            TFCf.AppendToTFC(buff);
                            int size = TFCf.getFileSize();
                            if (size != -1)
                            {
                                TOCeditor tc = new TOCeditor();
                                if (!tc.UpdateFile(T2D.Tsource + ".tfc", (uint)size))
                                {
                                    MessageBox.Show("Didn't found Entry");
                                }
                                tc.Close();
                            }
                            MessageBox.Show("Done.");
                        }
                    }
                }
            }
        }