private void LoadImageData(byte[] rawData = null) { IsValidImage = false; //Check that the format is correct (ex. CI & palette offsets are valid) int maxTextureLocation = (rawData != null ? rawData.Length - 1 : RomProject.Instance.Files[0].FileLength - 1); if (TextureOffset < 0 || TextureOffset > maxTextureLocation || (Format == Texture.ImageFormat.CI && PaletteOffset.Count == 0)) { return; } if (!TextureConversion.IsValidFormatCombo(Format, PixelSize)) { return; } //Try to load the texture, palette & image here N64DataElement element; Palette paletteRef = null; List <Palette> paletteRefs = new List <Palette>(); if (Format == Texture.ImageFormat.CI) //If CI format, we need to get the palette too { for (int i = 0; i < PaletteOffset.Count; i++) { paletteRef = null; if (RomProject.Instance.Files[0].HasElementExactlyAt(PaletteOffset[i], out element) && element.FileOffset == PaletteOffset[i] && !(element is UnknownData)) { switch (PaletteEncoding[i]) { case MK64ImageEncoding.Raw: //Needs to be a raw palette if (!(element is Palette)) { return; } paletteRef = (Palette)element; break; case MK64ImageEncoding.MIO0: //Needs to be a mio0 block if (!(element is MIO0Block)) { return; } MIO0Block block = (MIO0Block)element; //System.IO.File.WriteAllBytes("test.bin",block.DecodedData); //now to search inside if (block.Elements.FirstOrDefault(e => e.FileOffset == PaletteBlockOffset[i]) != null) { N64DataElement paletteEl = block.Elements.First(e => e.FileOffset == PaletteBlockOffset[i]); if (paletteEl is Palette) { paletteRef = (Palette)paletteEl; } } else { //Create the palette! byte[] data = new byte[PaletteColorCount[i] * 2]; Array.Copy(block.DecodedData, PaletteBlockOffset[i], data, 0, data.Length); Palette pal = new Palette(PaletteBlockOffset[i], data); if (block.AddElement(pal)) { paletteRef = pal; } } break; } } else { //AVOID THIS AS MUCH AS POSSIBLE, IT WILL SLOW EVERYTHING DOWN TREMENDOUSLY!! if (rawData == null) { rawData = RomProject.Instance.Files[0].GetAsBytes(); } //Create the palette! switch (PaletteEncoding[i]) { case MK64ImageEncoding.Raw: //Create the palette! byte[] data = new byte[PaletteColorCount[i] * 2]; Array.Copy(rawData, PaletteOffset[i], data, 0, data.Length); Palette pal = new Palette(PaletteOffset[i], data); if (RomProject.Instance.Files[0].AddElement(pal)) { paletteRef = pal; } break; case MK64ImageEncoding.MIO0: //Create the MIO0 block! MIO0Block block = MIO0Block.ReadMIO0BlockFrom(rawData, PaletteOffset[i]); //System.IO.File.WriteAllBytes("test.bin",block.DecodedData); if (RomProject.Instance.Files[0].AddElement(block)) { //Create the palette in the MIO0 block! byte[] mioData = new byte[PaletteColorCount[i] * 2]; Array.Copy(block.DecodedData, PaletteBlockOffset[i], mioData, 0, mioData.Length); Palette palette = new Palette(PaletteBlockOffset[i], mioData); if (block.AddElement(palette)) { paletteRef = palette; } else { throw new Exception(); } } break; } } paletteRefs.Add(paletteRef); } } Texture textureRef = null; TKMK00Block tkmkRef = null; if (RomProject.Instance.Files[0].HasElementExactlyAt(TextureOffset, out element) && element.FileOffset == TextureOffset && !(element is UnknownData)) { switch (TextureEncoding) { case MK64ImageEncoding.Raw: //Needs to be a raw texture if (!(element is Texture)) { return; } textureRef = (Texture)element; break; case MK64ImageEncoding.MIO0: //Needs to be a mio0 block if (!(element is MIO0Block)) { return; } MIO0Block block = (MIO0Block)element; //now to search inside if (block.Elements.FirstOrDefault(e => e.FileOffset == TextureBlockOffset) != null) { N64DataElement textureEl = block.Elements.First(e => e.FileOffset == TextureBlockOffset); if (textureEl is Texture) { textureRef = (Texture)textureEl; } } else { //Create the texture here //Create the palette! double byteSize = 1; switch (PixelSize) { case Texture.PixelInfo.Size_4b: byteSize = 0.5; break; case Texture.PixelInfo.Size_16b: byteSize = 2; break; case Texture.PixelInfo.Size_32b: byteSize = 4; break; } byte[] data = new byte[(int)Math.Round(Width * Height * byteSize)]; Array.Copy(block.DecodedData, TextureBlockOffset, data, 0, data.Length); Texture text = new Texture(TextureBlockOffset, data, Format, PixelSize, Width, Height); if (block.AddElement(text)) { textureRef = text; } } break; case MK64ImageEncoding.TKMK00: //Needs to be a tkmk00 block if (!(element is TKMK00Block)) { return; } tkmkRef = (TKMK00Block)element; break; } } else //NEED TO CREATE IT HERE! { //AVOID THIS AS MUCH AS POSSIBLE, IT WILL SLOW EVERYTHING DOWN TREMENDOUSLY!! if (rawData == null) { rawData = RomProject.Instance.Files[0].GetAsBytes(); } switch (TextureEncoding) { case MK64ImageEncoding.Raw: //Just create the new texture image! double byteSize = 1; switch (PixelSize) { case Texture.PixelInfo.Size_4b: byteSize = 0.5; break; case Texture.PixelInfo.Size_16b: byteSize = 2; break; case Texture.PixelInfo.Size_32b: byteSize = 4; break; } byte[] data = new byte[(int)Math.Round(Width * Height * byteSize)]; Array.Copy(rawData, TextureOffset, data, 0, data.Length); Texture texture = new Texture(TextureOffset, data, Format, PixelSize, Width, Height); //Add to the rom project if (RomProject.Instance.Files[0].AddElement(texture)) { textureRef = texture; } break; case MK64ImageEncoding.MIO0: //Since no MIO0 block was found, it needs to be created MIO0Block block = MIO0Block.ReadMIO0BlockFrom(rawData, TextureOffset); if (RomProject.Instance.Files[0].AddElement(block)) { double ByteSize = 1; switch (PixelSize) { case Texture.PixelInfo.Size_4b: ByteSize = 0.5; break; case Texture.PixelInfo.Size_16b: ByteSize = 2; break; case Texture.PixelInfo.Size_32b: ByteSize = 4; break; } byte[] textData = new byte[(int)Math.Round(Width * Height * ByteSize)]; Array.Copy(block.DecodedData, TextureBlockOffset, textData, 0, textData.Length); Texture text = new Texture(TextureBlockOffset, textData, Format, PixelSize, Width, Height); if (block.AddElement(text)) { textureRef = text; } } break; case MK64ImageEncoding.TKMK00: //Need to create the TKMK00Block, and it'll handle the rest TKMK00Block tkmk; byte[] bytes = new byte[TKMKLength]; Array.Copy(rawData, TextureOffset, bytes, 0, TKMKLength); tkmk = new TKMK00Block(TextureOffset, bytes, TKMKAlphaColor); if (RomProject.Instance.Files[0].AddElement(tkmk)) { tkmkRef = tkmk; } break; } } if ((textureRef == null && tkmkRef == null) || (Format == Texture.ImageFormat.CI && (paletteRefs.Count == 0 || paletteRefs.Contains(null)))) { return; } //Test to make sure the texture matches the format and such if (textureRef != null && Format != textureRef.Format) { return; } //Successfully found the palette, set the references TKMKReference = tkmkRef; if (TextureEncoding == MK64ImageEncoding.TKMK00) { IsValidImage = (TKMKReference != null); return; } F3DEXImage image = new F3DEXImage(textureRef, paletteRefs); ImageReference = image; IsValidImage = image.ValidImage; }
public void AdvanceNewElementOffset(N64DataElement element) { NewElementOffset += element.RawDataSize; }
private bool FindExistingF3DEXImage(Texture newTexture, List <Palette> newPalettes) { if (RomProject.Instance.Files.Count == 0) { return(false); } //Look for the TKMK00 bool changesMade = false; N64DataElement element; Palette paletteRef = null; List <Palette> paletteRefs = new List <Palette>(); if (Format == Texture.ImageFormat.CI) //If CI format, we need to get the palette too { for (int i = 0; i < PaletteOffset.Count; i++) { paletteRef = null; if (RomProject.Instance.Files[0].HasElementExactlyAt(PaletteOffset[i], out element) && element.FileOffset == TextureOffset && !(element is UnknownData)) { switch (PaletteEncoding[i]) { case MK64ImageEncoding.Raw: //Needs to be a raw palette if (!(element is Palette)) { break; } paletteRef = (Palette)element; break; case MK64ImageEncoding.MIO0: //Needs to be a mio0 block if (!(element is MIO0Block)) { break; } MIO0Block block = (MIO0Block)element; //System.IO.File.WriteAllBytes("test.bin",block.DecodedData); //now to search inside if (block.Elements.FirstOrDefault(e => e.FileOffset == PaletteBlockOffset[i]) != null) { N64DataElement paletteEl = block.Elements.First(e => e.FileOffset == PaletteBlockOffset[i]); if (paletteEl is Palette) { paletteRef = (Palette)paletteEl; } } break; } } if (paletteRef != null) { newPalettes[i] = paletteRef; changesMade = true; } } } //Now texture Texture textureRef = null; if (RomProject.Instance.Files[0].HasElementExactlyAt(TextureOffset, out element) && element.FileOffset == TextureOffset && !(element is UnknownData)) { switch (TextureEncoding) { case MK64ImageEncoding.Raw: //Needs to be a raw texture if (!(element is Texture)) { break; } textureRef = (Texture)element; break; case MK64ImageEncoding.MIO0: //Needs to be a mio0 block if (!(element is MIO0Block)) { break; } MIO0Block block = (MIO0Block)element; //now to search inside if (block.Elements.FirstOrDefault(e => e.FileOffset == TextureBlockOffset) != null) { N64DataElement textureEl = block.Elements.First(e => e.FileOffset == TextureBlockOffset); if (textureEl is Texture) { textureRef = (Texture)textureEl; } } break; } } if (textureRef != null) { newTexture = textureRef; changesMade = true; } if (changesMade) { ImageReference = new F3DEXImage(newTexture, newPalettes); IsValidImage = ImageReference.ValidImage; return(true); } return(false); }