public void ReadFTEX(Texture tex) { ImageKey = "texture"; SelectedImageKey = "texture"; reserve = tex.Data; texture.width = (int)tex.Width; texture.height = (int)tex.Height; format = (int)tex.Format; int swizzle = (int)tex.Swizzle; int pitch = (int)tex.Pitch; texture.data = GTX.swizzleBC(tex.Data, texture.width, texture.height, format, (int)tex.TileMode, pitch, swizzle); Text = tex.Name; //Setup variables for treenode data width = texture.width; height = texture.height; switch (format) { case ((int)GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_T_BC1_UNORM): texture.type = PixelInternalFormat.CompressedRgbaS3tcDxt1Ext; break; case ((int)GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_T_BC1_SRGB): texture.type = PixelInternalFormat.CompressedSrgbAlphaS3tcDxt1Ext; break; case ((int)GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_T_BC2_UNORM): texture.type = PixelInternalFormat.CompressedRgbaS3tcDxt3Ext; break; case ((int)GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_T_BC2_SRGB): texture.type = PixelInternalFormat.CompressedSrgbAlphaS3tcDxt3Ext; break; case ((int)GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_T_BC3_UNORM): texture.type = PixelInternalFormat.CompressedRgbaS3tcDxt5Ext; break; case ((int)GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_T_BC3_SRGB): texture.type = PixelInternalFormat.CompressedSrgbAlphaS3tcDxt5Ext; break; case ((int)GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_T_BC4_UNORM): texture.type = PixelInternalFormat.CompressedRedRgtc1; break; case ((int)GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_T_BC4_SNORM): texture.type = PixelInternalFormat.CompressedSignedRedRgtc1; break; case ((int)GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_T_BC5_UNORM): texture.type = PixelInternalFormat.CompressedRgRgtc2; break; case ((int)GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_T_BC5_SNORM): //OpenTK doesn't load BC5 SNORM textures right so I'll use the same decompress method bntx has byte[] fixBC5 = DDS_Decompress.DecompressBC5(texture.data, texture.width, texture.height, true); texture.data = fixBC5; texture.type = PixelInternalFormat.Rgba; texture.utype = OpenTK.Graphics.OpenGL.PixelFormat.Rgba; break; case ((int)GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_TCS_R8_G8_B8_A8_UNORM): texture.type = PixelInternalFormat.Rgba; texture.utype = OpenTK.Graphics.OpenGL.PixelFormat.Rgba; break; } texture.display = loadImage(texture); display = texture.display; }
public void ReadFTEX(Texture tex) { ImageKey = "texture"; SelectedImageKey = "texture"; reserve = tex.Data; texture.width = (int)tex.Width; texture.height = (int)tex.Height; format = (int)tex.Format; int swizzle = (int)tex.Swizzle; int pitch = (int)tex.Pitch; texture.data = GTX.swizzleBC(tex.Data, texture.width, texture.height, format, (int)tex.TileMode, pitch, swizzle); Text = tex.Name; //Setup variables for treenode data width = texture.width; height = texture.height; texture.mipMapCount = (int)tex.MipCount; FileData f = new FileData(tex.MipData); for (int level = 0; level < tex.MipCount; level++) { if (level != 0) { } // byte[] mip = f.getSection((int)tex.MipOffsets[level - 1], (int)tex.MipOffsets[level + 1]); // texture.mipMapData.Add(mip); } switch (format) { case ((int)GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_T_BC1_UNORM): texture.pixelInternalFormat = PixelInternalFormat.CompressedRgbaS3tcDxt1Ext; break; case ((int)GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_T_BC1_SRGB): texture.pixelInternalFormat = PixelInternalFormat.CompressedRgbaS3tcDxt1Ext; break; case ((int)GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_T_BC2_UNORM): texture.pixelInternalFormat = PixelInternalFormat.CompressedRgbaS3tcDxt3Ext; break; case ((int)GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_T_BC2_SRGB): texture.pixelInternalFormat = PixelInternalFormat.CompressedSrgbAlphaS3tcDxt3Ext; break; case ((int)GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_T_BC3_UNORM): texture.pixelInternalFormat = PixelInternalFormat.CompressedRgbaS3tcDxt5Ext; break; case ((int)GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_T_BC3_SRGB): texture.pixelInternalFormat = PixelInternalFormat.CompressedSrgbAlphaS3tcDxt5Ext; break; case ((int)GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_T_BC4_UNORM): texture.pixelInternalFormat = PixelInternalFormat.CompressedRedRgtc1; break; case ((int)GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_T_BC4_SNORM): texture.pixelInternalFormat = PixelInternalFormat.CompressedSignedRedRgtc1; break; case ((int)GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_T_BC5_UNORM): texture.pixelInternalFormat = PixelInternalFormat.CompressedRgRgtc2; break; case ((int)GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_T_BC5_SNORM): //OpenTK doesn't load BC5 SNORM textures right so I'll use the same decompress method bntx has byte[] fixBC5 = DDS_Decompress.DecompressBC5(texture.data, texture.width, texture.height, true); texture.data = fixBC5; texture.pixelInternalFormat = PixelInternalFormat.Rgba; texture.pixelFormat = OpenTK.Graphics.OpenGL.PixelFormat.Rgba; break; case ((int)GTX.GX2SurfaceFormat.GX2_SURFACE_FORMAT_TCS_R8_G8_B8_A8_UNORM): texture.pixelInternalFormat = PixelInternalFormat.Rgba; texture.pixelFormat = OpenTK.Graphics.OpenGL.PixelFormat.Rgba; break; } }
public BRTI(FileData f) //Docs thanks to gdkchan!! { ImageKey = "texture"; SelectedImageKey = "texture"; f.skip(4); int BRTISize1 = f.readInt(); long BRTISize2 = (f.readInt() | f.readInt() << 32); surf = new Swizzle.Surface(); surf.tileMode = (sbyte)f.readByte(); surf.dim = (sbyte)f.readByte(); ushort Flags = (ushort)f.readShort(); surf.swizzle = (ushort)f.readShort(); surf.numMips = (ushort)f.readShort(); uint unk18 = (uint)f.readInt(); surf.format = (uint)f.readInt(); DataType = (byte)(surf.format & 0xFF); uint unk20 = (uint)f.readInt(); surf.width = f.readInt(); surf.height = f.readInt(); surf.depth = f.readInt(); int FaceCount = f.readInt(); surf.sizeRange = f.readInt(); uint unk38 = (uint)f.readInt(); uint unk3C = (uint)f.readInt(); uint unk40 = (uint)f.readInt(); uint unk44 = (uint)f.readInt(); uint unk48 = (uint)f.readInt(); uint unk4C = (uint)f.readInt(); surf.imageSize = f.readInt(); surf.alignment = f.readInt(); int ChannelType = f.readInt(); int TextureType = f.readInt(); Text = f.readString((f.readInt() | f.readInt() << 32) + BNTX.temp + 2, -1); long ParentOffset = f.readInt() | f.readInt() << 32; long PtrsOffset = f.readInt() | f.readInt() << 32; format = surf.format; f.seek((int)PtrsOffset + BNTX.temp); long dataOff = f.readInt() | f.readInt() << 32; surf.data = f.getSection((int)dataOff + BNTX.temp, surf.imageSize); //Console.WriteLine(surf.data.Length + " " + dataOff.ToString("x") + " " + surf.imageSize); uint blk_dim = Formats.blk_dims(surf.format >> 8); blkWidth = blk_dim >> 4; blkHeight = blk_dim & 0xF; bpp = Formats.bpps(surf.format >> 8); // Console.WriteLine($"{Name} Height {surf.height}wdith = {surf.width}allignment = {surf.alignment}blkwidth = {blkWidth}blkheight = {blkHeight}blkdims = {blk_dim} format = {surf.format} datatype = {DataType} dataoffset = {dataOff}"); // byte[] result = surf.data; byte[] result = Swizzle.deswizzle((uint)surf.width, (uint)surf.height, blkWidth, blkHeight, bpp, (uint)surf.tileMode, (uint)surf.alignment, surf.sizeRange, surf.data, 0); uint width = Swizzle.DIV_ROUND_UP((uint)surf.width, blkWidth); uint height = Swizzle.DIV_ROUND_UP((uint)surf.height, blkHeight); result_ = new byte[width * height * bpp]; Array.Copy(result, 0, result_, 0, width * height * bpp); byte[] Swizzled = Swizzle.swizzle((uint)surf.width, (uint)surf.height, blkWidth, blkHeight, bpp, (uint)surf.tileMode, (uint)surf.alignment, surf.sizeRange, surf.data, 1); texture.data = result_; texture.width = surf.width; texture.height = surf.height; Width = surf.width; Height = surf.height; texture.mipmaps.Add(result_); switch (surf.format >> 8) { case ((uint)Formats.BNTXImageFormat.IMAGE_FORMAT_BC1): if (DataType == (byte)Formats.BNTXImageTypes.UNORM) { texture.type = PixelInternalFormat.CompressedRgbaS3tcDxt1Ext; } else if (DataType == (byte)Formats.BNTXImageTypes.SRGB) { byte[] fixBC1 = DDS_Decompress.DecompressBC1(texture.data, texture.width, texture.height, true); texture.data = fixBC1; texture.type = PixelInternalFormat.Rgba; texture.utype = OpenTK.Graphics.OpenGL.PixelFormat.Rgba; } else { throw new Exception("Unsupported data type for BC1"); } break; case ((uint)Formats.BNTXImageFormat.IMAGE_FORMAT_BC2): if (DataType == (byte)Formats.BNTXImageTypes.UNORM) { texture.type = PixelInternalFormat.CompressedRgbaS3tcDxt3Ext; } else if (DataType == (byte)Formats.BNTXImageTypes.SRGB) { texture.type = PixelInternalFormat.CompressedSrgbAlphaS3tcDxt3Ext; } else { throw new Exception("Unsupported data type for BC2"); } break; case ((uint)Formats.BNTXImageFormat.IMAGE_FORMAT_BC3): if (DataType == (byte)Formats.BNTXImageTypes.UNORM) { texture.type = PixelInternalFormat.CompressedRgbaS3tcDxt5Ext; } else if (DataType == (byte)Formats.BNTXImageTypes.SRGB) { texture.type = PixelInternalFormat.CompressedSrgbAlphaS3tcDxt5Ext; } else { throw new Exception("Unsupported data type for BC3"); } break; case ((uint)Formats.BNTXImageFormat.IMAGE_FORMAT_BC4): if (DataType == (byte)Formats.BNTXImageTypes.UNORM) { texture.type = PixelInternalFormat.CompressedRedRgtc1; // byte[] fixBC4 = DecompressBC4(texture.data, texture.width, texture.height, false); // texture.data = fixBC4; // texture.type = PixelInternalFormat.Rgba; // texture.utype = OpenTK.Graphics.OpenGL.PixelFormat.Rgba; } else if (DataType == (byte)Formats.BNTXImageTypes.SNORM) { texture.type = PixelInternalFormat.CompressedSignedRedRgtc1; // byte[] fixBC4 = DecompressBC4(texture.data, texture.width, texture.height, true); // texture.data = fixBC4; // texture.type = PixelInternalFormat.Rgba; // texture.utype = OpenTK.Graphics.OpenGL.PixelFormat.Rgba; } else { throw new Exception("Unsupported data type for BC4"); } break; case ((uint)Formats.BNTXImageFormat.IMAGE_FORMAT_BC5): if (DataType == (byte)Formats.BNTXImageTypes.UNORM) { // byte[] fixBC5 = DecompressBC5(texture.data, texture.width, texture.height, false); // texture.data = fixBC5; texture.type = PixelInternalFormat.CompressedRgRgtc2; // texture.utype = OpenTK.Graphics.OpenGL.PixelFormat.Rgba; } else if (DataType == (byte)Formats.BNTXImageTypes.SNORM) { byte[] fixBC5 = DDS_Decompress.DecompressBC5(texture.data, texture.width, texture.height, true); texture.data = fixBC5; texture.type = PixelInternalFormat.Rgba; texture.utype = OpenTK.Graphics.OpenGL.PixelFormat.Rgba; } else { Console.WriteLine("Unsupported data type for BC5"); } break; case ((uint)Formats.BNTXImageFormat.IMAGE_FORMAT_BC7): if (DataType == (byte)Formats.BNTXImageTypes.UNORM || DataType == (byte)Formats.BNTXImageTypes.SRGB) { texture.type = PixelInternalFormat.CompressedRgbaBptcUnorm; } break; case ((uint)Formats.BNTXImageFormat.IMAGE_FORMAT_R8_G8_B8_A8): if (DataType == (byte)Formats.BNTXImageTypes.UNORM || DataType == (byte)Formats.BNTXImageTypes.SRGB) { texture.type = PixelInternalFormat.Rgba; texture.utype = OpenTK.Graphics.OpenGL.PixelFormat.Rgba; } else { throw new Exception("Unsupported data type for R8_G8_B8_A8"); } break; } texture.display = loadImage(texture); display = texture.display; RenderableTex.Add(texture); }
private void LoadFormats(BRTI_Texture texture, uint format, int mipLevel, int width, int height) { switch (format >> 8) { case ((uint)Formats.BNTXImageFormat.IMAGE_FORMAT_BC1): texture.pixelInternalFormat = PixelInternalFormat.CompressedRgbaS3tcDxt1Ext; break; case ((uint)Formats.BNTXImageFormat.IMAGE_FORMAT_BC2): if (DataType == (byte)Formats.BNTXImageTypes.UNORM) { texture.pixelInternalFormat = PixelInternalFormat.CompressedRgbaS3tcDxt3Ext; } else if (DataType == (byte)Formats.BNTXImageTypes.SRGB) { texture.pixelInternalFormat = PixelInternalFormat.CompressedSrgbAlphaS3tcDxt3Ext; } else { throw new Exception("Unsupported data type for BC2"); } break; case ((uint)Formats.BNTXImageFormat.IMAGE_FORMAT_BC3): if (DataType == (byte)Formats.BNTXImageTypes.UNORM) { texture.pixelInternalFormat = PixelInternalFormat.CompressedRgbaS3tcDxt5Ext; } else if (DataType == (byte)Formats.BNTXImageTypes.SRGB) { texture.pixelInternalFormat = PixelInternalFormat.CompressedSrgbAlphaS3tcDxt5Ext; } else { throw new Exception("Unsupported data type for BC3"); } break; case ((uint)Formats.BNTXImageFormat.IMAGE_FORMAT_BC4): if (DataType == (byte)Formats.BNTXImageTypes.UNORM) { texture.pixelInternalFormat = PixelInternalFormat.CompressedRedRgtc1; } else if (DataType == (byte)Formats.BNTXImageTypes.SNORM) { texture.pixelInternalFormat = PixelInternalFormat.CompressedSignedRedRgtc1; } else { throw new Exception("Unsupported data type for BC4"); } break; case ((uint)Formats.BNTXImageFormat.IMAGE_FORMAT_BC5): if (DataType == (byte)Formats.BNTXImageTypes.UNORM) { texture.pixelInternalFormat = PixelInternalFormat.CompressedRgRgtc2; } else if (DataType == (byte)Formats.BNTXImageTypes.SNORM) { // texture.pixelInternalFormat = PixelInternalFormat.CompressedRgRgtc2; byte[] fixBC5 = DDS_Decompress.DecompressBC5(texture.mipmaps[mipLevel], width, height, true); texture.mipmaps[mipLevel] = fixBC5; texture.pixelInternalFormat = PixelInternalFormat.Rgba; texture.pixelFormat = OpenTK.Graphics.OpenGL.PixelFormat.Rgba; } else { Console.WriteLine("Unsupported data type for BC5"); } break; case ((uint)Formats.BNTXImageFormat.IMAGE_FORMAT_BC7): if (DataType == (byte)Formats.BNTXImageTypes.UNORM || DataType == (byte)Formats.BNTXImageTypes.SRGB) { texture.pixelInternalFormat = PixelInternalFormat.CompressedRgbaBptcUnorm; } break; case ((uint)Formats.BNTXImageFormat.IMAGE_FORMAT_R8_G8_B8_A8): if (DataType == (byte)Formats.BNTXImageTypes.UNORM || DataType == (byte)Formats.BNTXImageTypes.SRGB) { texture.pixelInternalFormat = PixelInternalFormat.Rgba; texture.pixelFormat = OpenTK.Graphics.OpenGL.PixelFormat.Rgba; } else { throw new Exception("Unsupported data type for R8_G8_B8_A8"); } break; } }