private void treeView1_DoubleClick(object sender, EventArgs e) { listView1.Visible = false; propertyGrid1.Visible = false; if (treeView1.SelectedNode is FSKANode) { ((FSKANode)treeView1.SelectedNode).Display(listView1); } if (treeView1.SelectedNode is BRTI) { Swizzle.Surface Tex = new Swizzle.Surface(); propertyGrid1.Visible = true; propertyGrid1.SelectedObject = Tex; } if (treeView1.SelectedNode is ShaderModel) { var window = new ShaderSettingsWindow(); if (window.ShowDialog() == DialogResult.OK) { } } /*if (treeView1.SelectedNode is Skeleton) * { * RenderableNodes.Clear(); * RenderableNodes.Add((Skeleton)treeView1.SelectedNode); * glControl1.Invalidate(); * } * if (treeView1.SelectedNode is BFRES.FMDL) * { * RenderableNodes.Clear(); * RenderableNodes.Add((BFRES.FMDL)treeView1.SelectedNode); * glControl1.Invalidate(); * } * if (treeView1.SelectedNode is BFRES.FTEX) * { * RenderableNodes.Clear(); * RenderableNodes.Add((BFRES.FTEX)treeView1.SelectedNode); * glControl1.Invalidate(); * }*/ if (treeView1.SelectedNode is RenderableNode) { if (treeView1.SelectedNode is FSKA) { List <RenderableNode> mod = new List <RenderableNode>(); foreach (RenderableNode node in RenderableNodes) { if (node is FMDL) { mod.Add(node); } } RenderableNodes.Clear(); RenderableNodes.AddRange(mod); // set transforms loadedSkel = ((FMDL)mod[0]).skel; loadedAnimation = ((FSKA)treeView1.SelectedNode); loadedAnimation.nextFrame(loadedSkel); } else { RenderableNodes.Clear(); } RenderableNodes.Add((RenderableNode)treeView1.SelectedNode); glControl1.Invalidate(); } else if (treeView1.SelectedNode is RenderableNode) { RenderableNodes.Clear(); RenderableNodes.Add((RenderableNode)treeView1.SelectedNode); glControl1.Invalidate(); } /*if(treeView1.SelectedNode.Tag is FileData) * { * using (SaveFileDialog d = new SaveFileDialog()) * { * if(d.ShowDialog() == DialogResult.OK) * { * File.WriteAllBytes(d.FileName, ((FileData)treeView1.SelectedNode.Tag).b); * } * } * }*/ }
public BRTI(FileData f) //Docs thanks to gdkchan!! { ImageKey = "texture"; SelectedImageKey = "texture"; if (!f.readString(4).Equals("BRTI")) { throw new Exception("Error reading Texture"); } 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(); byte 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.readOffset() | f.readOffset() << 32) + ExternalFiles.DataOffset + 2, -1); long ParentOffset = f.readOffset() | f.readOffset() << 32; long PtrsOffset = f.readOffset() | f.readOffset() << 32; Console.WriteLine($"ParentOffset {ParentOffset} PtrsOffset {PtrsOffset}"); f.seek((int)PtrsOffset + ExternalFiles.DataOffset); long dataOff = f.readOffset() | f.readOffset() << 32; surf.data = f.getSection((int)dataOff + ExternalFiles.DataOffset, surf.imageSize); //Console.WriteLine(surf.data.Length + " " + dataOff.ToString("x") + " " + surf.imageSize); uint blk_dim = Formats.blk_dims(surf.format >> 8); uint blkWidth = blk_dim >> 4; uint blkHeight = blk_dim & 0xF; uint bpp = Formats.bpps(surf.format >> 8); Console.WriteLine($"{Text} 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); byte[] result_ = new byte[width * height * bpp]; Array.Copy(result, 0, result_, 0, width * height * bpp); tex.mipmaps.Add(result_); tex.width = surf.width; tex.height = surf.height; //File.WriteAllBytes(dataOff.ToString("x") + ".bin" ,data); PropertyGridSimpleDemoClass propgrid = new PropertyGridSimpleDemoClass(); switch (surf.format >> 8) { case ((uint)Formats.BNTXImageFormat.IMAGE_FORMAT_BC1): if (DataType == (byte)Formats.BNTXImageTypes.UNORM) { tex.type = PixelInternalFormat.CompressedRgbaS3tcDxt1Ext; propgrid.Format = "FORMAT_T_BC1_UNORM"; } else if (DataType == (byte)Formats.BNTXImageTypes.SRGB) { tex.type = PixelInternalFormat.CompressedSrgbAlphaS3tcDxt1Ext; propgrid.Format = "FORMAT_T_BC1_SRGB"; } else { throw new Exception("Unsupported data type"); } break; case ((uint)Formats.BNTXImageFormat.IMAGE_FORMAT_BC2): if (DataType == (byte)Formats.BNTXImageTypes.UNORM) { tex.type = PixelInternalFormat.CompressedRgbaS3tcDxt3Ext; } else if (DataType == (byte)Formats.BNTXImageTypes.SRGB) { tex.type = PixelInternalFormat.CompressedSrgbAlphaS3tcDxt3Ext; } else { throw new Exception("Unsupported data type"); } break; case ((uint)Formats.BNTXImageFormat.IMAGE_FORMAT_BC3): if (DataType == (byte)Formats.BNTXImageTypes.UNORM) { tex.type = PixelInternalFormat.CompressedRgbaS3tcDxt5Ext; propgrid.Format = "FORMAT_T_BC3_UNORM"; } else if (DataType == (byte)Formats.BNTXImageTypes.SRGB) { tex.type = PixelInternalFormat.CompressedSrgbAlphaS3tcDxt5Ext; propgrid.Format = "FORMAT_T_BC3_SRGB"; } else { throw new Exception("Unsupported data type"); } break; case ((uint)Formats.BNTXImageFormat.IMAGE_FORMAT_BC4): if (DataType == (byte)Formats.BNTXImageTypes.UNORM) { tex.type = PixelInternalFormat.CompressedRedRgtc1; propgrid.Format = "FORMAT_T_BC4_UNORM"; } else if (DataType == (byte)Formats.BNTXImageTypes.SNORM) { tex.type = PixelInternalFormat.CompressedSignedRedRgtc1; propgrid.Format = "FORMAT_T_BC4_SNORM"; } else { throw new Exception("Unsupported data type"); } break; case ((uint)Formats.BNTXImageFormat.IMAGE_FORMAT_BC5): if (DataType == (byte)Formats.BNTXImageTypes.UNORM) { tex.type = PixelInternalFormat.CompressedRedRgtc1; propgrid.Format = "FORMAT_T_BC5_UNORM"; } else if (DataType == (byte)Formats.BNTXImageTypes.SNORM) { tex.type = PixelInternalFormat.CompressedSignedRedRgtc1; propgrid.Format = "FORMAT_T_BC5_SNORM"; } else { Console.WriteLine("Unsupported data type"); } break; case ((uint)Formats.BNTXImageFormat.IMAGE_FORMAT_R8_G8_B8_A8): if (DataType == (byte)Formats.BNTXImageTypes.UNORM || DataType == (byte)Formats.BNTXImageTypes.SRGB) { tex.type = PixelInternalFormat.Rgba; tex.utype = OpenTK.Graphics.OpenGL.PixelFormat.Rgba; } else { throw new Exception("Unsupported data type"); } break; default: MessageBox.Show($"Error! Unsupported texture type for {Text}", "Error"); break; } tex.load(); //Property grid stuff }