private void Export(object sender, EventArgs args) { BNTX bn = this; SaveFileDialog sfd = new SaveFileDialog(); sfd.FileName = "textures.bntx"; sfd.Filter = "Supported Formats|*.bntx;|" + "All files(*.*)|*.*"; if (sfd.ShowDialog() == DialogResult.OK) { File.WriteAllBytes(sfd.FileName, BNTXFile); } }
private void Replace(object sender, EventArgs args) { BNTX bn = this; OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = "Supported Formats|*.bntx;|" + "All files(*.*)|*.*"; if (ofd.ShowDialog() == DialogResult.OK) { byte[] newBntx = File.ReadAllBytes(ofd.FileName); FileData f = new FileData(newBntx); f.Endian = Endianness.Little; bn.Nodes.Clear(); bn.Read(f); } }
public void Read(ResFile TargetSwitchBFRES, FileData f) { Nodes.Add(TModels); Nodes.Add(TMaterialAnim); Nodes.Add(TVisualAnim); Nodes.Add(TShapeAnim); Nodes.Add(TSceneAnim); Nodes.Add(TEmbedded); ImageKey = "bfres"; SelectedImageKey = "bfres"; FSKACount = TargetSwitchBFRES.SkeletalAnims.Count; FVISCount = TargetSwitchBFRES.BoneVisibilityAnims.Count; FMAACount = TargetSwitchBFRES.MaterialAnims.Count; Console.WriteLine("Name = " + TargetSwitchBFRES.Name); foreach (ExternalFile ext in TargetSwitchBFRES.ExternalFiles) { f = new FileData(ext.Data); f.Endian = Endianness.Little; string EmMagic = f.readString(f.pos(), 4); if (EmMagic.Equals("BNTX")) //Textures { int temp = f.pos(); BNTX t = new BNTX(); t.ReadBNTX(f); TEmbedded.Nodes.Add(t); } } int ModelCur = 0; //FMDLs -Models- foreach (Model mdl in TargetSwitchBFRES.Models) { FMDL_Model model = new FMDL_Model(); //This will store VBN data and stuff model.Text = mdl.Name; TModels.Nodes.Add(model); ReadSkeleton(model, mdl); model.skeleton.reset(); model.skeleton.update(); //MeshTime!! foreach (Shape shp in mdl.Shapes) { Mesh poly = new Mesh(); poly.Text = shp.Name; poly.MaterialIndex = shp.MaterialIndex; poly.matrFlag = shp.VertexSkinCount; poly.fsklindx = shp.BoneIndex; TModels.Nodes[ModelCur].Nodes.Add(poly); ReadVertexBuffer(mdl, shp, poly); // int LODCount = shp.Meshes.Count - 1; //For going to the lowest poly LOD mesh int LODCount = 0; uint FaceCount = FaceCount = shp.Meshes[LODCount].IndexCount; uint[] indicesArray = shp.Meshes[LODCount].GetIndices().ToArray(); poly.BoundingCount = shp.SubMeshBoundings.Count; for (int face = 0; face < FaceCount; face++) { poly.faces.Add((int)indicesArray[face] + (int)shp.Meshes[LODCount].FirstVertex); } foreach (Bounding bnd in shp.SubMeshBoundings) { Mesh.BoundingBox box = new Mesh.BoundingBox(); box.Center = new Vector3(bnd.Center.X, bnd.Center.Y, bnd.Center.Z); box.Extent = new Vector3(bnd.Extent.X, bnd.Extent.Y, bnd.Extent.Z); poly.boundingBoxes.Add(box); //Each box is by LOD mesh. This will be in a seperate class later so only one will be added } foreach (float r in shp.RadiusArray) { poly.radius.Add(r); } // Read materials Material mat = mdl.Materials[shp.MaterialIndex]; poly.material.Name = mat.Name; ReadTextureRefs(mat, poly); ReadShaderParams(mat, poly); ReadRenderInfo(mat, poly); foreach (Sampler smp in mdl.Materials[shp.MaterialIndex].Samplers) { SamplerInfo s = new SamplerInfo(); s.WrapModeU = (int)smp.WrapModeU; s.WrapModeV = (int)smp.WrapModeV; s.WrapModeW = (int)smp.WrapModeW; poly.material.samplerinfo.Add(s); } model.poly.Add(poly); } models.Add(model); ModelCur++; } }
public void Read(FileData f, BNTX bntx) //Docs thanks to AboodXD!! { ImageKey = "texture"; SelectedImageKey = "texture"; f.skip(4); int BRTISize1 = f.readInt(); long BRTISize2 = f.readInt64(); surf = new TegraX1Swizzle.Surface(); ushort Flags = (ushort)f.readShort(); surf.dim = (sbyte)f.readByte(); surf.tileMode = (sbyte)f.readByte(); surf.swizzle = (ushort)f.readShort(); surf.numMips = (ushort)f.readShort(); uint numSamples = (uint)f.readInt(); surf.format = (uint)f.readInt(); DataType = (byte)(surf.format & 0xFF); uint accessFlags = (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((int)f.readInt64() + BNTX.temp + 2, -1); long ParentOffset = f.readInt64(); long PtrsOffset = f.readInt64(); format = surf.format; surf.data = new List <byte[]>(); uint blk_dim = Formats.blk_dims(surf.format >> 8); blkWidth = blk_dim >> 4; blkHeight = blk_dim & 0xF; f.seek((int)PtrsOffset + BNTX.temp); long firstMipOffset = f.readInt64(); surf.data.Add(f.getSection((int)firstMipOffset + BNTX.temp, surf.imageSize)); for (int mipLevel = 1; mipLevel < surf.numMips; mipLevel++) { long dataOff = f.readInt64(); surf.data.Add(f.getSection((int)dataOff + BNTX.temp, (int)firstMipOffset + surf.imageSize - (int)dataOff)); // Debug.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}"); } bpp = Formats.bpps(surf.format >> 8); int target = 0; if (bntx.target == "NX ") { target = 1; } int blockHeightLog2 = surf.sizeRange & 7; int linesPerBlockHeight = (1 << blockHeightLog2) * 8; int blockHeightShift = 0; for (int mipLevel = 0; mipLevel < surf.numMips; mipLevel++) { uint width = (uint)Math.Max(1, surf.width >> mipLevel); uint height = (uint)Math.Max(1, surf.height >> mipLevel); uint size = TegraX1Swizzle.DIV_ROUND_UP(width, blkWidth) * TegraX1Swizzle.DIV_ROUND_UP(height, blkHeight) * bpp; if (TegraX1Swizzle.pow2_round_up(TegraX1Swizzle.DIV_ROUND_UP(height, blkWidth)) < linesPerBlockHeight) { blockHeightShift += 1; } byte[] result = TegraX1Swizzle.deswizzle(width, height, blkWidth, blkHeight, target, bpp, (uint)surf.tileMode, (uint)surf.alignment, Math.Max(0, blockHeightLog2 - blockHeightShift), surf.data[mipLevel], 0); //Create a copy and use that to remove uneeded data result_ = new byte[size]; Array.Copy(result, 0, result_, 0, size); texture.mipmaps.Add(result_); } LoadFormats(texture, surf.format, 0, surf.width, surf.height); texture.width = surf.width; texture.height = surf.height; Width = surf.width; Height = surf.height; }
public BNTXEditor(BNTX bntx) : this() { SelectBNTX(bntx); }
public void SelectBNTX(BNTX b) { BNTX = b; FillForm(); }