public override void OnRebuild(VoidPtr address, int length, bool force) { int offset = OffsetToData(); if (!SharesData) { Memory.Move(address + offset, WorkingUncompressed.Address + offset, (uint)length - (uint)offset); } switch (Version) { case 1: *(TEX0v1 *)address = new TEX0v1(Width, Height, Format, LevelOfDetail, offset); break; case 2: *(TEX0v2 *)address = new TEX0v2(Width, Height, Format, LevelOfDetail, offset); break; case 3: *(TEX0v3 *)address = new TEX0v3(Width, Height, Format, LevelOfDetail, offset); _userEntries.Write(address + TEX0v3.Size); break; } }
public virtual FileMap EncodeTEX0Texture(Bitmap src, int mipLevels) { int w = src.Width, h = src.Height; int bw = BlockWidth, bh = BlockHeight; PixelFormat fmt = src.IsIndexed() ? src.PixelFormat : PixelFormat.Format32bppArgb; FileMap fileView = FileMap.FromTempFile(GetFileSize(w, h, mipLevels) + 0x40); try { //Build TEX header TEX0v1 *header = (TEX0v1 *)fileView.Address; * header = new TEX0v1(w, h, RawFormat, mipLevels); 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(header->PixelData, dib, src, dStep, sStep, i); } return(fileView); } catch (Exception x) { MessageBox.Show(x.ToString()); fileView.Dispose(); return(null); } }
public unsafe static void WriteTEX0(this Stream outputStream, TEX0v1 header) { TEX0v1 *headerPtr = &header; using (var inputStream = new UnmanagedMemoryStream((byte *)headerPtr, sizeof(TEX0v1))) { inputStream.CopyTo(outputStream); } }
private static TEX0Node NullTEX0Node() { if (_nullTEX0Node == null) { TEX0v1 NullTEX0Header = new TEX0v1(0, 0, WiiPixelFormat.CMPR, 1); _nullTEX0Node = new TEX0Node(); _nullTEX0Node.Initialize(null, &NullTEX0Header, sizeof(TEX0v1)); } return(_nullTEX0Node); }
public static byte[] WTEToTEX0(Stream inputStream) { WTE oldHeader = inputStream.ReadWTE(); if (oldHeader.tag != "WTE\0") { throw new Exception("The input file does not appear to be a WTE file."); } TEX0v1 newHeader = new TEX0v1(oldHeader.width, oldHeader.height, WiiPixelFormat.RGB5A3, 1); using (var outputStream = new MemoryStream()) { outputStream.WriteTEX0(newHeader); inputStream.CopyTo(outputStream); return(outputStream.ToArray()); } }
public static byte[] TEX0ToWTE(Stream inputStream) { TEX0v1 oldHeader = inputStream.ReadTEX0(); if (oldHeader._header._tag != "TEX0") { throw new Exception("The input file does not appear to be a TEX0 file."); } if (oldHeader.PixelFormat != WiiPixelFormat.RGB5A3) { throw new Exception("The format of the TEX0 file is not RGB5A3."); } WTE newHeader = new WTE(oldHeader._width, oldHeader._height); using (var outputStream = new MemoryStream()) { outputStream.WriteWTE(newHeader); inputStream.CopyTo(outputStream); return(outputStream.ToArray()); } }
public override void OnRebuild(VoidPtr address, int length, bool force) { int offset = 0x40 + (_version == 3 ? _userEntries.GetSize() : 0); Memory.Move(address + offset, WorkingUncompressed.Address + offset, (uint)length - (uint)offset); switch (Version) { case 1: *(TEX0v1 *)address = new TEX0v1(_width, _height, Format, _lod); break; case 2: *(TEX0v2 *)address = new TEX0v2(_width, _height, Format, _lod); break; case 3: TEX0v3 *v3 = (TEX0v3 *)address; * v3 = new TEX0v3(_width, _height, Format, _lod); _userEntries.Write(address + 0x40); v3->_headerLen = offset; break; } }