public static B3DFile OpenFile(string filePath) { using (BinaryReader reader = new BinaryReader(File.OpenRead(filePath))) { if (!reader.ReadBytes(4).SequenceEqual(B3DHeader)) { throw new InvalidDataException($"File is not b3d!"); } B3DFile file = new B3DFile(); //Skipped unused information //TODO: is it really unused??? reader.BaseStream.Seek(4, SeekOrigin.Current); uint materialListOffset = reader.ReadUInt32(); reader.BaseStream.Seek(4, SeekOrigin.Current); uint dataOffset = reader.ReadUInt32(); //Read materials //Jump to material definition reader.BaseStream.Seek(materialListOffset * 4, SeekOrigin.Begin); uint materialLibrarySize = reader.ReadUInt32(); file.MaterialLibrary = new List <string>(); for (uint i = 0; i < materialLibrarySize; i++) { file.MaterialLibrary.Add(reader.Read32ByteString()); } //Read Data //Jump to data definition reader.BaseStream.Seek(dataOffset * 4, SeekOrigin.Begin); if (reader.ReadUInt32() == (int)Identifier.Chunk_Start) { file.Nodes = new List <INode>(); uint ident; while ((ident = reader.ReadUInt32()) != (int)Identifier.Chunk_End) { //if(ident == 444) continue; // Unused??? if (ident == (int)Identifier.Block_Start) { NodeHeader header = reader.Read <NodeHeader>(); INode node = BaseNode.GetNode(header); node.Read(reader); file.Nodes.Add(node); } } } return(file); } throw new NotImplementedException(); }
private unsafe static void RenderPage(Transaction tx, Page page, TextWriter sw, string text, bool open) { sw.WriteLine( "<ul><li><input type='checkbox' id='page-{0}' {3} /><label for='page-{0}'>{4}: Page {0:#,#;;0} - {1} - {2:#,#;;0} entries</label><ul>", page.PageNumber, page.IsLeaf ? "Leaf" : "Branch", page.NumberOfEntries, open ? "checked" : "", text); for (int i = 0; i < page.NumberOfEntries; i++) { var nodeHeader = page.GetNode(i); if (page.IsLeaf) { var key = new Slice(nodeHeader).ToString(); sw.Write("<li>{0} {1} - size: {2:#,#}</li>", key, nodeHeader->Flags, NodeHeader.GetDataSize(tx, nodeHeader)); } else { var key = new Slice(nodeHeader).ToString(); var pageNum = nodeHeader->PageNumber; if (i == 0) { key = "[smallest]"; } RenderPage(tx, tx.GetReadOnlyPage(pageNum), sw, key, false); } } sw.WriteLine("</ul></li></ul>"); }
public Node GetNode(NodeHeader node) { return(this.Find(x => x.Header.ID == node.ID)); }
public Node(NodeHeader header) { this.Header = header; }