Example #1
0
        public override void OnRebuild(VoidPtr address, int length, bool force)
        {
            if (Model._isImport || _changed)
            {
                //Write header
                MDL0ColorData *header = (MDL0ColorData *)address;
                header->_dataLen     = length;
                header->_dataOffset  = 0x20;
                header->_index       = _entryIndex;
                header->_isRGBA      = _enc._hasAlpha ? 1 : 0;
                header->_format      = (int)_enc._outType;
                header->_entryStride = (byte)_enc._dstStride;
                header->_pad         = 0;
                header->_numEntries  = (ushort)Colors.Length;

                //Write data
                _enc.Write((byte *)header + 0x20);
                _enc.Dispose();
                _enc = null;
            }
            else
            {
                base.OnRebuild(address, length, force);
            }
        }
 protected abstract void GetUnpalettedTools(ushort version,
                                            byte clutFormat,
                                            byte depth,
                                            int colorsCount,
                                            int width,
                                            int height,
                                            byte[] data,
                                            byte[] userData,
                                            out ColorCodec imageCodec,
                                            out ImageFilter imgFilter);
Example #3
0
 public override int OnCalculateSize(bool force)
 {
     if (Model._isImport || _changed)
     {
         _enc = new ColorCodec(Colors);
         return(_enc._dataLen.Align(0x20) + 0x20);
     }
     else
     {
         return(base.OnCalculateSize(force));
     }
 }
Example #4
0
        internal byte[] GetPaletteData()
        {
            ColorCodec encoder = GetColorCodec(parameters.colorSize);

            MemoryStream stream = new MemoryStream();

            foreach (Color[] palette in palettes)
            {
                Color[] pal = !parameters.linearPalette ? paletteFilter.ApplyFilter(palette) : palette;

                byte[] buf = encoder.EncodeColors(pal);
                stream.Write(buf, 0, buf.Length);
            }
            stream.Close();
            return(stream.ToArray());
        }
Example #5
0
        protected internal override void OnRebuild(VoidPtr address, int length, bool force)
        {
            MDL0ColorData *header = (MDL0ColorData *)address;

            header->_dataLen     = length;
            header->_dataOffset  = 0x20;
            header->_index       = _entryIndex;
            header->_isRGBA      = _enc._hasAlpha ? 1 : 0;
            header->_format      = (int)_enc._outType;
            header->_entryStride = (byte)_enc._outStride;
            header->_scale       = 0;
            header->_numEntries  = (ushort)Colors.Length;

            _enc.Write(Colors, (byte *)header + 0x20);
            _enc = null;
        }
Example #6
0
 public Builder SetPaletteCodec(ColorCodec decoder)
 {
     this.decoder = decoder;
     return(this);
 }
        public override TextureFormat Open(System.IO.Stream formatData)
        {
            if (!IsValidFormat(formatData))
            {
                throw new TextureFormatException("Not a valid TPL Texture!");
            }

            BinaryReader reader = new BinaryReader(formatData);

            reader.BaseStream.Position += 4;

            ByteOrder order = ByteOrder.BigEndian;

            int  texturesCount    = (int)reader.ReadUInt32(order);
            uint imageTableOffset = reader.ReadUInt32(order);

            reader.BaseStream.Position = imageTableOffset;

            TPLTexture texture = new TPLTexture();

            for (int i = 0; i < texturesCount; i++)
            {
                TextureFormat segment = null;

                //image table
                uint imageHeaderOffset   = reader.ReadUInt32(order);
                uint offsetPaletteHeader = reader.ReadUInt32(order);

                long oldPos = reader.BaseStream.Position;

                reader.BaseStream.Position = imageHeaderOffset;

                int  height        = reader.ReadUInt16(order);
                int  width         = reader.ReadUInt16(order);
                uint format        = reader.ReadUInt32(order);
                uint imgDataOffset = reader.ReadUInt32(order);

                ColorCodec  colorCodec = null;
                IndexCodec  idxCodec   = null;
                ImageFilter imgFilter  = null;

                ushort entryCount    = 0;
                ushort unknown       = 0;//this might be a set of flags denoting whether the palette is internal to the tpl image or external.
                uint   paletteFormat = 0;
                uint   palDataOffset = 0;
                bool   isIndexed     = false;

                int imgDataSize = 0;
                int palDataSize = 0;

                switch (format)
                {
                case 0:     //I4
                    colorCodec  = ColorCodec.CODEC_4BITBE_I4;
                    imgFilter   = new TileFilter(4, 8, 8, width, height);
                    imgDataSize = colorCodec.GetBytesNeededForEncode(width, height, imgFilter);
                    break;

                case 1:     //I8
                    colorCodec  = ColorCodec.CODEC_8BIT_I8;
                    imgFilter   = new TileFilter(8, 8, 4, width, height);
                    imgDataSize = colorCodec.GetBytesNeededForEncode(width, height, imgFilter);
                    break;

                case 2:     //IA4
                    colorCodec  = ColorCodec.CODEC_8BITBE_IA4;
                    imgFilter   = new TileFilter(8, 8, 4, width, height);
                    imgDataSize = colorCodec.GetBytesNeededForEncode(width, height, imgFilter);
                    break;

                case 3:     //IA8
                    colorCodec  = ColorCodec.CODEC_16BITBE_IA8;
                    imgFilter   = new TileFilter(16, 4, 4, width, height);
                    imgDataSize = colorCodec.GetBytesNeededForEncode(width, height, imgFilter);
                    break;

                case 4:     //RGB565
                    colorCodec  = ColorCodec.CODEC_16BITBE_RGB565;
                    imgFilter   = new TileFilter(16, 4, 4, width, height);
                    imgDataSize = colorCodec.GetBytesNeededForEncode(width, height, imgFilter);
                    break;

                case 5:     //RGB5A3
                    colorCodec  = ColorCodec.CODEC_16BITBE_RGB5A3;
                    imgFilter   = new TileFilter(16, 4, 4, width, height);
                    imgDataSize = colorCodec.GetBytesNeededForEncode(width, height, imgFilter);
                    break;

                case 6:     //RGBA32 2 planes
                    colorCodec = ColorCodec.CODEC_32BIT_ARGB;
                    imgFilter  = new ImageFilterComposer {
                        new GamecubePlanarFilter(),
                        new TileFilter(32, 4, 4, width, height)
                    };
                    imgDataSize = colorCodec.GetBytesNeededForEncode(width, height, imgFilter);
                    break;

                case 8:     //C4
                case 9:     //C8
                    isIndexed = true;
                    reader.BaseStream.Position = offsetPaletteHeader;

                    entryCount = reader.ReadUInt16(order);
                    unknown    = reader.ReadUInt16(order);

                    paletteFormat = reader.ReadUInt32(order);
                    palDataOffset = reader.ReadUInt32(order);

                    switch (paletteFormat)
                    {
                    case 0:
                        colorCodec = ColorCodec.CODEC_16BITBE_IA8;
                        break;

                    case 1:
                        colorCodec = ColorCodec.CODEC_16BITBE_RGB565;
                        break;

                    case 2:
                        colorCodec = ColorCodec.CODEC_16BITBE_RGB5A3;
                        break;

                    default:
                        throw new TextureFormatException("Unsupported palette format " + paletteFormat);
                    }
                    palDataSize = colorCodec.GetBytesNeededForEncode(entryCount, 1);

                    if (format == 8)
                    {
                        idxCodec  = IndexCodec.FromBitPerPixel(4, order);
                        imgFilter = new TileFilter(4, 8, 8, width, height);
                    }
                    else
                    {
                        idxCodec  = IndexCodec.FromBitPerPixel(8, order);
                        imgFilter = new TileFilter(8, 8, 4, width, height);
                    }

                    imgDataSize = idxCodec.GetBytesNeededForEncode(width, height, imgFilter);
                    break;

                case 0xA:     //C14X2
                    throw new TextureFormatException("C14X2 not implemented yet!");
                    break;

                case 0xE:     //DXT1 (aka CMPR)
                    colorCodec  = new ColorCodecDXT1Gamecube(width, height);
                    imgDataSize = colorCodec.GetBytesNeededForEncode(width, height);
                    break;

                default:
                    throw new TextureFormatException("Unsupported TPL image format " + format);
                }

                reader.BaseStream.Position = imgDataOffset;
                byte[] imgData = reader.ReadBytes(imgDataSize);

                if (isIndexed)
                {
                    reader.BaseStream.Position = palDataOffset;
                    byte[] palData = reader.ReadBytes(palDataSize);

                    PalettedTextureFormat.Builder builder = new PalettedTextureFormat.Builder();
                    segment = builder.SetIndexCodec(idxCodec)
                              .SetPaletteCodec(colorCodec)
                              .SetImageFilter(imgFilter)
                              .Build(imgData, palData, width, height);
                }
                else
                {
                    GenericTextureFormat.Builder builder = new GenericTextureFormat.Builder();
                    segment = builder.SetColorCodec(colorCodec)
                              .SetImageFilter(imgFilter)
                              .Build(imgData, width, height);
                }

                segment.FormatSpecificData.Put <uint>(FORMAT_KEY, format)
                .Put <uint>(UNKNOWN_KEY, unknown)
                .Put <uint>(PALETTEFORMAT_KEY, paletteFormat);

                texture.TextureFormats.Add(segment);

                reader.BaseStream.Position = oldPos;
            }

            return(texture);
        }
Example #8
0
 protected override int OnCalculateSize(bool force)
 {
     _enc = ColorCodec.Evaluate(Colors);
     return(_enc._outLength.Align(0x20) + 0x20);
 }