public override void OnRebuild(VoidPtr address, int length, bool force) { base.OnRebuild(address, length, force); REFTImageHeader *header = (REFTImageHeader *)address; header->Set((byte)_minFltr, (byte)_magFltr, (byte)_lodBias); }
public virtual FileMap EncodeREFTTexture(Bitmap src, int mipLevels, WiiPaletteFormat format) { int w = src.Width, h = src.Height; int bw = BlockWidth, bh = BlockHeight; ColorPalette pal = src.Palette; PixelFormat fmt = src.IsIndexed() ? src.PixelFormat : PixelFormat.Format32bppArgb; FileMap fileView = FileMap.FromTempFile(GetFileSize(w, h, mipLevels) + 0x20 + (pal != null ? (pal.Entries.Length * 2) : 0)); try { //Build REFT image header REFTImageHeader *header = (REFTImageHeader *)fileView.Address; *header = new REFTImageHeader((ushort)w, (ushort)h, (byte)RawFormat, (byte)format, (ushort)(pal != null ? pal.Entries.Length : 0), (uint)fileView.Length - 0x20 - (uint)(pal != null ? (pal.Entries.Length * 2) : 0), (byte)(mipLevels - 1)); int sStep = bw * Image.GetPixelFormatSize(fmt) / 8; int dStep = bw * bh * BitsPerPixel / 8; using (DIB dib = DIB.FromBitmap(src, bw, bh, fmt)) for (int i = 1; i <= mipLevels; i++) { EncodeLevel((VoidPtr)header + 0x20, dib, src, dStep, sStep, i); } if (pal != null) { int count = pal.Entries.Length; switch (format) { case WiiPaletteFormat.IA8: { IA8Pixel *dPtr = (IA8Pixel *)header->PaletteData; for (int i = 0; i < count; i++) { dPtr[i] = (IA8Pixel)pal.Entries[i]; } break; } case WiiPaletteFormat.RGB565: { wRGB565Pixel *dPtr = (wRGB565Pixel *)header->PaletteData; for (int i = 0; i < count; i++) { dPtr[i] = (wRGB565Pixel)pal.Entries[i]; } break; } case WiiPaletteFormat.RGB5A3: { wRGB5A3Pixel *dPtr = (wRGB5A3Pixel *)header->PaletteData; for (int i = 0; i < count; i++) { dPtr[i] = (wRGB5A3Pixel)pal.Entries[i]; } break; } } } return(fileView); } catch (Exception x) { MessageBox.Show(x.ToString()); fileView.Dispose(); return(null); } }