private void ReadGameCubeData(BinaryReader binaryReader)
        {
            binaryReader.BaseStream.Position += 2;
            byte addressMode = binaryReader.ReadByte();

            addressModeU = (TextureAddressMode)((addressMode & 0xF0) >> 4);
            addressModeV = (TextureAddressMode)(addressMode & 0x0F);
            filterMode   = (TextureFilterMode)binaryReader.ReadByte();

            gcnUnknown1 = Shared.Switch(binaryReader.ReadInt32());
            gcnUnknown2 = Shared.Switch(binaryReader.ReadInt32());
            gcnUnknown3 = Shared.Switch(binaryReader.ReadInt32());
            gcnUnknown4 = Shared.Switch(binaryReader.ReadInt32());

            textureName = ReadString(binaryReader);
            alphaName   = ReadString(binaryReader);

            if (ReadFileMethods.treatStuffAsByteArray)
            {
                sectionData = binaryReader.ReadBytes((int)(sectionSize - (binaryReader.BaseStream.Position - startSectionPosition)));
                return;
            }

            rasterFormatFlags = (TextureRasterFormat)Shared.Switch(binaryReader.ReadInt32());
            width             = Shared.Switch(binaryReader.ReadInt16());
            height            = Shared.Switch(binaryReader.ReadInt16());

            bitDepth    = binaryReader.ReadByte();
            mipMapCount = binaryReader.ReadByte();
            type        = binaryReader.ReadByte();
            compression = binaryReader.ReadByte();

            int palleteSize =
                ((rasterFormatFlags & TextureRasterFormat.RASTER_PAL4) != 0) ? 0x80 / 4 :
                ((rasterFormatFlags & TextureRasterFormat.RASTER_PAL8) != 0) ? 0x400 / 4 : 0;

            if (palleteSize != 0)
            {
                palette = new Color[palleteSize];
                for (int i = 0; i < palleteSize; i++)
                {
                    palette[i] = new Color(binaryReader.ReadInt32());
                }
            }

            mipMaps = new MipMapEntry[mipMapCount];
            for (int i = 0; i < mipMapCount; i++)
            {
                int    dataSize = Shared.Switch(binaryReader.ReadInt32());
                byte[] data     = binaryReader.ReadBytes(dataSize);

                mipMaps[i] = new MipMapEntry(dataSize, data);
            }
        }
        private void ReadNormalData(BinaryReader binaryReader, int endOfSectionPosition)
        {
            filterMode = (TextureFilterMode)binaryReader.ReadByte();
            byte addressMode = binaryReader.ReadByte();

            addressModeU = (TextureAddressMode)((addressMode & 0xF0) >> 4);
            addressModeV = (TextureAddressMode)(addressMode & 0x0F);
            binaryReader.BaseStream.Position += 2;

            textureName = ReadString(binaryReader);
            alphaName   = ReadString(binaryReader);

            rasterFormatFlags = (TextureRasterFormat)binaryReader.ReadInt32();
            hasAlpha          = binaryReader.ReadInt32() != 0;
            width             = binaryReader.ReadInt16();
            height            = binaryReader.ReadInt16();

            bitDepth    = binaryReader.ReadByte();
            mipMapCount = binaryReader.ReadByte();
            type        = binaryReader.ReadByte();
            compression = binaryReader.ReadByte();

            if (platformType == 5)
            {
                totalMipMapDataSize = binaryReader.ReadInt32();
            }

            int palleteSize =
                ((rasterFormatFlags & TextureRasterFormat.RASTER_PAL4) != 0) ? 0x80 / 4 :
                ((rasterFormatFlags & TextureRasterFormat.RASTER_PAL8) != 0) ? 0x400 / 4 : 0;

            if (palleteSize != 0)
            {
                palette = new Color[palleteSize];
                for (int i = 0; i < palleteSize; i++)
                {
                    palette[i] = new Color(binaryReader.ReadInt32());
                }
            }

            int passedSize = 0;

            mipMaps = new MipMapEntry[mipMapCount];
            for (int i = 0; i < mipMapCount; i++)
            {
                int dataSize = 0;

                if (platformType == 8)
                {
                    dataSize = binaryReader.ReadInt32();
                }
                else if (platformType == 5)
                {
                    dataSize = BiggestPowerOfTwoUnder(totalMipMapDataSize - passedSize);
                }

                byte[] data = binaryReader.ReadBytes(dataSize);
                mipMaps[i] = new MipMapEntry(dataSize, data);

                passedSize += dataSize;
            }
        }
Пример #3
0
        private static MipMapEntry[] ConvertFromPalette(MipMapEntry[] mipMaps, byte mipMapCount, TextureRasterFormat format, Color[] palette)
        {
            MipMapEntry[] newMipMaps = new MipMapEntry[mipMapCount];

            for (int i = 0; i < mipMapCount; i++)
            {
                List <byte> newData = new List <byte>();
                foreach (byte j in mipMaps[i].data)
                {
                    byte color = j;
                    if ((format & TextureRasterFormat.RASTER_PAL4) != 0)
                    {
                        color = (byte)(j & 0x0F);
                        newData.Add(palette[color].B);
                        newData.Add(palette[color].G);
                        newData.Add(palette[color].R);
                        newData.Add(palette[color].A);
                    }
                    else
                    {
                        newData.Add(palette[color].B);
                        newData.Add(palette[color].G);
                        newData.Add(palette[color].R);
                        newData.Add(palette[color].A);
                    }
                }

                newMipMaps[i].dataSize = newData.Count;
                newMipMaps[i].data     = newData.ToArray();
            }

            return(newMipMaps);
        }